blob: 2b8e3ea51f89ba9b6769101d2493e1bcecff5177 [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 Rossum5c9eb211999-08-20 18:21:51 +000038- socket.inet_aton(IP address) -> 32-bit packed IP representation
39- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000040- socket.getdefaulttimeout() -> None | float
41- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000042- an Internet socket address is a pair (hostname, port)
43 where hostname can be anything recognized by gethostbyname()
44 (including the dd.dd.dd.dd notation) and port is in host byte order
45- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000046- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000047- an AF_PACKET socket address is a tuple containing a string
48 specifying the ethernet interface and an integer specifying
49 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000050 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
51 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000052 networking code, but accepted since they are returned by the
53 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000054
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000055Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000056
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000057- names starting with sock_ are socket object methods
58- names starting with socket_ are module-level functions
59- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000060
Guido van Rossum6574b3e1991-06-25 21:36:08 +000061*/
62
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000063#include "Python.h"
64
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000065/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000066PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000067"socket([family[, type[, proto]]]) -> socket object\n\
68\n\
69Open a socket of the given type. The family argument specifies the\n\
70address family; it defaults to AF_INET. The type argument specifies\n\
71whether this is a stream (SOCK_STREAM, this is the default)\n\
72or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
73specifying the default protocol. Keyword arguments are accepted.\n\
74\n\
75A socket object represents one endpoint of a network connection.\n\
76\n\
77Methods of socket objects (keyword arguments not allowed):\n\
78\n\
79accept() -- accept a connection, returning new socket and client address\n\
80bind(addr) -- bind the socket to a local address\n\
81close() -- close the socket\n\
82connect(addr) -- connect the socket to a remote address\n\
83connect_ex(addr) -- connect, return an error code instead of an exception\n\
84dup() -- return a new socket object identical to the current one [*]\n\
85fileno() -- return underlying file descriptor\n\
86getpeername() -- return remote address [*]\n\
87getsockname() -- return local address\n\
88getsockopt(level, optname[, buflen]) -- get socket options\n\
89gettimeout() -- return timeout or None\n\
90listen(n) -- start listening for incoming connections\n\
91makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
92recv(buflen[, flags]) -- receive data\n\
93recvfrom(buflen[, flags]) -- receive data and sender's address\n\
94sendall(data[, flags]) -- send all data\n\
95send(data[, flags]) -- send data, may not send all of it\n\
96sendto(data[, flags], addr) -- send data to a given address\n\
97setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
98setsockopt(level, optname, value) -- set socket options\n\
99settimeout(None | float) -- set or clear the timeout\n\
100shutdown(how) -- shut down traffic in one or both directions\n\
101\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000103
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000104/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
105 I hope some day someone can clean this up please... */
106
Guido van Rossum9376b741999-09-15 22:01:40 +0000107/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
108 script doesn't get this right, so we hardcode some platform checks below.
109 On the other hand, not all Linux versions agree, so there the settings
110 computed by the configure script are needed! */
111
112#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000113# undef HAVE_GETHOSTBYNAME_R_3_ARG
114# undef HAVE_GETHOSTBYNAME_R_5_ARG
115# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000116#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000117
Guido van Rossum7a122991999-04-13 04:07:32 +0000118#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000119# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000120#endif
121
Guido van Rossume7de2061999-03-24 17:24:33 +0000122#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000123# if defined(_AIX) || defined(__osf__)
124# define HAVE_GETHOSTBYNAME_R_3_ARG
125# elif defined(__sun) || defined(__sgi)
126# define HAVE_GETHOSTBYNAME_R_5_ARG
127# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000128/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000129# else
130# undef HAVE_GETHOSTBYNAME_R
131# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000132#endif
133
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000134#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
135 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000136# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000137#endif
138
139#ifdef USE_GETHOSTBYNAME_LOCK
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000141#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000142
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000143#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000144# include <types.h>
145# include <io.h>
146# include <sys/ioctl.h>
147# include <utils.h>
148# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000149#endif
150
Martin v. Löwis9e437302002-12-06 12:57:26 +0000151#if defined(__VMS)
152#if ! defined(_SOCKADDR_LEN)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000153# ifdef getaddrinfo
154# undef getaddrinfo
155# endif
156# include "TCPIP_IOCTL_ROUTINE"
157#else
158# include <ioctl.h>
159#endif
Martin v. Löwis9e437302002-12-06 12:57:26 +0000160#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000161
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000162#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163# define INCL_DOS
164# define INCL_DOSERRORS
165# define INCL_NOPMAPI
166# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000167#endif
168
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000169#if defined(__sgi)&&_COMPILER_VERSION>700 && !_SGIAPI
170/* make sure that the reentrant (gethostbyaddr_r etc)
171 functions are declared correctly if compiling with
172 MIPSPro 7.x in ANSI C mode (default) */
173#define _SGIAPI 1
174#include "netdb.h"
175#endif
176
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000179#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000180
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000181/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000182#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000183#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000184
185/* Addressing includes */
186
Guido van Rossum6f489d91996-06-28 20:15:15 +0000187#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000188
189/* Non-MS WINDOWS includes */
190# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000191
Guido van Rossum9376b741999-09-15 22:01:40 +0000192/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000193# ifdef __BEOS__
194# include <net/netdb.h>
195# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
196# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000197typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000198# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000199# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000200# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000201
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000202# ifndef RISCOS
203# include <fcntl.h>
204# else
205# include <sys/fcntl.h>
206# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000207int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208# endif
209
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000210#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000211
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000212/* MS_WINDOWS includes */
213# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000214
Jeremy Hylton22308652001-02-02 03:23:09 +0000215#endif
216
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000217#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000218# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000219#endif
220
221#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000222# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000223#endif
224
Neal Norwitz39d22e52002-11-02 19:55:21 +0000225#ifndef O_NONBLOCK
226# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000227#endif
228
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000229#include "addrinfo.h"
230
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000231#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000232int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000233const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000234#endif
235
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000236#ifdef __APPLE__
237/* On OS X, getaddrinfo returns no error indication of lookup
238 failure, so we must use the emulation instead of the libinfo
239 implementation. Unfortunately, performing an autoconf test
240 for this bug would require DNS access for the machine performing
241 the configuration, which is not acceptable. Therefore, we
242 determine the bug just by checking for __APPLE__. If this bug
243 gets ever fixed, perhaps checking for sys/version.h would be
244 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000245#ifndef HAVE_GETNAMEINFO
246/* This bug seems to be fixed in Jaguar. Ths easiest way I could
247 Find to check for Jaguar is that it has getnameinfo(), which
248 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000249#undef HAVE_GETADDRINFO
250/* avoid clashes with the C library definition of the symbol. */
251#define getaddrinfo fake_getaddrinfo
252#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000253#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000254
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000255/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000256#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000257#include "getaddrinfo.c"
258#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000259#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000260#include "getnameinfo.c"
261#endif
262
Guido van Rossumbcc20741998-08-04 22:53:56 +0000263#if defined(MS_WINDOWS) || defined(__BEOS__)
264/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000265/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000266#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000267#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000268#endif
269
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000270#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000271#define EAFNOSUPPORT WSAEAFNOSUPPORT
272#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000273#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000274
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000275#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000276#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000277#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000278#endif
279
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000280#ifndef SOCKETCLOSE
281#define SOCKETCLOSE close
282#endif
283
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000284#ifdef __VMS
285/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
286#define SEGMENT_SIZE 65535
287#endif
288
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000289/* XXX There's a problem here: *static* functions are not supposed to have
290 a Py prefix (or use CapitalizedWords). Later... */
291
Guido van Rossum30a685f1991-06-27 15:51:29 +0000292/* Global variable holding the exception type for errors detected
293 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000294static PyObject *socket_error;
295static PyObject *socket_herror;
296static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000297
Guido van Rossum48a680c2001-03-02 06:34:14 +0000298#ifdef RISCOS
299/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
300static int taskwindow;
301#endif
302
Tim Peters643a7fc2002-02-17 04:13:21 +0000303/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000304 The sock_type variable contains pointers to various functions,
305 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000306 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000307static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000308
Guido van Rossum30a685f1991-06-27 15:51:29 +0000309/* Convenience function to raise an error according to errno
310 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000311
Guido van Rossum73624e91994-10-10 17:59:00 +0000312static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000313set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000314{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000315#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000316 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000317 static struct {
318 int no;
319 const char *msg;
320 } *msgp, msgs[] = {
321 {WSAEINTR, "Interrupted system call"},
322 {WSAEBADF, "Bad file descriptor"},
323 {WSAEACCES, "Permission denied"},
324 {WSAEFAULT, "Bad address"},
325 {WSAEINVAL, "Invalid argument"},
326 {WSAEMFILE, "Too many open files"},
327 {WSAEWOULDBLOCK,
328 "The socket operation could not complete "
329 "without blocking"},
330 {WSAEINPROGRESS, "Operation now in progress"},
331 {WSAEALREADY, "Operation already in progress"},
332 {WSAENOTSOCK, "Socket operation on non-socket"},
333 {WSAEDESTADDRREQ, "Destination address required"},
334 {WSAEMSGSIZE, "Message too long"},
335 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
336 {WSAENOPROTOOPT, "Protocol not available"},
337 {WSAEPROTONOSUPPORT, "Protocol not supported"},
338 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
339 {WSAEOPNOTSUPP, "Operation not supported"},
340 {WSAEPFNOSUPPORT, "Protocol family not supported"},
341 {WSAEAFNOSUPPORT, "Address family not supported"},
342 {WSAEADDRINUSE, "Address already in use"},
343 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
344 {WSAENETDOWN, "Network is down"},
345 {WSAENETUNREACH, "Network is unreachable"},
346 {WSAENETRESET, "Network dropped connection on reset"},
347 {WSAECONNABORTED, "Software caused connection abort"},
348 {WSAECONNRESET, "Connection reset by peer"},
349 {WSAENOBUFS, "No buffer space available"},
350 {WSAEISCONN, "Socket is already connected"},
351 {WSAENOTCONN, "Socket is not connected"},
352 {WSAESHUTDOWN, "Can't send after socket shutdown"},
353 {WSAETOOMANYREFS, "Too many references: can't splice"},
354 {WSAETIMEDOUT, "Operation timed out"},
355 {WSAECONNREFUSED, "Connection refused"},
356 {WSAELOOP, "Too many levels of symbolic links"},
357 {WSAENAMETOOLONG, "File name too long"},
358 {WSAEHOSTDOWN, "Host is down"},
359 {WSAEHOSTUNREACH, "No route to host"},
360 {WSAENOTEMPTY, "Directory not empty"},
361 {WSAEPROCLIM, "Too many processes"},
362 {WSAEUSERS, "Too many users"},
363 {WSAEDQUOT, "Disc quota exceeded"},
364 {WSAESTALE, "Stale NFS file handle"},
365 {WSAEREMOTE, "Too many levels of remote in path"},
366 {WSASYSNOTREADY, "Network subsystem is unvailable"},
367 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
368 {WSANOTINITIALISED,
369 "Successful WSAStartup() not yet performed"},
370 {WSAEDISCON, "Graceful shutdown in progress"},
371 /* Resolver errors */
372 {WSAHOST_NOT_FOUND, "No such host is known"},
373 {WSATRY_AGAIN, "Host not found, or server failed"},
374 {WSANO_RECOVERY, "Unexpected server error encountered"},
375 {WSANO_DATA, "Valid name without requested data"},
376 {WSANO_ADDRESS, "No address, look for MX record"},
377 {0, NULL}
378 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000379 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000380 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000381 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000382
Mark Hammond46a733d2000-07-24 01:45:11 +0000383 for (msgp = msgs; msgp->msg; msgp++) {
384 if (err_no == msgp->no) {
385 msg = msgp->msg;
386 break;
387 }
388 }
389
390 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000391 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000392 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000393 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000394 }
395 return NULL;
396 }
397 else
398#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000399
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000400#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000401 if (sock_errno() != NO_ERROR) {
402 APIRET rc;
403 ULONG msglen;
404 char outbuf[100];
405 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000406
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000407 /* Retrieve socket-related error message from MPTN.MSG file */
408 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
409 myerrorcode - SOCBASEERR + 26,
410 "mptn.msg",
411 &msglen);
412 if (rc == NO_ERROR) {
413 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000414
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000415 /* OS/2 doesn't guarantee a terminator */
416 outbuf[msglen] = '\0';
417 if (strlen(outbuf) > 0) {
418 /* If non-empty msg, trim CRLF */
419 char *lastc = &outbuf[ strlen(outbuf)-1 ];
420 while (lastc > outbuf && isspace(*lastc)) {
421 /* Trim trailing whitespace (CRLF) */
422 *lastc-- = '\0';
423 }
424 }
425 v = Py_BuildValue("(is)", myerrorcode, outbuf);
426 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000427 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000428 Py_DECREF(v);
429 }
430 return NULL;
431 }
432 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000433#endif
434
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000435 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000436}
437
Guido van Rossum30a685f1991-06-27 15:51:29 +0000438
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000439static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000440set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000441{
442 PyObject *v;
443
444#ifdef HAVE_HSTRERROR
445 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
446#else
447 v = Py_BuildValue("(is)", h_error, "host not found");
448#endif
449 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000450 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000451 Py_DECREF(v);
452 }
453
454 return NULL;
455}
456
457
458static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000459set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000460{
461 PyObject *v;
462
Martin v. Löwis272cb402002-03-01 08:31:07 +0000463#ifdef EAI_SYSTEM
464 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000465 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000466 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000467#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000468
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000469#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000470 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000471#else
472 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
473#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000474 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000475 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000476 Py_DECREF(v);
477 }
478
479 return NULL;
480}
481
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000482/* Function to perform the setting of socket blocking mode
483 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000484static int
485internal_setblocking(PySocketSockObject *s, int block)
486{
487#ifndef RISCOS
488#ifndef MS_WINDOWS
489 int delay_flag;
490#endif
491#endif
492
493 Py_BEGIN_ALLOW_THREADS
494#ifdef __BEOS__
495 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000496 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
497 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000498#else
499#ifndef RISCOS
500#ifndef MS_WINDOWS
501#if defined(PYOS_OS2) && !defined(PYCC_GCC)
502 block = !block;
503 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000504#elif defined(__VMS)
505 block = !block;
506 ioctl(s->sock_fd, FIONBIO, (char *)&block);
507#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000508 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
509 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000510 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000511 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000512 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000513 fcntl(s->sock_fd, F_SETFL, delay_flag);
514#endif /* !PYOS_OS2 */
515#else /* MS_WINDOWS */
516 block = !block;
517 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
518#endif /* MS_WINDOWS */
519#endif /* __BEOS__ */
520#endif /* RISCOS */
521 Py_END_ALLOW_THREADS
522
523 /* Since these don't return anything */
524 return 1;
525}
526
Guido van Rossum11ba0942002-06-13 15:07:44 +0000527/* Do a select() on the socket, if necessary (sock_timeout > 0).
528 The argument writing indicates the direction.
529 This does not raise an exception or return a success indicator;
530 we'll let the actual socket call do that. */
531static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000532internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000533{
534 fd_set fds;
535 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000536
Guido van Rossumad654902002-07-19 12:44:59 +0000537 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000538 if (s->sock_timeout <= 0.0)
539 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000540
Guido van Rossumad654902002-07-19 12:44:59 +0000541 /* Guard against closed socket */
542 if (s->sock_fd < 0)
543 return;
544
Guido van Rossum67f7a382002-06-06 21:08:16 +0000545 /* Construct the arguments to select */
546 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000547 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000548 FD_ZERO(&fds);
549 FD_SET(s->sock_fd, &fds);
550
551 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000552 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000553 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000554 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000555 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000556}
557
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000558/* Initialize a new socket object. */
559
Tim Petersa12b4cf2002-07-18 22:38:44 +0000560static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000561
Mark Hammond62b1ab12002-07-23 06:31:15 +0000562PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000563init_sockobject(PySocketSockObject *s,
564 SOCKET_T fd, int family, int type, int proto)
565{
566#ifdef RISCOS
567 int block = 1;
568#endif
569 s->sock_fd = fd;
570 s->sock_family = family;
571 s->sock_type = type;
572 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000573 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000574
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000575 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000576
577 if (defaulttimeout >= 0.0)
578 internal_setblocking(s, 0);
579
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000580#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000581 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000582 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000583#endif
584}
585
586
Guido van Rossum30a685f1991-06-27 15:51:29 +0000587/* Create a new socket object.
588 This just creates the object and initializes it.
589 If the creation fails, return NULL and set an exception (implicit
590 in NEWOBJ()). */
591
Guido van Rossum73624e91994-10-10 17:59:00 +0000592static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000593new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000594{
Guido van Rossum73624e91994-10-10 17:59:00 +0000595 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000596 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000597 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000598 if (s != NULL)
599 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000600 return s;
601}
602
Guido van Rossum30a685f1991-06-27 15:51:29 +0000603
Guido van Rossum48a680c2001-03-02 06:34:14 +0000604/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000605 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000606#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000607PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000608#endif
609
610
Guido van Rossum30a685f1991-06-27 15:51:29 +0000611/* Convert a string specifying a host name or one of a few symbolic
612 names to a numeric IP address. This usually calls gethostbyname()
613 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000614 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000615 an error occurred; then an exception is raised. */
616
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000618setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000619{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000620 struct addrinfo hints, *res;
621 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000622
Guido van Rossuma376cc51996-12-05 23:43:35 +0000623 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000624 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000625 int siz;
626 memset(&hints, 0, sizeof(hints));
627 hints.ai_family = af;
628 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
629 hints.ai_flags = AI_PASSIVE;
630 error = getaddrinfo(NULL, "0", &hints, &res);
631 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000632 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000633 return -1;
634 }
635 switch (res->ai_family) {
636 case AF_INET:
637 siz = 4;
638 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000639#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000640 case AF_INET6:
641 siz = 16;
642 break;
643#endif
644 default:
645 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000646 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000647 "unsupported address family");
648 return -1;
649 }
650 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000651 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000652 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000653 "wildcard resolved to multiple address");
654 return -1;
655 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000656 if (res->ai_addrlen < addr_ret_size)
657 addr_ret_size = res->ai_addrlen;
658 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000659 freeaddrinfo(res);
660 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000661 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000662 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000663 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000664 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000665 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000666 "address family mismatched");
667 return -1;
668 }
669 sin = (struct sockaddr_in *)addr_ret;
670 memset((void *) sin, '\0', sizeof(*sin));
671 sin->sin_family = AF_INET;
672#ifdef HAVE_SOCKADDR_SA_LEN
673 sin->sin_len = sizeof(*sin);
674#endif
675 sin->sin_addr.s_addr = INADDR_BROADCAST;
676 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000677 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000678 memset(&hints, 0, sizeof(hints));
679 hints.ai_family = af;
680 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000681#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000682 if (error == EAI_NONAME && af == AF_UNSPEC) {
683 /* On Tru64 V5.1, numeric-to-addr conversion fails
684 if no address family is given. Assume IPv4 for now.*/
685 hints.ai_family = AF_INET;
686 error = getaddrinfo(name, NULL, &hints, &res);
687 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000688#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000689 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000690 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000691 return -1;
692 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000693 if (res->ai_addrlen < addr_ret_size)
694 addr_ret_size = res->ai_addrlen;
695 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000696 freeaddrinfo(res);
697 switch (addr_ret->sa_family) {
698 case AF_INET:
699 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000700#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000701 case AF_INET6:
702 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000703#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000704 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000705 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000706 return -1;
707 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000708}
709
Guido van Rossum30a685f1991-06-27 15:51:29 +0000710
Guido van Rossum30a685f1991-06-27 15:51:29 +0000711/* Create a string object representing an IP address.
712 This is always a string of the form 'dd.dd.dd.dd' (with variable
713 size numbers). */
714
Guido van Rossum73624e91994-10-10 17:59:00 +0000715static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000716makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000717{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000718 char buf[NI_MAXHOST];
719 int error;
720
721 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
722 NI_NUMERICHOST);
723 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000724 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000725 return NULL;
726 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000727 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000728}
729
730
731/* Create an object representing the given socket address,
732 suitable for passing it back to bind(), connect() etc.
733 The family field of the sockaddr structure is inspected
734 to determine what kind of address it really is. */
735
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000736/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000737static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000738makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000739{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000740 if (addrlen == 0) {
741 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000742 Py_INCREF(Py_None);
743 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000744 }
745
Guido van Rossumbcc20741998-08-04 22:53:56 +0000746#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000747 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000748 addr->sa_family = AF_INET;
749#endif
750
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751 switch (addr->sa_family) {
752
753 case AF_INET:
754 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000755 struct sockaddr_in *a;
756 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000757 PyObject *ret = NULL;
758 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000759 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000760 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
761 Py_DECREF(addrobj);
762 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000763 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000764 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000765
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000766#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767 case AF_UNIX:
768 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000770 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000771 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000772#endif /* AF_UNIX */
773
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000774#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000775 case AF_INET6:
776 {
777 struct sockaddr_in6 *a;
778 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
779 PyObject *ret = NULL;
780 if (addrobj) {
781 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000782 ret = Py_BuildValue("Oiii",
783 addrobj,
784 ntohs(a->sin6_port),
785 a->sin6_flowinfo,
786 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000787 Py_DECREF(addrobj);
788 }
789 return ret;
790 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000791#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000792
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000793#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000794 case AF_PACKET:
795 {
796 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
797 char *ifname = "";
798 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000799 /* need to look up interface name give index */
800 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000801 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000802 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000803 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000804 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000805 return Py_BuildValue("shbhs#",
806 ifname,
807 ntohs(a->sll_protocol),
808 a->sll_pkttype,
809 a->sll_hatype,
810 a->sll_addr,
811 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000812 }
813#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000814
Guido van Rossum30a685f1991-06-27 15:51:29 +0000815 /* More cases here... */
816
817 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000818 /* If we don't know the address family, don't raise an
819 exception -- return it as a tuple. */
820 return Py_BuildValue("is#",
821 addr->sa_family,
822 addr->sa_data,
823 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000824
Guido van Rossum30a685f1991-06-27 15:51:29 +0000825 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826}
827
Guido van Rossum30a685f1991-06-27 15:51:29 +0000828
829/* Parse a socket address argument according to the socket object's
830 address family. Return 1 if the address was in the proper format,
831 0 of not. The address is returned through addr_ret, its length
832 through len_ret. */
833
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000835getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000836 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000837{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838 switch (s->sock_family) {
839
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000840#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841 case AF_UNIX:
842 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000843 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000844 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000845 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000846 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000847 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000848 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000849 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000850 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000851 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000852 return 0;
853 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000854 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000855 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000856 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000857 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000858 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859 return 1;
860 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000861#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000862
Guido van Rossum30a685f1991-06-27 15:51:29 +0000863 case AF_INET:
864 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000865 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000866 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000867 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000868 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000869 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000870 PyErr_Format(
871 PyExc_TypeError,
872 "getsockaddrarg: "
873 "AF_INET address must be tuple, not %.500s",
874 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000875 return 0;
876 }
877 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000878 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000879 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000880 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000881 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000882 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000883 *addr_ret = (struct sockaddr *) addr;
884 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000885 return 1;
886 }
887
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000888#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000889 case AF_INET6:
890 {
891 struct sockaddr_in6* addr;
892 char *host;
893 int port, flowinfo, scope_id;
894 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
895 flowinfo = scope_id = 0;
896 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000897 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000898 return 0;
899 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000900 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000901 return 0;
902 addr->sin6_family = s->sock_family;
903 addr->sin6_port = htons((short)port);
904 addr->sin6_flowinfo = flowinfo;
905 addr->sin6_scope_id = scope_id;
906 *addr_ret = (struct sockaddr *) addr;
907 *len_ret = sizeof *addr;
908 return 1;
909 }
910#endif
911
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000912#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000913 case AF_PACKET:
914 {
915 struct sockaddr_ll* addr;
916 struct ifreq ifr;
917 char *interfaceName;
918 int protoNumber;
919 int hatype = 0;
920 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000921 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000922
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000923 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
924 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000925 return 0;
926 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
927 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000928 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000929 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000930 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000931 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000932 addr = &(s->sock_addr.ll);
933 addr->sll_family = AF_PACKET;
934 addr->sll_protocol = htons((short)protoNumber);
935 addr->sll_ifindex = ifr.ifr_ifindex;
936 addr->sll_pkttype = pkttype;
937 addr->sll_hatype = hatype;
938 *addr_ret = (struct sockaddr *) addr;
939 *len_ret = sizeof *addr;
940 return 1;
941 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000942#endif
943
Guido van Rossum30a685f1991-06-27 15:51:29 +0000944 /* More cases here... */
945
946 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000947 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000948 return 0;
949
950 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951}
952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953
Guido van Rossum48a680c2001-03-02 06:34:14 +0000954/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000955 Return 1 if the family is known, 0 otherwise. The length is returned
956 through len_ret. */
957
958static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000959getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000960{
961 switch (s->sock_family) {
962
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000963#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000964 case AF_UNIX:
965 {
966 *len_ret = sizeof (struct sockaddr_un);
967 return 1;
968 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000969#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000970
971 case AF_INET:
972 {
973 *len_ret = sizeof (struct sockaddr_in);
974 return 1;
975 }
976
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000977#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000978 case AF_INET6:
979 {
980 *len_ret = sizeof (struct sockaddr_in6);
981 return 1;
982 }
983#endif
984
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000985#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000986 case AF_PACKET:
987 {
988 *len_ret = sizeof (struct sockaddr_ll);
989 return 1;
990 }
991#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000992
Guido van Rossum710e1df1992-06-12 10:39:36 +0000993 /* More cases here... */
994
995 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000996 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000997 return 0;
998
999 }
1000}
1001
1002
Guido van Rossum30a685f1991-06-27 15:51:29 +00001003/* s.accept() method */
1004
Guido van Rossum73624e91994-10-10 17:59:00 +00001005static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001006sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001007{
1008 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001009 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001010 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001011 PyObject *sock = NULL;
1012 PyObject *addr = NULL;
1013 PyObject *res = NULL;
1014
Guido van Rossum710e1df1992-06-12 10:39:36 +00001015 if (!getsockaddrlen(s, &addrlen))
1016 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001017 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001018
Guido van Rossum73624e91994-10-10 17:59:00 +00001019 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001020 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001021 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001022 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001023
Fred Drakea04eaad2000-06-30 02:46:07 +00001024#ifdef MS_WINDOWS
1025 if (newfd == INVALID_SOCKET)
1026#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001027 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001028#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001029 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001030
Guido van Rossum30a685f1991-06-27 15:51:29 +00001031 /* Create the new object with unspecified family,
1032 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001033 sock = (PyObject *) new_sockobject(newfd,
1034 s->sock_family,
1035 s->sock_type,
1036 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001037
Barry Warsaw752300b1997-01-03 17:18:10 +00001038 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001039 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001040 goto finally;
1041 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001042 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001043 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001044 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001045 goto finally;
1046
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001047 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001048
Guido van Rossum67f7a382002-06-06 21:08:16 +00001049finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001050 Py_XDECREF(sock);
1051 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001052 return res;
1053}
1054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001055PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001056"accept() -> (socket object, address info)\n\
1057\n\
1058Wait for an incoming connection. Return a new socket representing the\n\
1059connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001060info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001061
Guido van Rossum11ba0942002-06-13 15:07:44 +00001062/* s.setblocking(flag) method. Argument:
1063 False -- non-blocking mode; same as settimeout(0)
1064 True -- blocking mode; same as settimeout(None)
1065*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001066
Guido van Rossum73624e91994-10-10 17:59:00 +00001067static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001068sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001069{
1070 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001071
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001072 block = PyInt_AsLong(arg);
1073 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001074 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001075
Guido van Rossum11ba0942002-06-13 15:07:44 +00001076 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001077 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001078
Guido van Rossum73624e91994-10-10 17:59:00 +00001079 Py_INCREF(Py_None);
1080 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001081}
Guido van Rossume4485b01994-09-07 14:32:49 +00001082
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001083PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001084"setblocking(flag)\n\
1085\n\
1086Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001087setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001088setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001089
Guido van Rossum11ba0942002-06-13 15:07:44 +00001090/* s.settimeout(timeout) method. Argument:
1091 None -- no timeout, blocking mode; same as setblocking(True)
1092 0.0 -- non-blocking mode; same as setblocking(False)
1093 > 0 -- timeout mode; operations time out after timeout seconds
1094 < 0 -- illegal; raises an exception
1095*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001096static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001097sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001098{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001099 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001100
1101 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001102 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001103 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001104 timeout = PyFloat_AsDouble(arg);
1105 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001106 if (!PyErr_Occurred())
1107 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001108 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001109 return NULL;
1110 }
1111 }
1112
Guido van Rossum11ba0942002-06-13 15:07:44 +00001113 s->sock_timeout = timeout;
1114 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001115
1116 Py_INCREF(Py_None);
1117 return Py_None;
1118}
1119
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001120PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001121"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001122\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001123Set a timeout on socket operations. 'timeout' can be a float,\n\
1124giving in seconds, or None. Setting a timeout of None disables\n\
1125the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001126Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001127
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001128/* s.gettimeout() method.
1129 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001130static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001131sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001132{
1133 if (s->sock_timeout < 0.0) {
1134 Py_INCREF(Py_None);
1135 return Py_None;
1136 }
1137 else
1138 return PyFloat_FromDouble(s->sock_timeout);
1139}
1140
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001141PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001142"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001143\n\
1144Returns the timeout in floating seconds associated with socket \n\
1145operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001146operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001147
Guido van Rossum48a680c2001-03-02 06:34:14 +00001148#ifdef RISCOS
1149/* s.sleeptaskw(1 | 0) method */
1150
1151static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001152sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001153{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001154 int block;
1155 int delay_flag;
1156 if (!PyArg_Parse(args, "i", &block))
1157 return NULL;
1158 Py_BEGIN_ALLOW_THREADS
1159 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1160 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001161
Guido van Rossum67f7a382002-06-06 21:08:16 +00001162 Py_INCREF(Py_None);
1163 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001164}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001165PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001166"sleeptaskw(flag)\n\
1167\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001168Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001169#endif
1170
1171
Guido van Rossumaee08791992-09-08 09:05:33 +00001172/* s.setsockopt() method.
1173 With an integer third argument, sets an integer option.
1174 With a string third argument, sets an option from a buffer;
1175 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001176
Guido van Rossum73624e91994-10-10 17:59:00 +00001177static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001178sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001179{
1180 int level;
1181 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001182 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001183 char *buf;
1184 int buflen;
1185 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001186
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001187 if (PyArg_ParseTuple(args, "iii:setsockopt",
1188 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001189 buf = (char *) &flag;
1190 buflen = sizeof flag;
1191 }
1192 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001193 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001194 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1195 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001196 return NULL;
1197 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001198 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001199 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001200 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001201 Py_INCREF(Py_None);
1202 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001203}
1204
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001205PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001206"setsockopt(level, option, value)\n\
1207\n\
1208Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001209The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001210
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001211
Guido van Rossumaee08791992-09-08 09:05:33 +00001212/* s.getsockopt() method.
1213 With two arguments, retrieves an integer option.
1214 With a third integer argument, retrieves a string buffer of that size;
1215 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001216
Guido van Rossum73624e91994-10-10 17:59:00 +00001217static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001218sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001219{
1220 int level;
1221 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001222 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001224 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001225
Guido van Rossumbcc20741998-08-04 22:53:56 +00001226#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001227 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001228 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001229 return NULL;
1230#else
1231
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001232 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1233 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001234 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001235
Guido van Rossumbe32c891996-06-20 16:25:29 +00001236 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001237 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001238 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001239 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001240 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001241 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001242 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001243 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001244 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001245#ifdef __VMS
1246 if (buflen > 1024) {
1247#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001248 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001249#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001250 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001251 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001252 return NULL;
1253 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001254 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001255 if (buf == NULL)
1256 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001257 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001258 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001259 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001260 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001261 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001262 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001263 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001264 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001265#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001266}
1267
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001268PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001269"getsockopt(level, option[, buffersize]) -> value\n\
1270\n\
1271Get a socket option. See the Unix manual for level and option.\n\
1272If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001273string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001274
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001275
Fred Drake728819a2000-07-01 03:40:12 +00001276/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001277
Guido van Rossum73624e91994-10-10 17:59:00 +00001278static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001279sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001280{
1281 struct sockaddr *addr;
1282 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001283 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001284
Fred Drake728819a2000-07-01 03:40:12 +00001285 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001287 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001288 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001289 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001290 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001291 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001292 Py_INCREF(Py_None);
1293 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001294}
1295
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001296PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001297"bind(address)\n\
1298\n\
1299Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001300pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001301sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001302
Guido van Rossum30a685f1991-06-27 15:51:29 +00001303
1304/* s.close() method.
1305 Set the file descriptor to -1 so operations tried subsequently
1306 will surely fail. */
1307
Guido van Rossum73624e91994-10-10 17:59:00 +00001308static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001309sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001310{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001311 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001312
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001313 if ((fd = s->sock_fd) != -1) {
1314 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001315 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001316 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001317 Py_END_ALLOW_THREADS
1318 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001319 Py_INCREF(Py_None);
1320 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001321}
1322
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001323PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001324"close()\n\
1325\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001326Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001327
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001328static int
1329internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1330{
1331 int res;
1332
1333 res = connect(s->sock_fd, addr, addrlen);
1334
1335#ifdef MS_WINDOWS
1336
1337 if (s->sock_timeout > 0.0) {
1338 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001339 /* This is a mess. Best solution: trust select */
1340 fd_set fds;
1341 struct timeval tv;
1342 tv.tv_sec = (int)s->sock_timeout;
1343 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1344 FD_ZERO(&fds);
1345 FD_SET(s->sock_fd, &fds);
1346 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1347 if (res == 0)
1348 res = WSAEWOULDBLOCK;
1349 else if (res > 0)
1350 res = 0;
1351 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001352 }
1353 }
1354
1355 if (res < 0)
1356 res = WSAGetLastError();
1357
1358#else
1359
1360 if (s->sock_timeout > 0.0) {
1361 if (res < 0 && errno == EINPROGRESS) {
1362 internal_select(s, 1);
1363 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001364 if (res < 0 && errno == EISCONN)
1365 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001366 }
1367 }
1368
1369 if (res < 0)
1370 res = errno;
1371
1372#endif
1373
1374 return res;
1375}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376
Fred Drake728819a2000-07-01 03:40:12 +00001377/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001378
Guido van Rossum73624e91994-10-10 17:59:00 +00001379static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001380sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001381{
1382 struct sockaddr *addr;
1383 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001384 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001385
Fred Drake728819a2000-07-01 03:40:12 +00001386 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001387 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001388
Guido van Rossum73624e91994-10-10 17:59:00 +00001389 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001390 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001391 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001392
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001393 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001394 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 Py_INCREF(Py_None);
1396 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001397}
1398
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001399PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001400"connect(address)\n\
1401\n\
1402Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001403is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001404
Guido van Rossum30a685f1991-06-27 15:51:29 +00001405
Fred Drake728819a2000-07-01 03:40:12 +00001406/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001407
1408static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001409sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001410{
1411 struct sockaddr *addr;
1412 int addrlen;
1413 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001414
Fred Drake728819a2000-07-01 03:40:12 +00001415 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001416 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001417
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001418 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001419 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001420 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001421
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001422 return PyInt_FromLong((long) res);
1423}
1424
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001425PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001426"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001427\n\
1428This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001429instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001430
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001431
Guido van Rossumed233a51992-06-23 09:07:03 +00001432/* s.fileno() method */
1433
Guido van Rossum73624e91994-10-10 17:59:00 +00001434static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001435sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001436{
Fred Drakea04eaad2000-06-30 02:46:07 +00001437#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001438 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001439#else
1440 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1441#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001442}
1443
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001444PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001445"fileno() -> integer\n\
1446\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001447Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001448
Guido van Rossumed233a51992-06-23 09:07:03 +00001449
Guido van Rossumbe32c891996-06-20 16:25:29 +00001450#ifndef NO_DUP
1451/* s.dup() method */
1452
1453static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001454sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001455{
Fred Drakea04eaad2000-06-30 02:46:07 +00001456 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001457 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001458
Guido van Rossumbe32c891996-06-20 16:25:29 +00001459 newfd = dup(s->sock_fd);
1460 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001461 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001462 sock = (PyObject *) new_sockobject(newfd,
1463 s->sock_family,
1464 s->sock_type,
1465 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001466 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001467 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001468 return sock;
1469}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001470
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001471PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001472"dup() -> socket object\n\
1473\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001474Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001475
Guido van Rossumbe32c891996-06-20 16:25:29 +00001476#endif
1477
1478
Guido van Rossumc89705d1992-11-26 08:54:07 +00001479/* s.getsockname() method */
1480
Guido van Rossum73624e91994-10-10 17:59:00 +00001481static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001482sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001483{
1484 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001485 int res;
1486 socklen_t addrlen;
1487
Guido van Rossumc89705d1992-11-26 08:54:07 +00001488 if (!getsockaddrlen(s, &addrlen))
1489 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001490 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001491 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001492 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001493 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001494 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001495 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001496 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001497}
1498
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001499PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001500"getsockname() -> address info\n\
1501\n\
1502Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001503info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001504
Guido van Rossumc89705d1992-11-26 08:54:07 +00001505
Guido van Rossumb6775db1994-08-01 11:34:53 +00001506#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001507/* s.getpeername() method */
1508
Guido van Rossum73624e91994-10-10 17:59:00 +00001509static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001510sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001511{
1512 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001513 int res;
1514 socklen_t addrlen;
1515
Guido van Rossumc89705d1992-11-26 08:54:07 +00001516 if (!getsockaddrlen(s, &addrlen))
1517 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001518 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001519 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001520 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001521 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001522 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001523 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001524 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001525}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001526
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001527PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001528"getpeername() -> address info\n\
1529\n\
1530Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001531info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532
Guido van Rossumb6775db1994-08-01 11:34:53 +00001533#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001534
1535
Guido van Rossum30a685f1991-06-27 15:51:29 +00001536/* s.listen(n) method */
1537
Guido van Rossum73624e91994-10-10 17:59:00 +00001538static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001539sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001540{
1541 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001542 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001543
1544 backlog = PyInt_AsLong(arg);
1545 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001546 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001548 if (backlog < 1)
1549 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001550 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001551 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001552 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001553 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001554 Py_INCREF(Py_None);
1555 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001556}
1557
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001558PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001559"listen(backlog)\n\
1560\n\
1561Enable a server to accept connections. The backlog argument must be at\n\
1562least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001563will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001564
1565
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001566#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001567/* s.makefile(mode) method.
1568 Create a new open file object referring to a dupped version of
1569 the socket's file descriptor. (The dup() call is necessary so
1570 that the open file and socket objects may be closed independent
1571 of each other.)
1572 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1573
Guido van Rossum73624e91994-10-10 17:59:00 +00001574static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001575sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001576{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001577 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001578 char *mode = "r";
1579 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001580#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001581 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001582#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001583 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001584#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001585 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001586 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001587#ifdef __VMS
1588 char *mode_r = "r";
1589 char *mode_w = "w";
1590#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001591
Guido van Rossum43713e52000-02-29 13:59:29 +00001592 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001593 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001594#ifdef __VMS
1595 if (strcmp(mode,"rb") == 0) {
1596 mode = mode_r;
1597 }
1598 else {
1599 if (strcmp(mode,"wb") == 0) {
1600 mode = mode_w;
1601 }
1602 }
1603#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001604#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001605 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1606 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001607#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001608 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001609#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001610 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001611 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001612 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001613 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001614 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001615#ifdef USE_GUSI2
1616 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001617 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001618 bufsize = 0;
1619#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001620 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1621 if (f != NULL)
1622 PyFile_SetBufSize(f, bufsize);
1623 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001624}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001625
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001626PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001627"makefile([mode[, buffersize]]) -> file object\n\
1628\n\
1629Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001630The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001631
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001632#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001633
Guido van Rossum48a680c2001-03-02 06:34:14 +00001634
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001635/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001636
Guido van Rossum73624e91994-10-10 17:59:00 +00001637static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001638sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001639{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001640 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001641 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001642#ifdef __VMS
1643 int read_length;
1644 char *read_buf;
1645#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001646
Guido van Rossum43713e52000-02-29 13:59:29 +00001647 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001648 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001649
1650 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001651 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001652 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001653 return NULL;
1654 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001655
Guido van Rossum73624e91994-10-10 17:59:00 +00001656 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001657 if (buf == NULL)
1658 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001659
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001660#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001661 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001662 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001663 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001664 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001665
Guido van Rossum7c53b771995-09-13 18:39:47 +00001666 if (n < 0) {
1667 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001668 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001669 }
Tim Peters5de98422002-04-27 18:44:32 +00001670 if (n != len)
1671 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001672#else
1673 read_buf = PyString_AsString(buf);
1674 read_length = len;
1675 while (read_length != 0) {
1676 unsigned int segment;
1677
1678 segment = read_length /SEGMENT_SIZE;
1679 if (segment != 0) {
1680 segment = SEGMENT_SIZE;
1681 }
1682 else {
1683 segment = read_length;
1684 }
1685
1686 Py_BEGIN_ALLOW_THREADS
1687 internal_select(s, 0);
1688 n = recv(s->sock_fd, read_buf, segment, flags);
1689 Py_END_ALLOW_THREADS
1690
1691 if (n < 0) {
1692 Py_DECREF(buf);
1693 return s->errorhandler();
1694 }
1695 if (n != read_length) {
1696 read_buf += n;
1697 break;
1698 }
1699
1700 read_length -= segment;
1701 read_buf += segment;
1702 }
1703 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1704 {
1705 return NULL;
1706 }
1707#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001708 return buf;
1709}
1710
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001711PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001712"recv(buffersize[, flags]) -> data\n\
1713\n\
1714Receive up to buffersize bytes from the socket. For the optional flags\n\
1715argument, see the Unix manual. When no data is available, block until\n\
1716at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001717the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001718
Guido van Rossum30a685f1991-06-27 15:51:29 +00001719
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001720/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001721
Guido van Rossum73624e91994-10-10 17:59:00 +00001722static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001723sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001724{
1725 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001726 PyObject *buf = NULL;
1727 PyObject *addr = NULL;
1728 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001729 int len, n, flags = 0;
1730 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001731
Guido van Rossum43713e52000-02-29 13:59:29 +00001732 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001733 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001734
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001735 if (!getsockaddrlen(s, &addrlen))
1736 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001737 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001738 if (buf == NULL)
1739 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001740
Guido van Rossum73624e91994-10-10 17:59:00 +00001741 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001742 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001743 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001744 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001745#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001746#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001747 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001748#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001749 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001750#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001751#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001752 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001753#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001754 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001755 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001756
Guido van Rossum7c53b771995-09-13 18:39:47 +00001757 if (n < 0) {
1758 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001759 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001760 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001761
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001762 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001763 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001764
Guido van Rossum67f7a382002-06-06 21:08:16 +00001765 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001766 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001767 goto finally;
1768
Guido van Rossum73624e91994-10-10 17:59:00 +00001769 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001770
1771finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001772 Py_XDECREF(addr);
1773 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001774 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001775}
1776
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001777PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001778"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1779\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001780Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001781
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001782/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001783
Guido van Rossum73624e91994-10-10 17:59:00 +00001784static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001785sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001786{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001787 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001788 int len, n, flags = 0;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001789#ifdef __VMS
1790 int send_length;
1791#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001792
Guido van Rossum43713e52000-02-29 13:59:29 +00001793 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001794 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001795
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001796#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001797 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001798 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001799 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001800 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001801
Guido van Rossum30a685f1991-06-27 15:51:29 +00001802 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001803 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001804#else
1805 /* Divide packet into smaller segments for */
1806 /* TCP/IP Services for OpenVMS */
1807 send_length = len;
1808 while (send_length != 0) {
1809 unsigned int segment;
1810
1811 segment = send_length / SEGMENT_SIZE;
1812 if (segment != 0) {
1813 segment = SEGMENT_SIZE;
1814 }
1815 else {
1816 segment = send_length;
1817 }
1818 Py_BEGIN_ALLOW_THREADS
1819 internal_select(s, 1);
1820 n = send(s->sock_fd, buf, segment, flags);
1821 Py_END_ALLOW_THREADS
1822 if (n < 0) {
1823 return s->errorhandler();
1824 }
1825 send_length -= segment;
1826 buf += segment;
1827 } /* end while */
1828#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001829 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001830}
1831
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001832PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001833"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001834\n\
1835Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001836argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001837sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001838
1839
1840/* s.sendall(data [,flags]) method */
1841
1842static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001843sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001844{
1845 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001846 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001847
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001848 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1849 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001850
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001851 Py_BEGIN_ALLOW_THREADS
1852 do {
Guido van Rossum8f24cdc2003-01-31 18:15:58 +00001853 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001854 n = send(s->sock_fd, buf, len, flags);
1855 if (n < 0)
1856 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001857 buf += n;
1858 len -= n;
1859 } while (len > 0);
1860 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001861
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001862 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001863 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001864
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001865 Py_INCREF(Py_None);
1866 return Py_None;
1867}
1868
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001869PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001870"sendall(data[, flags])\n\
1871\n\
1872Send a data string to the socket. For the optional flags\n\
1873argument, see the Unix manual. This calls send() repeatedly\n\
1874until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001875to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001876
Guido van Rossum30a685f1991-06-27 15:51:29 +00001877
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001878/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001879
Guido van Rossum73624e91994-10-10 17:59:00 +00001880static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001881sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001882{
Guido van Rossum73624e91994-10-10 17:59:00 +00001883 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001884 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001885 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001886 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001887
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001888 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001889 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001890 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001891 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1892 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001893 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001894 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001895
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001896 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001897 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001898
Guido van Rossum73624e91994-10-10 17:59:00 +00001899 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001900 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001901 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001902 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001903
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001904 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001905 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001906 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001907}
1908
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001909PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001910"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001911\n\
1912Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001913For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001914
Guido van Rossum30a685f1991-06-27 15:51:29 +00001915
1916/* s.shutdown(how) method */
1917
Guido van Rossum73624e91994-10-10 17:59:00 +00001918static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001919sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001920{
1921 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001922 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001923
1924 how = PyInt_AsLong(arg);
1925 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001926 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001927 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001928 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001929 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001930 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001931 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001932 Py_INCREF(Py_None);
1933 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001934}
1935
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001936PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001937"shutdown(flag)\n\
1938\n\
1939Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001940of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001941
Guido van Rossum30a685f1991-06-27 15:51:29 +00001942
1943/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001944
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001945static PyMethodDef sock_methods[] = {
1946 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001947 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001948 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001949 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001950 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001951 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001952 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001953 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001954 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001955 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001956#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001957 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001958 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001959#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001960 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001961 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001962#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001963 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001964 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001965#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001966 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001967 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001968 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001969 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001970 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001971 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001972#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001973 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001974 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001975#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001976 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001977 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001978 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001979 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001980 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001981 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001982 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001983 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001984 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001985 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001986 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001987 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001988 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001989 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001990 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001991 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001992 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001993 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001994 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001995 shutdown_doc},
1996#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001997 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001998 sleeptaskw_doc},
1999#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002000 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002001};
2002
Guido van Rossum30a685f1991-06-27 15:51:29 +00002003
Guido van Rossum73624e91994-10-10 17:59:00 +00002004/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002005 First close the file description. */
2006
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002007static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002008sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002009{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002010 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002011 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002012 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002013}
2014
Guido van Rossum30a685f1991-06-27 15:51:29 +00002015
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002016static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002017sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002018{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002019 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002020#if SIZEOF_SOCKET_T > SIZEOF_LONG
2021 if (s->sock_fd > LONG_MAX) {
2022 /* this can occur on Win64, and actually there is a special
2023 ugly printf formatter for decimal pointer length integer
2024 printing, only bother if necessary*/
2025 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002026 "no printf formatter to display "
2027 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002028 return NULL;
2029 }
2030#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002031 PyOS_snprintf(
2032 buf, sizeof(buf),
2033 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2034 (long)s->sock_fd, s->sock_family,
2035 s->sock_type,
2036 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002037 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002038}
2039
2040
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002041/* Create a new, uninitialized socket object. */
2042
2043static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002044sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002045{
2046 PyObject *new;
2047
2048 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002049 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002050 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002051 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002052 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002053 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002054 return new;
2055}
2056
2057
2058/* Initialize a new socket object. */
2059
2060/*ARGSUSED*/
2061static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002062sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002063{
2064 PySocketSockObject *s = (PySocketSockObject *)self;
2065 SOCKET_T fd;
2066 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2067 static char *keywords[] = {"family", "type", "proto", 0};
2068
2069 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2070 "|iii:socket", keywords,
2071 &family, &type, &proto))
2072 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002073
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002074 Py_BEGIN_ALLOW_THREADS
2075 fd = socket(family, type, proto);
2076 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002077
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002078#ifdef MS_WINDOWS
2079 if (fd == INVALID_SOCKET)
2080#else
2081 if (fd < 0)
2082#endif
2083 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002084 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002085 return -1;
2086 }
2087 init_sockobject(s, fd, family, type, proto);
2088 /* From now on, ignore SIGPIPE and let the error checking
2089 do the work. */
2090#ifdef SIGPIPE
2091 (void) signal(SIGPIPE, SIG_IGN);
2092#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002093
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002094 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002095
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002096}
2097
2098
Guido van Rossumb6775db1994-08-01 11:34:53 +00002099/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002100
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002101static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002102 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002103 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002104 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002105 sizeof(PySocketSockObject), /* tp_basicsize */
2106 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002107 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002108 0, /* tp_print */
2109 0, /* tp_getattr */
2110 0, /* tp_setattr */
2111 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002112 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002113 0, /* tp_as_number */
2114 0, /* tp_as_sequence */
2115 0, /* tp_as_mapping */
2116 0, /* tp_hash */
2117 0, /* tp_call */
2118 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002119 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002120 0, /* tp_setattro */
2121 0, /* tp_as_buffer */
2122 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002123 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002124 0, /* tp_traverse */
2125 0, /* tp_clear */
2126 0, /* tp_richcompare */
2127 0, /* tp_weaklistoffset */
2128 0, /* tp_iter */
2129 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002130 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002131 0, /* tp_members */
2132 0, /* tp_getset */
2133 0, /* tp_base */
2134 0, /* tp_dict */
2135 0, /* tp_descr_get */
2136 0, /* tp_descr_set */
2137 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002138 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002139 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002140 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002141 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002142};
2143
Guido van Rossum30a685f1991-06-27 15:51:29 +00002144
Guido van Rossum81194471991-07-27 21:42:02 +00002145/* Python interface to gethostname(). */
2146
2147/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002148static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002149socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002150{
2151 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002152 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002153 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002154 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002155 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002156 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002157 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002158 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002159 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002160 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002161 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002162}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002163
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002164PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002165"gethostname() -> string\n\
2166\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002167Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002168
Guido van Rossumff4949e1992-08-05 19:58:53 +00002169
Guido van Rossum30a685f1991-06-27 15:51:29 +00002170/* Python interface to gethostbyname(name). */
2171
2172/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002173static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002174socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002175{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002176 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002177 struct sockaddr_storage addrbuf;
2178
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002179 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002180 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002181 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002182 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002183 return makeipaddr((struct sockaddr *)&addrbuf,
2184 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002185}
2186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002187PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002188"gethostbyname(host) -> address\n\
2189\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002190Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002191
2192
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002193/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2194
2195static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002196gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002197{
2198 char **pch;
2199 PyObject *rtn_tuple = (PyObject *)NULL;
2200 PyObject *name_list = (PyObject *)NULL;
2201 PyObject *addr_list = (PyObject *)NULL;
2202 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002203
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002204 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002205 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002206#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002207 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002208#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002209 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002210#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002211 return NULL;
2212 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002213
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002214 if (h->h_addrtype != af) {
2215#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002216 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002217 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002218 (char *)strerror(EAFNOSUPPORT));
2219#else
2220 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002221 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002222 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002223#endif
2224 return NULL;
2225 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002226
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002227 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002228
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002229 case AF_INET:
2230 if (alen < sizeof(struct sockaddr_in))
2231 return NULL;
2232 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002233
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002234#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002235 case AF_INET6:
2236 if (alen < sizeof(struct sockaddr_in6))
2237 return NULL;
2238 break;
2239#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002240
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002241 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002242
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002243 if ((name_list = PyList_New(0)) == NULL)
2244 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002245
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002246 if ((addr_list = PyList_New(0)) == NULL)
2247 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002248
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002249 for (pch = h->h_aliases; *pch != NULL; pch++) {
2250 int status;
2251 tmp = PyString_FromString(*pch);
2252 if (tmp == NULL)
2253 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002254
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002255 status = PyList_Append(name_list, tmp);
2256 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002257
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002258 if (status)
2259 goto err;
2260 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002261
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002262 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2263 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002264
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002265 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002266
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002267 case AF_INET:
2268 {
2269 struct sockaddr_in sin;
2270 memset(&sin, 0, sizeof(sin));
2271 sin.sin_family = af;
2272#ifdef HAVE_SOCKADDR_SA_LEN
2273 sin.sin_len = sizeof(sin);
2274#endif
2275 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2276 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002277
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002278 if (pch == h->h_addr_list && alen >= sizeof(sin))
2279 memcpy((char *) addr, &sin, sizeof(sin));
2280 break;
2281 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002282
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002283#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002284 case AF_INET6:
2285 {
2286 struct sockaddr_in6 sin6;
2287 memset(&sin6, 0, sizeof(sin6));
2288 sin6.sin6_family = af;
2289#ifdef HAVE_SOCKADDR_SA_LEN
2290 sin6.sin6_len = sizeof(sin6);
2291#endif
2292 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2293 tmp = makeipaddr((struct sockaddr *)&sin6,
2294 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002295
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002296 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2297 memcpy((char *) addr, &sin6, sizeof(sin6));
2298 break;
2299 }
2300#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002301
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002302 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002303 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002304 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002305 return NULL;
2306 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002307
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002308 if (tmp == NULL)
2309 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002310
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002311 status = PyList_Append(addr_list, tmp);
2312 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002313
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002314 if (status)
2315 goto err;
2316 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002317
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002318 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002319
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002320 err:
2321 Py_XDECREF(name_list);
2322 Py_XDECREF(addr_list);
2323 return rtn_tuple;
2324}
2325
2326
2327/* Python interface to gethostbyname_ex(name). */
2328
2329/*ARGSUSED*/
2330static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002331socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002332{
2333 char *name;
2334 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002335 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002336 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002337 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002338#ifdef HAVE_GETHOSTBYNAME_R
2339 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002340#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2341 struct hostent_data data;
2342#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002343 char buf[16384];
2344 int buf_len = (sizeof buf) - 1;
2345 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002346#endif
2347#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002348 int result;
2349#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002350#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002351
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002352 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002353 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002354 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002355 return NULL;
2356 Py_BEGIN_ALLOW_THREADS
2357#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002358#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002359 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2360 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002361#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002362 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002363#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002364 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002365 result = gethostbyname_r(name, &hp_allocated, &data);
2366 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002367#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002368#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002369#ifdef USE_GETHOSTBYNAME_LOCK
2370 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002371#endif
2372 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002373#endif /* HAVE_GETHOSTBYNAME_R */
2374 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002375 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002376 addr.ss_family.
2377 Therefore, we cast the sockaddr_storage into sockaddr to
2378 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002379 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002380 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002381 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002382#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002383 PyThread_release_lock(gethostbyname_lock);
2384#endif
2385 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002386}
2387
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002388PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002389"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2390\n\
2391Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002392for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002393
2394
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002395/* Python interface to gethostbyaddr(IP). */
2396
2397/*ARGSUSED*/
2398static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002399socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002400{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002401#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002402 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002403#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002404 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002405#endif
2406 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002407 char *ip_num;
2408 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002409 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002410#ifdef HAVE_GETHOSTBYNAME_R
2411 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002412#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2413 struct hostent_data data;
2414#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002415 char buf[16384];
2416 int buf_len = (sizeof buf) - 1;
2417 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002418#endif
2419#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002420 int result;
2421#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002422#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002423 char *ap;
2424 int al;
2425 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002426
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002427 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002428 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002429 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002430 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002431 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002432 af = sa->sa_family;
2433 ap = NULL;
2434 al = 0;
2435 switch (af) {
2436 case AF_INET:
2437 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2438 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2439 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002440#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002441 case AF_INET6:
2442 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2443 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2444 break;
2445#endif
2446 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002447 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002448 return NULL;
2449 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002450 Py_BEGIN_ALLOW_THREADS
2451#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002452#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002453 result = gethostbyaddr_r(ap, al, af,
2454 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002455 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002456#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002457 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002458 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002459#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002460 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002461 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002462 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002463#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002464#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002465#ifdef USE_GETHOSTBYNAME_LOCK
2466 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002467#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002468 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002469#endif /* HAVE_GETHOSTBYNAME_R */
2470 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002471 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002472#ifdef USE_GETHOSTBYNAME_LOCK
2473 PyThread_release_lock(gethostbyname_lock);
2474#endif
2475 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002476}
2477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002478PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002479"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2480\n\
2481Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002482for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002483
Guido van Rossum30a685f1991-06-27 15:51:29 +00002484
2485/* Python interface to getservbyname(name).
2486 This only returns the port number, since the other info is already
2487 known or not useful (like the list of aliases). */
2488
2489/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002490static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002491socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002492{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002493 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002494 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002495 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002496 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002497 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002498 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002499 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002500 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002501 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002502 return NULL;
2503 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002504 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002505}
2506
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002507PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002508"getservbyname(servicename, protocolname) -> integer\n\
2509\n\
2510Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002511The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002512
Guido van Rossum30a685f1991-06-27 15:51:29 +00002513
Guido van Rossum3901d851996-12-19 16:35:04 +00002514/* Python interface to getprotobyname(name).
2515 This only returns the protocol number, since the other info is
2516 already known or not useful (like the list of aliases). */
2517
2518/*ARGSUSED*/
2519static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002520socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002521{
2522 char *name;
2523 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002524#ifdef __BEOS__
2525/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002526 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002527 return NULL;
2528#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002529 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002530 return NULL;
2531 Py_BEGIN_ALLOW_THREADS
2532 sp = getprotobyname(name);
2533 Py_END_ALLOW_THREADS
2534 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002535 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002536 return NULL;
2537 }
2538 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002539#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002540}
2541
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002542PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002543"getprotobyname(name) -> integer\n\
2544\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002545Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002546
Guido van Rossum3901d851996-12-19 16:35:04 +00002547
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002548#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002549/* Create a socket object from a numeric file description.
2550 Useful e.g. if stdin is a socket.
2551 Additional arguments as for socket(). */
2552
2553/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002554static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002555socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002556{
Guido van Rossum73624e91994-10-10 17:59:00 +00002557 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002558 SOCKET_T fd;
2559 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002560 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2561 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002562 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002563 /* Dup the fd so it and the socket can be closed independently */
2564 fd = dup(fd);
2565 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002566 return set_error();
2567 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002568 /* From now on, ignore SIGPIPE and let the error checking
2569 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002570#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002571 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002572#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002573 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002574}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002575
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002576PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002577"fromfd(fd, family, type[, proto]) -> socket object\n\
2578\n\
2579Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002580The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002581
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002582#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002583
Guido van Rossum82a5c661998-07-07 20:45:43 +00002584
Guido van Rossum006bf911996-06-12 04:04:55 +00002585static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002586socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002587{
2588 int x1, x2;
2589
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002590 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002591 return NULL;
2592 }
2593 x2 = (int)ntohs((short)x1);
2594 return PyInt_FromLong(x2);
2595}
2596
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002597PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002598"ntohs(integer) -> integer\n\
2599\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002600Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002601
2602
Guido van Rossum006bf911996-06-12 04:04:55 +00002603static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002604socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002605{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002606 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002607
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002608 if (PyInt_Check(arg)) {
2609 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002610 if (x == (unsigned long) -1 && PyErr_Occurred())
2611 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002612 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002613 else if (PyLong_Check(arg)) {
2614 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002615 if (x == (unsigned long) -1 && PyErr_Occurred())
2616 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002617#if SIZEOF_LONG > 4
2618 {
2619 unsigned long y;
2620 /* only want the trailing 32 bits */
2621 y = x & 0xFFFFFFFFUL;
2622 if (y ^ x)
2623 return PyErr_Format(PyExc_OverflowError,
2624 "long int larger than 32 bits");
2625 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002626 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002627#endif
2628 }
2629 else
Tim Peters58141872002-08-06 22:25:02 +00002630 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002631 "expected int/long, %s found",
2632 arg->ob_type->tp_name);
2633 if (x == (unsigned long) -1 && PyErr_Occurred())
2634 return NULL;
2635 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002636}
2637
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002638PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002639"ntohl(integer) -> integer\n\
2640\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002641Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002642
2643
Guido van Rossum006bf911996-06-12 04:04:55 +00002644static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002645socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002646{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002647 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002648
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002649 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002650 return NULL;
2651 }
2652 x2 = (int)htons((short)x1);
2653 return PyInt_FromLong(x2);
2654}
2655
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002656PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002657"htons(integer) -> integer\n\
2658\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002659Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002660
2661
Guido van Rossum006bf911996-06-12 04:04:55 +00002662static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002663socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002664{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002665 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002666
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002667 if (PyInt_Check(arg)) {
2668 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002669 if (x == (unsigned long) -1 && PyErr_Occurred())
2670 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002671 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002672 else if (PyLong_Check(arg)) {
2673 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002674 if (x == (unsigned long) -1 && PyErr_Occurred())
2675 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002676#if SIZEOF_LONG > 4
2677 {
2678 unsigned long y;
2679 /* only want the trailing 32 bits */
2680 y = x & 0xFFFFFFFFUL;
2681 if (y ^ x)
2682 return PyErr_Format(PyExc_OverflowError,
2683 "long int larger than 32 bits");
2684 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002685 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002686#endif
2687 }
2688 else
Tim Peters58141872002-08-06 22:25:02 +00002689 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002690 "expected int/long, %s found",
2691 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002692 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002693}
2694
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002695PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002696"htonl(integer) -> integer\n\
2697\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002698Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002699
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002700/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002701
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002702PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002703"inet_aton(string) -> packed 32-bit IP representation\n\
2704\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002705Convert 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 +00002706binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002707
2708static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002709socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002710{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002711#ifndef INADDR_NONE
2712#define INADDR_NONE (-1)
2713#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002714#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002715 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002716#else
2717 /* Have to use inet_addr() instead */
2718 unsigned long packed_addr;
2719#endif
2720 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002721
Tim Peters1df9fdd2003-02-13 03:13:40 +00002722 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002723 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002724
Tim Peters1df9fdd2003-02-13 03:13:40 +00002725
2726#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002727 if (inet_aton(ip_addr, &buf))
2728 return PyString_FromStringAndSize((char *)(&buf),
2729 sizeof(buf));
2730
2731 PyErr_SetString(socket_error,
2732 "illegal IP address string passed to inet_aton");
2733 return NULL;
2734
Tim Peters1df9fdd2003-02-13 03:13:40 +00002735#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002736 /* XXX Problem here: inet_aton('255.255.255.255') raises
2737 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002738 packed_addr = inet_addr(ip_addr);
2739
2740 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002741 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002742 "illegal IP address string passed to inet_aton");
2743 return NULL;
2744 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002745 return PyString_FromStringAndSize((char *) &packed_addr,
2746 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002747#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002748}
2749
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002750PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002751"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002752\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002753Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002754
2755static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002756socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002757{
2758 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002759 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002760 struct in_addr packed_addr;
2761
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002762 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002763 return NULL;
2764 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002765
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002766 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002767 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002768 "packed IP wrong length for inet_ntoa");
2769 return NULL;
2770 }
2771
2772 memcpy(&packed_addr, packed_str, addr_len);
2773
2774 return PyString_FromString(inet_ntoa(packed_addr));
2775}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002776
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002777/* Python interface to getaddrinfo(host, port). */
2778
2779/*ARGSUSED*/
2780static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002781socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002782{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002783 struct addrinfo hints, *res;
2784 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002785 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002786 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002787 char *hptr, *pptr;
2788 int family, socktype, protocol, flags;
2789 int error;
2790 PyObject *all = (PyObject *)NULL;
2791 PyObject *single = (PyObject *)NULL;
2792
2793 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002794 family = AF_UNSPEC;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002795 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2796 &hptr, &pobj, &family, &socktype,
2797 &protocol, &flags)) {
2798 return NULL;
2799 }
2800 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002801 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002802 pptr = pbuf;
2803 } else if (PyString_Check(pobj)) {
2804 pptr = PyString_AsString(pobj);
2805 } else if (pobj == Py_None) {
2806 pptr = (char *)NULL;
2807 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002808 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002809 return NULL;
2810 }
2811 memset(&hints, 0, sizeof(hints));
2812 hints.ai_family = family;
2813 hints.ai_socktype = socktype;
2814 hints.ai_protocol = protocol;
2815 hints.ai_flags = flags;
2816 error = getaddrinfo(hptr, pptr, &hints, &res0);
2817 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002818 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002819 return NULL;
2820 }
2821
2822 if ((all = PyList_New(0)) == NULL)
2823 goto err;
2824 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002825 PyObject *addr =
2826 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2827 if (addr == NULL)
2828 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002829 single = Py_BuildValue("iiisO", res->ai_family,
2830 res->ai_socktype, res->ai_protocol,
2831 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002832 addr);
2833 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002834 if (single == NULL)
2835 goto err;
2836
2837 if (PyList_Append(all, single))
2838 goto err;
2839 Py_XDECREF(single);
2840 }
Neal Norwitz90128ba2002-08-09 03:37:42 +00002841 if (res0)
2842 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002843 return all;
2844 err:
2845 Py_XDECREF(single);
2846 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002847 if (res0)
2848 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002849 return (PyObject *)NULL;
2850}
2851
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002852PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002853"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2854 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002855\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002856Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002857
2858/* Python interface to getnameinfo(sa, flags). */
2859
2860/*ARGSUSED*/
2861static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002862socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002863{
2864 PyObject *sa = (PyObject *)NULL;
2865 int flags;
2866 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002867 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002868 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2869 struct addrinfo hints, *res = NULL;
2870 int error;
2871 PyObject *ret = (PyObject *)NULL;
2872
2873 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002874 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002875 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002876 if (!PyArg_ParseTuple(sa, "si|ii",
2877 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002878 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002879 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002880 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002881 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002882 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002883 error = getaddrinfo(hostp, pbuf, &hints, &res);
2884 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002885 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002886 goto fail;
2887 }
2888 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002889 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002890 "sockaddr resolved to multiple addresses");
2891 goto fail;
2892 }
2893 switch (res->ai_family) {
2894 case AF_INET:
2895 {
2896 char *t1;
2897 int t2;
2898 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002899 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002900 "IPv4 sockaddr must be 2 tuple");
2901 goto fail;
2902 }
2903 break;
2904 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002905#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002906 case AF_INET6:
2907 {
2908 struct sockaddr_in6 *sin6;
2909 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2910 sin6->sin6_flowinfo = flowinfo;
2911 sin6->sin6_scope_id = scope_id;
2912 break;
2913 }
2914#endif
2915 }
2916 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2917 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2918 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002919 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002920 goto fail;
2921 }
2922 ret = Py_BuildValue("ss", hbuf, pbuf);
2923
2924fail:
2925 if (res)
2926 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002927 return ret;
2928}
2929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002930PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002931"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002932\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002933Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002934
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002935
2936/* Python API to getting and setting the default timeout value. */
2937
2938static PyObject *
2939socket_getdefaulttimeout(PyObject *self)
2940{
2941 if (defaulttimeout < 0.0) {
2942 Py_INCREF(Py_None);
2943 return Py_None;
2944 }
2945 else
2946 return PyFloat_FromDouble(defaulttimeout);
2947}
2948
2949PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002950"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002951\n\
2952Returns the default timeout in floating seconds for new socket objects.\n\
2953A value of None indicates that new socket objects have no timeout.\n\
2954When the socket module is first imported, the default is None.");
2955
2956static PyObject *
2957socket_setdefaulttimeout(PyObject *self, PyObject *arg)
2958{
2959 double timeout;
2960
2961 if (arg == Py_None)
2962 timeout = -1.0;
2963 else {
2964 timeout = PyFloat_AsDouble(arg);
2965 if (timeout < 0.0) {
2966 if (!PyErr_Occurred())
2967 PyErr_SetString(PyExc_ValueError,
2968 "Timeout value out of range");
2969 return NULL;
2970 }
2971 }
2972
2973 defaulttimeout = timeout;
2974
2975 Py_INCREF(Py_None);
2976 return Py_None;
2977}
2978
2979PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002980"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002981\n\
2982Set the default timeout in floating seconds for new socket objects.\n\
2983A value of None indicates that new socket objects have no timeout.\n\
2984When the socket module is first imported, the default is None.");
2985
2986
Guido van Rossum30a685f1991-06-27 15:51:29 +00002987/* List of functions exported by this module. */
2988
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002989static PyMethodDef socket_methods[] = {
2990 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002991 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002992 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002993 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002994 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002995 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002996 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002997 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002998 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002999 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003000 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003001 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003002#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003003 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003004 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003005#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003006 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003007 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003008 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003009 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003010 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003011 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003012 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003013 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003014 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003015 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003016 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003017 METH_VARARGS, inet_ntoa_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003018 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003019 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003020 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003021 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003022 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003023 METH_NOARGS, getdefaulttimeout_doc},
3024 {"setdefaulttimeout", socket_setdefaulttimeout,
3025 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003026 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003027};
3028
Guido van Rossum30a685f1991-06-27 15:51:29 +00003029
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003030#ifdef RISCOS
3031#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003032
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003033static int
3034os_init(void)
3035{
3036 _kernel_swi_regs r;
3037
3038 r.r[0] = 0;
3039 _kernel_swi(0x43380, &r, &r);
3040 taskwindow = r.r[0];
3041
3042 return 0;
3043}
3044
3045#endif /* RISCOS */
3046
3047
3048#ifdef MS_WINDOWS
3049#define OS_INIT_DEFINED
3050
3051/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003052
3053static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003054os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003055{
3056 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003057}
3058
3059static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003060os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003061{
3062 WSADATA WSAData;
3063 int ret;
3064 char buf[100];
3065 ret = WSAStartup(0x0101, &WSAData);
3066 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003067 case 0: /* No error */
3068 atexit(os_cleanup);
3069 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003070 case WSASYSNOTREADY:
3071 PyErr_SetString(PyExc_ImportError,
3072 "WSAStartup failed: network not ready");
3073 break;
3074 case WSAVERNOTSUPPORTED:
3075 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003076 PyErr_SetString(
3077 PyExc_ImportError,
3078 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003079 break;
3080 default:
Tim Peters885d4572001-11-28 20:27:42 +00003081 PyOS_snprintf(buf, sizeof(buf),
3082 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003083 PyErr_SetString(PyExc_ImportError, buf);
3084 break;
3085 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003086 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003087}
3088
Guido van Rossum8d665e61996-06-26 18:22:49 +00003089#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003090
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003091
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003092#ifdef PYOS_OS2
3093#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003094
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003095/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003096
3097static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003098os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003099{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003100#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003101 char reason[64];
3102 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003103
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003104 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003105 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003106 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003107
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003108 PyOS_snprintf(reason, sizeof(reason),
3109 "OS/2 TCP/IP Error# %d", sock_errno());
3110 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003111
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003112 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003113#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003114 /* No need to initialise sockets with GCC/EMX */
3115 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003116#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003117}
3118
3119#endif /* PYOS_OS2 */
3120
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003121
3122#ifndef OS_INIT_DEFINED
3123static int
3124os_init(void)
3125{
3126 return 1; /* Success */
3127}
3128#endif
3129
3130
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003131/* C API table - always add new things to the end for binary
3132 compatibility. */
3133static
3134PySocketModule_APIObject PySocketModuleAPI =
3135{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003136 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003137};
3138
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003139
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003140/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003141
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003142 This module is actually called "_socket", and there's a wrapper
3143 "socket.py" which implements some additional functionality. On some
3144 platforms (e.g. Windows and OS/2), socket.py also implements a
3145 wrapper for the socket type that provides missing functionality such
3146 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3147 with an ImportError exception if os-specific initialization fails.
3148 On Windows, this does WINSOCK initialization. When WINSOCK is
3149 initialized succesfully, a call to WSACleanup() is scheduled to be
3150 made at exit time.
3151*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003152
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003153PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003154"Implementation module for socket operations.\n\
3155\n\
3156See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003157
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003158PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003159init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003160{
Fred Drake4baedc12002-04-01 14:53:37 +00003161 PyObject *m;
Fred Drake4baedc12002-04-01 14:53:37 +00003162
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003163 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003164 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003165
3166 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003167 m = Py_InitModule3(PySocket_MODULE_NAME,
3168 socket_methods,
3169 socket_doc);
3170
3171 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3172 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003173 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003174 Py_INCREF(socket_error);
3175 PyModule_AddObject(m, "error", socket_error);
3176 socket_herror = PyErr_NewException("socket.herror",
3177 socket_error, NULL);
3178 if (socket_herror == NULL)
3179 return;
3180 Py_INCREF(socket_herror);
3181 PyModule_AddObject(m, "herror", socket_herror);
3182 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003183 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003184 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003185 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003186 Py_INCREF(socket_gaierror);
3187 PyModule_AddObject(m, "gaierror", socket_gaierror);
3188 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003189 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003190 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003191 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003192 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003193 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003194 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003195 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003196
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003197 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003198 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003199 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3200 ) != 0)
3201 return;
3202
Guido van Rossum09be4091999-08-09 14:40:40 +00003203 /* Address families (we only support AF_INET and AF_UNIX) */
3204#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003205 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003206#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003207 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003208#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003209 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003210#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003211#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003212 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003213#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003214#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003215 /* Amateur Radio AX.25 */
3216 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003217#endif
3218#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003219 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003220#endif
3221#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003222 /* Appletalk DDP */
3223 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003224#endif
3225#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003226 /* Amateur radio NetROM */
3227 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003228#endif
3229#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003230 /* Multiprotocol bridge */
3231 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003232#endif
3233#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003234 /* Reserved for Werner's ATM */
3235 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003236#endif
3237#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003238 /* Reserved for X.25 project */
3239 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003240#endif
3241#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003242 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003243#endif
3244#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003245 /* Amateur Radio X.25 PLP */
3246 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003247#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003248#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003249 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3250 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3251 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3252 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3253 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3254 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3255 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3256 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3257 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003258#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003259
3260 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003261 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3262 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003263#ifndef __BEOS__
3264/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003265 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3266 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003267#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003268 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003269#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003270#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003271
3272#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003273 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003274#endif
3275#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003276 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003277#endif
3278#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003279 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003280#endif
3281#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003282 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003283#endif
3284#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003285 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003286#endif
3287#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003288 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003289#endif
3290#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003291 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003292#endif
3293#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003294 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003295#endif
3296#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003297 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003298#endif
3299#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003300 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003301#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003302#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003303 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003304#endif
3305#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003306 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003307#endif
3308#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003309 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003310#endif
3311#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003312 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003313#endif
3314#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003315 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003316#endif
3317#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003318 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003319#endif
3320#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003321 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003322#endif
3323#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003324 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003325#endif
3326
3327 /* Maximum number of connections for "listen" */
3328#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003329 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003330#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003331 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003332#endif
3333
3334 /* Flags for send, recv */
3335#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003336 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003337#endif
3338#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003339 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003340#endif
3341#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003342 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003343#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003344#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003345 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003346#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003347#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003348 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003349#endif
3350#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003351 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003352#endif
3353#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003354 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003355#endif
3356#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003357 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003358#endif
3359#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003360 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003361#endif
3362#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003363 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003364#endif
3365
3366 /* Protocol level and numbers, usable for [gs]etsockopt */
3367#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003368 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003369#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003370#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003371 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003372#else
Fred Drake4baedc12002-04-01 14:53:37 +00003373 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003374#endif
3375#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003376 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003377#endif
3378#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003379 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003380#endif
3381#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003382 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003383#endif
3384#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003385 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003386#endif
3387#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003388 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003389#endif
3390#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003391 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003392#else
Fred Drake4baedc12002-04-01 14:53:37 +00003393 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003394#endif
3395#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003396 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003397#else
Fred Drake4baedc12002-04-01 14:53:37 +00003398 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003399#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003400#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003401 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003402#else
Fred Drake4baedc12002-04-01 14:53:37 +00003403 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003404#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003405#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003406 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003407#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003408#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003409 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003410#else
Fred Drake4baedc12002-04-01 14:53:37 +00003411 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003412#endif
3413#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003414 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003415#endif
3416#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003417 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003418#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003419#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003420 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003421#endif
3422#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003424#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003425#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003426 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003427#else
Fred Drake4baedc12002-04-01 14:53:37 +00003428 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003429#endif
3430#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003431 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003432#endif
3433#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003434 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003435#endif
3436#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003437 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003438#else
Fred Drake4baedc12002-04-01 14:53:37 +00003439 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003440#endif
3441#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003442 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003443#endif
3444#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003445 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003446#endif
3447#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003448 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003449#endif
3450#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003451 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003452#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003453#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003454 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003455#endif
3456#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003457 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003458#endif
3459#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003460 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003461#endif
3462#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003463 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003464#endif
3465#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003466 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003467#endif
3468#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003469 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003470#endif
3471#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003472 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003473#endif
3474#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003475 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003476#endif
3477#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003478 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003479#endif
3480#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003481 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003482#endif
3483#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003484 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003485#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003486#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003487 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003488#endif
3489#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003490 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003491#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003492#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003493 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003494#endif
3495#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003496 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003497#endif
3498#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003499 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003500#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003501#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003502 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003503#endif
3504/**/
3505#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003506 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003507#else
Fred Drake4baedc12002-04-01 14:53:37 +00003508 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003509#endif
3510#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003511 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003512#endif
3513
3514 /* Some port configuration */
3515#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003516 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003517#else
Fred Drake4baedc12002-04-01 14:53:37 +00003518 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003519#endif
3520#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003521 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003522#else
Fred Drake4baedc12002-04-01 14:53:37 +00003523 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003524#endif
3525
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003526 /* Some reserved IP v.4 addresses */
3527#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003528 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003529#else
Fred Drake4baedc12002-04-01 14:53:37 +00003530 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003531#endif
3532#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003533 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003534#else
Fred Drake4baedc12002-04-01 14:53:37 +00003535 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003536#endif
3537#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003538 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003539#else
Fred Drake4baedc12002-04-01 14:53:37 +00003540 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003541#endif
3542#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003543 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003544#else
Fred Drake4baedc12002-04-01 14:53:37 +00003545 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003546#endif
3547#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003548 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3549 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003550#else
Fred Drake4baedc12002-04-01 14:53:37 +00003551 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003552#endif
3553#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003554 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3555 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003556#else
Fred Drake4baedc12002-04-01 14:53:37 +00003557 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003558#endif
3559#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003560 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003561#else
Fred Drake4baedc12002-04-01 14:53:37 +00003562 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003563#endif
3564
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003565 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003566#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003567 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003568#endif
3569#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003570 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003571#endif
3572#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003573 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003574#endif
3575#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003576 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003577#endif
3578#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003579 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003580#endif
3581#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003582 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003583#endif
3584#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003585 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003586#endif
3587#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003588 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003589#endif
3590#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003591 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003592#endif
3593#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003594 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003595#endif
3596#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003597 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003598#endif
3599#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003600 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003601#endif
3602#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003603 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003604#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003605#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003606 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3607 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003608#endif
3609#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003610 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3611 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003612#endif
3613#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003614 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003615#endif
3616
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003617 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3618#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003619 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003620#endif
3621#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003622 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003623#endif
3624#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003625 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003626#endif
3627#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003628 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003629#endif
3630#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003631 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003632#endif
3633#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003634 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003635#endif
3636
Guido van Rossum09be4091999-08-09 14:40:40 +00003637 /* TCP options */
3638#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003639 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003640#endif
3641#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003642 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003643#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003644#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003645 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003646#endif
3647#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003648 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003649#endif
3650#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003651 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003652#endif
3653#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003654 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003655#endif
3656#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003657 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003658#endif
3659#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003660 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003661#endif
3662#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003663 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003664#endif
3665#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003666 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003667#endif
3668#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003669 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003670#endif
3671#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003672 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003673#endif
3674
Guido van Rossum09be4091999-08-09 14:40:40 +00003675
3676 /* IPX options */
3677#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003678 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003679#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003680
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003681 /* get{addr,name}info parameters */
3682#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003683 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003684#endif
3685#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003686 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003687#endif
3688#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003689 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003690#endif
3691#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003692 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003693#endif
3694#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003695 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003696#endif
3697#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003698 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003699#endif
3700#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003701 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003702#endif
3703#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003704 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003705#endif
3706#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003707 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003708#endif
3709#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003710 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003711#endif
3712#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003713 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003714#endif
3715#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003716 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003717#endif
3718#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003719 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003720#endif
3721#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003722 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003723#endif
3724#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003725 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003726#endif
3727#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003728 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003729#endif
3730#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003731 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003732#endif
3733#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003734 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003735#endif
3736#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003737 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003738#endif
3739#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003740 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003741#endif
3742#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003743 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003744#endif
3745#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003746 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003747#endif
3748#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003749 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003750#endif
3751#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003752 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003753#endif
3754#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003755 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003756#endif
3757#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003758 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003759#endif
3760#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003761 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003762#endif
3763#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003764 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003765#endif
3766#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003767 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003768#endif
3769#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003770 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003771#endif
3772
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003773 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003774#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003775 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003776#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003777}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003778
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003779
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003780#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003781
3782/* Simplistic emulation code for inet_pton that only works for IPv4 */
3783
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003784int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003785inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003786{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003787 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003788 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003789 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003790 if (packed_addr == INADDR_NONE)
3791 return 0;
3792 memcpy(dst, &packed_addr, 4);
3793 return 1;
3794 }
3795 /* Should set errno to EAFNOSUPPORT */
3796 return -1;
3797}
3798
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003799const char *
3800inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003801{
3802 if (af == AF_INET) {
3803 struct in_addr packed_addr;
3804 if (size < 16)
3805 /* Should set errno to ENOSPC. */
3806 return NULL;
3807 memcpy(&packed_addr, src, sizeof(packed_addr));
3808 return strncpy(dst, inet_ntoa(packed_addr), size);
3809 }
3810 /* Should set errno to EAFNOSUPPORT */
3811 return NULL;
3812}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003813
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003814#endif