blob: ba64cb86864fb41fb575f92999fef5ad46823a7d [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 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000877 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
878 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000879 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000880 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000881 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000882 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000883 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000884 *addr_ret = (struct sockaddr *) addr;
885 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000886 return 1;
887 }
888
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000889#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000890 case AF_INET6:
891 {
892 struct sockaddr_in6* addr;
893 char *host;
894 int port, flowinfo, scope_id;
895 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
896 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +0000897 if (!PyArg_ParseTuple(args, "eti|ii",
898 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000899 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000900 return 0;
901 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000902 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000903 return 0;
904 addr->sin6_family = s->sock_family;
905 addr->sin6_port = htons((short)port);
906 addr->sin6_flowinfo = flowinfo;
907 addr->sin6_scope_id = scope_id;
908 *addr_ret = (struct sockaddr *) addr;
909 *len_ret = sizeof *addr;
910 return 1;
911 }
912#endif
913
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000914#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000915 case AF_PACKET:
916 {
917 struct sockaddr_ll* addr;
918 struct ifreq ifr;
919 char *interfaceName;
920 int protoNumber;
921 int hatype = 0;
922 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000923 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000924
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000925 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
926 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000927 return 0;
928 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
929 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000930 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000931 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000932 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000933 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000934 addr = &(s->sock_addr.ll);
935 addr->sll_family = AF_PACKET;
936 addr->sll_protocol = htons((short)protoNumber);
937 addr->sll_ifindex = ifr.ifr_ifindex;
938 addr->sll_pkttype = pkttype;
939 addr->sll_hatype = hatype;
940 *addr_ret = (struct sockaddr *) addr;
941 *len_ret = sizeof *addr;
942 return 1;
943 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000944#endif
945
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946 /* More cases here... */
947
948 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000949 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000950 return 0;
951
952 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000953}
954
Guido van Rossum30a685f1991-06-27 15:51:29 +0000955
Guido van Rossum48a680c2001-03-02 06:34:14 +0000956/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000957 Return 1 if the family is known, 0 otherwise. The length is returned
958 through len_ret. */
959
960static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000961getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000962{
963 switch (s->sock_family) {
964
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000965#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000966 case AF_UNIX:
967 {
968 *len_ret = sizeof (struct sockaddr_un);
969 return 1;
970 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000971#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000972
973 case AF_INET:
974 {
975 *len_ret = sizeof (struct sockaddr_in);
976 return 1;
977 }
978
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000979#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000980 case AF_INET6:
981 {
982 *len_ret = sizeof (struct sockaddr_in6);
983 return 1;
984 }
985#endif
986
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000987#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000988 case AF_PACKET:
989 {
990 *len_ret = sizeof (struct sockaddr_ll);
991 return 1;
992 }
993#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000994
Guido van Rossum710e1df1992-06-12 10:39:36 +0000995 /* More cases here... */
996
997 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000998 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000999 return 0;
1000
1001 }
1002}
1003
1004
Guido van Rossum30a685f1991-06-27 15:51:29 +00001005/* s.accept() method */
1006
Guido van Rossum73624e91994-10-10 17:59:00 +00001007static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001008sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001009{
1010 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001011 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001012 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001013 PyObject *sock = NULL;
1014 PyObject *addr = NULL;
1015 PyObject *res = NULL;
1016
Guido van Rossum710e1df1992-06-12 10:39:36 +00001017 if (!getsockaddrlen(s, &addrlen))
1018 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001019 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001020
Guido van Rossum73624e91994-10-10 17:59:00 +00001021 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001022 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001023 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001024 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001025
Fred Drakea04eaad2000-06-30 02:46:07 +00001026#ifdef MS_WINDOWS
1027 if (newfd == INVALID_SOCKET)
1028#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001029 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001030#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001031 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001032
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033 /* Create the new object with unspecified family,
1034 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001035 sock = (PyObject *) new_sockobject(newfd,
1036 s->sock_family,
1037 s->sock_type,
1038 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001039
Barry Warsaw752300b1997-01-03 17:18:10 +00001040 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001041 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001042 goto finally;
1043 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001044 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001045 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001046 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001047 goto finally;
1048
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001049 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001050
Guido van Rossum67f7a382002-06-06 21:08:16 +00001051finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001052 Py_XDECREF(sock);
1053 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001054 return res;
1055}
1056
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001057PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001058"accept() -> (socket object, address info)\n\
1059\n\
1060Wait for an incoming connection. Return a new socket representing the\n\
1061connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001062info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001063
Guido van Rossum11ba0942002-06-13 15:07:44 +00001064/* s.setblocking(flag) method. Argument:
1065 False -- non-blocking mode; same as settimeout(0)
1066 True -- blocking mode; same as settimeout(None)
1067*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001068
Guido van Rossum73624e91994-10-10 17:59:00 +00001069static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001070sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001071{
1072 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001073
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001074 block = PyInt_AsLong(arg);
1075 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001076 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001077
Guido van Rossum11ba0942002-06-13 15:07:44 +00001078 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001079 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001080
Guido van Rossum73624e91994-10-10 17:59:00 +00001081 Py_INCREF(Py_None);
1082 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001083}
Guido van Rossume4485b01994-09-07 14:32:49 +00001084
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001085PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001086"setblocking(flag)\n\
1087\n\
1088Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001089setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001090setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001091
Guido van Rossum11ba0942002-06-13 15:07:44 +00001092/* s.settimeout(timeout) method. Argument:
1093 None -- no timeout, blocking mode; same as setblocking(True)
1094 0.0 -- non-blocking mode; same as setblocking(False)
1095 > 0 -- timeout mode; operations time out after timeout seconds
1096 < 0 -- illegal; raises an exception
1097*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001098static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001099sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001100{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001101 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001102
1103 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001104 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001105 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001106 timeout = PyFloat_AsDouble(arg);
1107 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001108 if (!PyErr_Occurred())
1109 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001110 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001111 return NULL;
1112 }
1113 }
1114
Guido van Rossum11ba0942002-06-13 15:07:44 +00001115 s->sock_timeout = timeout;
1116 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001117
1118 Py_INCREF(Py_None);
1119 return Py_None;
1120}
1121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001122PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001123"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001124\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001125Set a timeout on socket operations. 'timeout' can be a float,\n\
1126giving in seconds, or None. Setting a timeout of None disables\n\
1127the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001128Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001129
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001130/* s.gettimeout() method.
1131 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001132static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001133sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001134{
1135 if (s->sock_timeout < 0.0) {
1136 Py_INCREF(Py_None);
1137 return Py_None;
1138 }
1139 else
1140 return PyFloat_FromDouble(s->sock_timeout);
1141}
1142
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001143PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001144"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001145\n\
1146Returns the timeout in floating seconds associated with socket \n\
1147operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001148operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001149
Guido van Rossum48a680c2001-03-02 06:34:14 +00001150#ifdef RISCOS
1151/* s.sleeptaskw(1 | 0) method */
1152
1153static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001154sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001155{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001156 int block;
1157 int delay_flag;
1158 if (!PyArg_Parse(args, "i", &block))
1159 return NULL;
1160 Py_BEGIN_ALLOW_THREADS
1161 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1162 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001163
Guido van Rossum67f7a382002-06-06 21:08:16 +00001164 Py_INCREF(Py_None);
1165 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001166}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001167PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001168"sleeptaskw(flag)\n\
1169\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001170Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001171#endif
1172
1173
Guido van Rossumaee08791992-09-08 09:05:33 +00001174/* s.setsockopt() method.
1175 With an integer third argument, sets an integer option.
1176 With a string third argument, sets an option from a buffer;
1177 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001178
Guido van Rossum73624e91994-10-10 17:59:00 +00001179static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001180sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001181{
1182 int level;
1183 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001184 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001185 char *buf;
1186 int buflen;
1187 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001188
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001189 if (PyArg_ParseTuple(args, "iii:setsockopt",
1190 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001191 buf = (char *) &flag;
1192 buflen = sizeof flag;
1193 }
1194 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001195 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001196 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1197 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001198 return NULL;
1199 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001200 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001201 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001202 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001203 Py_INCREF(Py_None);
1204 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001205}
1206
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001207PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001208"setsockopt(level, option, value)\n\
1209\n\
1210Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001211The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001212
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001213
Guido van Rossumaee08791992-09-08 09:05:33 +00001214/* s.getsockopt() method.
1215 With two arguments, retrieves an integer option.
1216 With a third integer argument, retrieves a string buffer of that size;
1217 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001218
Guido van Rossum73624e91994-10-10 17:59:00 +00001219static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001220sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001221{
1222 int level;
1223 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001224 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001225 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001226 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001227
Guido van Rossumbcc20741998-08-04 22:53:56 +00001228#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001229 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001230 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001231 return NULL;
1232#else
1233
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001234 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1235 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001236 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001237
Guido van Rossumbe32c891996-06-20 16:25:29 +00001238 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001239 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001240 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001241 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001242 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001243 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001244 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001245 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001246 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001247#ifdef __VMS
1248 if (buflen > 1024) {
1249#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001250 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001251#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001252 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001253 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001254 return NULL;
1255 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001256 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001257 if (buf == NULL)
1258 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001259 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001260 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001261 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001262 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001263 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001264 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001265 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001266 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001267#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001268}
1269
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001270PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001271"getsockopt(level, option[, buffersize]) -> value\n\
1272\n\
1273Get a socket option. See the Unix manual for level and option.\n\
1274If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001275string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001276
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001277
Fred Drake728819a2000-07-01 03:40:12 +00001278/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001279
Guido van Rossum73624e91994-10-10 17:59:00 +00001280static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001281sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001282{
1283 struct sockaddr *addr;
1284 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001285 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001286
Fred Drake728819a2000-07-01 03:40:12 +00001287 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001288 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001289 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001290 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001291 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001292 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001293 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001294 Py_INCREF(Py_None);
1295 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001296}
1297
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001298PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001299"bind(address)\n\
1300\n\
1301Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001302pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001303sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001304
Guido van Rossum30a685f1991-06-27 15:51:29 +00001305
1306/* s.close() method.
1307 Set the file descriptor to -1 so operations tried subsequently
1308 will surely fail. */
1309
Guido van Rossum73624e91994-10-10 17:59:00 +00001310static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001311sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001312{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001313 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001314
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001315 if ((fd = s->sock_fd) != -1) {
1316 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001317 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001318 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001319 Py_END_ALLOW_THREADS
1320 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001321 Py_INCREF(Py_None);
1322 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001323}
1324
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001325PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001326"close()\n\
1327\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001328Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001329
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001330static int
1331internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1332{
1333 int res;
1334
1335 res = connect(s->sock_fd, addr, addrlen);
1336
1337#ifdef MS_WINDOWS
1338
1339 if (s->sock_timeout > 0.0) {
1340 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001341 /* This is a mess. Best solution: trust select */
1342 fd_set fds;
1343 struct timeval tv;
1344 tv.tv_sec = (int)s->sock_timeout;
1345 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1346 FD_ZERO(&fds);
1347 FD_SET(s->sock_fd, &fds);
1348 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1349 if (res == 0)
1350 res = WSAEWOULDBLOCK;
1351 else if (res > 0)
1352 res = 0;
1353 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001354 }
1355 }
1356
1357 if (res < 0)
1358 res = WSAGetLastError();
1359
1360#else
1361
1362 if (s->sock_timeout > 0.0) {
1363 if (res < 0 && errno == EINPROGRESS) {
1364 internal_select(s, 1);
1365 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001366 if (res < 0 && errno == EISCONN)
1367 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001368 }
1369 }
1370
1371 if (res < 0)
1372 res = errno;
1373
1374#endif
1375
1376 return res;
1377}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001378
Fred Drake728819a2000-07-01 03:40:12 +00001379/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001380
Guido van Rossum73624e91994-10-10 17:59:00 +00001381static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001382sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001383{
1384 struct sockaddr *addr;
1385 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001386 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001387
Fred Drake728819a2000-07-01 03:40:12 +00001388 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001389 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001390
Guido van Rossum73624e91994-10-10 17:59:00 +00001391 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001392 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001393 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001394
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001395 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001396 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001397 Py_INCREF(Py_None);
1398 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001399}
1400
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001401PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001402"connect(address)\n\
1403\n\
1404Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001405is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001406
Guido van Rossum30a685f1991-06-27 15:51:29 +00001407
Fred Drake728819a2000-07-01 03:40:12 +00001408/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001409
1410static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001411sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001412{
1413 struct sockaddr *addr;
1414 int addrlen;
1415 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001416
Fred Drake728819a2000-07-01 03:40:12 +00001417 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001418 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001419
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001420 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001421 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001422 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001423
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001424 return PyInt_FromLong((long) res);
1425}
1426
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001427PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001428"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001429\n\
1430This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001431instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001432
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001433
Guido van Rossumed233a51992-06-23 09:07:03 +00001434/* s.fileno() method */
1435
Guido van Rossum73624e91994-10-10 17:59:00 +00001436static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001437sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001438{
Fred Drakea04eaad2000-06-30 02:46:07 +00001439#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001440 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001441#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001442 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001443#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001444}
1445
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001446PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001447"fileno() -> integer\n\
1448\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001449Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001450
Guido van Rossumed233a51992-06-23 09:07:03 +00001451
Guido van Rossumbe32c891996-06-20 16:25:29 +00001452#ifndef NO_DUP
1453/* s.dup() method */
1454
1455static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001456sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001457{
Fred Drakea04eaad2000-06-30 02:46:07 +00001458 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001459 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001460
Guido van Rossumbe32c891996-06-20 16:25:29 +00001461 newfd = dup(s->sock_fd);
1462 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001463 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001464 sock = (PyObject *) new_sockobject(newfd,
1465 s->sock_family,
1466 s->sock_type,
1467 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001468 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001469 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001470 return sock;
1471}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001472
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001473PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001474"dup() -> socket object\n\
1475\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001476Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001477
Guido van Rossumbe32c891996-06-20 16:25:29 +00001478#endif
1479
1480
Guido van Rossumc89705d1992-11-26 08:54:07 +00001481/* s.getsockname() method */
1482
Guido van Rossum73624e91994-10-10 17:59:00 +00001483static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001484sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001485{
1486 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001487 int res;
1488 socklen_t addrlen;
1489
Guido van Rossumc89705d1992-11-26 08:54:07 +00001490 if (!getsockaddrlen(s, &addrlen))
1491 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001492 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001493 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001494 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001495 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001496 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001497 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001498 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001499}
1500
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001501PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001502"getsockname() -> address info\n\
1503\n\
1504Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001505info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001506
Guido van Rossumc89705d1992-11-26 08:54:07 +00001507
Guido van Rossumb6775db1994-08-01 11:34:53 +00001508#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001509/* s.getpeername() method */
1510
Guido van Rossum73624e91994-10-10 17:59:00 +00001511static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001512sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001513{
1514 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001515 int res;
1516 socklen_t addrlen;
1517
Guido van Rossumc89705d1992-11-26 08:54:07 +00001518 if (!getsockaddrlen(s, &addrlen))
1519 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001520 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001521 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001522 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001523 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001524 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001525 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001526 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001527}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001528
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001529PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001530"getpeername() -> address info\n\
1531\n\
1532Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001533info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001534
Guido van Rossumb6775db1994-08-01 11:34:53 +00001535#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001536
1537
Guido van Rossum30a685f1991-06-27 15:51:29 +00001538/* s.listen(n) method */
1539
Guido van Rossum73624e91994-10-10 17:59:00 +00001540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001541sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001542{
1543 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001544 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001545
1546 backlog = PyInt_AsLong(arg);
1547 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001548 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001549 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001550 if (backlog < 1)
1551 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001552 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001553 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001554 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001555 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001556 Py_INCREF(Py_None);
1557 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001558}
1559
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001560PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001561"listen(backlog)\n\
1562\n\
1563Enable a server to accept connections. The backlog argument must be at\n\
1564least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001565will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001566
1567
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001568#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001569/* s.makefile(mode) method.
1570 Create a new open file object referring to a dupped version of
1571 the socket's file descriptor. (The dup() call is necessary so
1572 that the open file and socket objects may be closed independent
1573 of each other.)
1574 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1575
Guido van Rossum73624e91994-10-10 17:59:00 +00001576static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001577sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001578{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001579 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001580 char *mode = "r";
1581 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001582#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001583 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001584#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001585 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001586#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001587 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001588 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001589#ifdef __VMS
1590 char *mode_r = "r";
1591 char *mode_w = "w";
1592#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001593
Guido van Rossum43713e52000-02-29 13:59:29 +00001594 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001595 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001596#ifdef __VMS
1597 if (strcmp(mode,"rb") == 0) {
1598 mode = mode_r;
1599 }
1600 else {
1601 if (strcmp(mode,"wb") == 0) {
1602 mode = mode_w;
1603 }
1604 }
1605#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001606#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001607 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1608 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001609#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001610 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001611#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001612 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001613 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001614 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001615 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001616 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001617#ifdef USE_GUSI2
1618 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001619 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001620 bufsize = 0;
1621#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001622 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1623 if (f != NULL)
1624 PyFile_SetBufSize(f, bufsize);
1625 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001626}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001627
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001628PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001629"makefile([mode[, buffersize]]) -> file object\n\
1630\n\
1631Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001632The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001633
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001634#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001635
Guido van Rossum48a680c2001-03-02 06:34:14 +00001636
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001637/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001638
Guido van Rossum73624e91994-10-10 17:59:00 +00001639static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001640sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001641{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001642 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001643 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001644#ifdef __VMS
1645 int read_length;
1646 char *read_buf;
1647#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001648
Guido van Rossum43713e52000-02-29 13:59:29 +00001649 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001650 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001651
1652 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001653 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001654 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001655 return NULL;
1656 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001657
Guido van Rossum73624e91994-10-10 17:59:00 +00001658 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001659 if (buf == NULL)
1660 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001661
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001662#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001663 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001664 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001665 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001666 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001667
Guido van Rossum7c53b771995-09-13 18:39:47 +00001668 if (n < 0) {
1669 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001670 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001671 }
Tim Peters5de98422002-04-27 18:44:32 +00001672 if (n != len)
1673 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001674#else
1675 read_buf = PyString_AsString(buf);
1676 read_length = len;
1677 while (read_length != 0) {
1678 unsigned int segment;
1679
1680 segment = read_length /SEGMENT_SIZE;
1681 if (segment != 0) {
1682 segment = SEGMENT_SIZE;
1683 }
1684 else {
1685 segment = read_length;
1686 }
1687
1688 Py_BEGIN_ALLOW_THREADS
1689 internal_select(s, 0);
1690 n = recv(s->sock_fd, read_buf, segment, flags);
1691 Py_END_ALLOW_THREADS
1692
1693 if (n < 0) {
1694 Py_DECREF(buf);
1695 return s->errorhandler();
1696 }
1697 if (n != read_length) {
1698 read_buf += n;
1699 break;
1700 }
1701
1702 read_length -= segment;
1703 read_buf += segment;
1704 }
1705 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1706 {
1707 return NULL;
1708 }
1709#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001710 return buf;
1711}
1712
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001713PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001714"recv(buffersize[, flags]) -> data\n\
1715\n\
1716Receive up to buffersize bytes from the socket. For the optional flags\n\
1717argument, see the Unix manual. When no data is available, block until\n\
1718at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001719the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001720
Guido van Rossum30a685f1991-06-27 15:51:29 +00001721
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001722/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001723
Guido van Rossum73624e91994-10-10 17:59:00 +00001724static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001725sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001726{
1727 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001728 PyObject *buf = NULL;
1729 PyObject *addr = NULL;
1730 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001731 int len, n, flags = 0;
1732 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001733
Guido van Rossum43713e52000-02-29 13:59:29 +00001734 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001735 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001736
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001737 if (!getsockaddrlen(s, &addrlen))
1738 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001739 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001740 if (buf == NULL)
1741 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001742
Guido van Rossum73624e91994-10-10 17:59:00 +00001743 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001744 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001745 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001746 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001747#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001748#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001749 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001750#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001751 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001752#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001753#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001754 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001755#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001756 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001757 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001758
Guido van Rossum7c53b771995-09-13 18:39:47 +00001759 if (n < 0) {
1760 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001761 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001762 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001763
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001764 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001765 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001766
Guido van Rossum67f7a382002-06-06 21:08:16 +00001767 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001768 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001769 goto finally;
1770
Guido van Rossum73624e91994-10-10 17:59:00 +00001771 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001772
1773finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001774 Py_XDECREF(addr);
1775 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001776 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001777}
1778
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001779PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001780"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1781\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001782Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001783
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001784/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001785
Guido van Rossum73624e91994-10-10 17:59:00 +00001786static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001787sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001788{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001789 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001790 int len, n, flags = 0;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001791#ifdef __VMS
1792 int send_length;
1793#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001794
Guido van Rossum43713e52000-02-29 13:59:29 +00001795 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001796 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001797
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001798#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001799 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001800 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001801 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001802 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001803
Guido van Rossum30a685f1991-06-27 15:51:29 +00001804 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001805 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001806#else
1807 /* Divide packet into smaller segments for */
1808 /* TCP/IP Services for OpenVMS */
1809 send_length = len;
1810 while (send_length != 0) {
1811 unsigned int segment;
1812
1813 segment = send_length / SEGMENT_SIZE;
1814 if (segment != 0) {
1815 segment = SEGMENT_SIZE;
1816 }
1817 else {
1818 segment = send_length;
1819 }
1820 Py_BEGIN_ALLOW_THREADS
1821 internal_select(s, 1);
1822 n = send(s->sock_fd, buf, segment, flags);
1823 Py_END_ALLOW_THREADS
1824 if (n < 0) {
1825 return s->errorhandler();
1826 }
1827 send_length -= segment;
1828 buf += segment;
1829 } /* end while */
1830#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001831 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001832}
1833
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001834PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001835"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001836\n\
1837Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001838argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001839sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001840
1841
1842/* s.sendall(data [,flags]) method */
1843
1844static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001845sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001846{
1847 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001848 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001849
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001850 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1851 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001852
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001853 Py_BEGIN_ALLOW_THREADS
1854 do {
Guido van Rossum8f24cdc2003-01-31 18:15:58 +00001855 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001856 n = send(s->sock_fd, buf, len, flags);
1857 if (n < 0)
1858 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001859 buf += n;
1860 len -= n;
1861 } while (len > 0);
1862 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001863
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001864 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001865 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001866
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001867 Py_INCREF(Py_None);
1868 return Py_None;
1869}
1870
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001871PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001872"sendall(data[, flags])\n\
1873\n\
1874Send a data string to the socket. For the optional flags\n\
1875argument, see the Unix manual. This calls send() repeatedly\n\
1876until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001877to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001878
Guido van Rossum30a685f1991-06-27 15:51:29 +00001879
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001880/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001881
Guido van Rossum73624e91994-10-10 17:59:00 +00001882static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001883sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001884{
Guido van Rossum73624e91994-10-10 17:59:00 +00001885 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001886 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001887 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001888 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001889
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001890 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001891 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001892 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001893 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1894 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001895 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001896 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001897
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001898 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001899 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001900
Guido van Rossum73624e91994-10-10 17:59:00 +00001901 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001902 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001903 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001904 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001905
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001906 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001907 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001908 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001909}
1910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001911PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001912"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001913\n\
1914Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001915For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001916
Guido van Rossum30a685f1991-06-27 15:51:29 +00001917
1918/* s.shutdown(how) method */
1919
Guido van Rossum73624e91994-10-10 17:59:00 +00001920static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001921sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001922{
1923 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001924 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001925
1926 how = PyInt_AsLong(arg);
1927 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001928 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001929 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001930 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001931 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001932 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001933 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001934 Py_INCREF(Py_None);
1935 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001936}
1937
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001938PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001939"shutdown(flag)\n\
1940\n\
1941Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001942of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001943
Guido van Rossum30a685f1991-06-27 15:51:29 +00001944
1945/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001946
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001947static PyMethodDef sock_methods[] = {
1948 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001949 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001950 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001951 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001952 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001953 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001954 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001955 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001956 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001957 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001958#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001959 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001960 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001961#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001962 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001963 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001964#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001965 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001966 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001967#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001968 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001969 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001970 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001971 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001972 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001973 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001974#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001975 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001976 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001977#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001978 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001979 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001980 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001981 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001982 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001983 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001984 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001985 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001986 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001987 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001988 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001989 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001990 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001991 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001992 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001993 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001994 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001995 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001996 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001997 shutdown_doc},
1998#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001999 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002000 sleeptaskw_doc},
2001#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002002 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002003};
2004
Guido van Rossum30a685f1991-06-27 15:51:29 +00002005
Guido van Rossum73624e91994-10-10 17:59:00 +00002006/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002007 First close the file description. */
2008
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002009static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002010sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002011{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002012 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002013 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002014 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002015}
2016
Guido van Rossum30a685f1991-06-27 15:51:29 +00002017
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002018static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002019sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002020{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002021 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002022#if SIZEOF_SOCKET_T > SIZEOF_LONG
2023 if (s->sock_fd > LONG_MAX) {
2024 /* this can occur on Win64, and actually there is a special
2025 ugly printf formatter for decimal pointer length integer
2026 printing, only bother if necessary*/
2027 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002028 "no printf formatter to display "
2029 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002030 return NULL;
2031 }
2032#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002033 PyOS_snprintf(
2034 buf, sizeof(buf),
2035 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2036 (long)s->sock_fd, s->sock_family,
2037 s->sock_type,
2038 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002039 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002040}
2041
2042
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002043/* Create a new, uninitialized socket object. */
2044
2045static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002046sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002047{
2048 PyObject *new;
2049
2050 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002051 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002052 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002053 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002054 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002055 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002056 return new;
2057}
2058
2059
2060/* Initialize a new socket object. */
2061
2062/*ARGSUSED*/
2063static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002064sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002065{
2066 PySocketSockObject *s = (PySocketSockObject *)self;
2067 SOCKET_T fd;
2068 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2069 static char *keywords[] = {"family", "type", "proto", 0};
2070
2071 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2072 "|iii:socket", keywords,
2073 &family, &type, &proto))
2074 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002075
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002076 Py_BEGIN_ALLOW_THREADS
2077 fd = socket(family, type, proto);
2078 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002079
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002080#ifdef MS_WINDOWS
2081 if (fd == INVALID_SOCKET)
2082#else
2083 if (fd < 0)
2084#endif
2085 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002086 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002087 return -1;
2088 }
2089 init_sockobject(s, fd, family, type, proto);
2090 /* From now on, ignore SIGPIPE and let the error checking
2091 do the work. */
2092#ifdef SIGPIPE
2093 (void) signal(SIGPIPE, SIG_IGN);
2094#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002095
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002096 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002097
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002098}
2099
2100
Guido van Rossumb6775db1994-08-01 11:34:53 +00002101/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002103static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002104 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002105 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002106 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002107 sizeof(PySocketSockObject), /* tp_basicsize */
2108 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002109 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002110 0, /* tp_print */
2111 0, /* tp_getattr */
2112 0, /* tp_setattr */
2113 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002114 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002115 0, /* tp_as_number */
2116 0, /* tp_as_sequence */
2117 0, /* tp_as_mapping */
2118 0, /* tp_hash */
2119 0, /* tp_call */
2120 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002121 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002122 0, /* tp_setattro */
2123 0, /* tp_as_buffer */
2124 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002125 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002126 0, /* tp_traverse */
2127 0, /* tp_clear */
2128 0, /* tp_richcompare */
2129 0, /* tp_weaklistoffset */
2130 0, /* tp_iter */
2131 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002132 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002133 0, /* tp_members */
2134 0, /* tp_getset */
2135 0, /* tp_base */
2136 0, /* tp_dict */
2137 0, /* tp_descr_get */
2138 0, /* tp_descr_set */
2139 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002140 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002141 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002142 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002143 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002144};
2145
Guido van Rossum30a685f1991-06-27 15:51:29 +00002146
Guido van Rossum81194471991-07-27 21:42:02 +00002147/* Python interface to gethostname(). */
2148
2149/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002151socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002152{
2153 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002154 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002155 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002156 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002157 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002158 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002159 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002160 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002161 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002162 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002163 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002164}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002165
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002166PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002167"gethostname() -> string\n\
2168\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002169Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002170
Guido van Rossumff4949e1992-08-05 19:58:53 +00002171
Guido van Rossum30a685f1991-06-27 15:51:29 +00002172/* Python interface to gethostbyname(name). */
2173
2174/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002175static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002176socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002177{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002178 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002179 struct sockaddr_storage addrbuf;
2180
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002181 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002182 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002183 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002184 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002185 return makeipaddr((struct sockaddr *)&addrbuf,
2186 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002187}
2188
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002189PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002190"gethostbyname(host) -> address\n\
2191\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002192Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002193
2194
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002195/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2196
2197static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002198gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002199{
2200 char **pch;
2201 PyObject *rtn_tuple = (PyObject *)NULL;
2202 PyObject *name_list = (PyObject *)NULL;
2203 PyObject *addr_list = (PyObject *)NULL;
2204 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002205
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002206 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002207 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002208#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002209 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002210#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002211 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002212#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002213 return NULL;
2214 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002215
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002216 if (h->h_addrtype != af) {
2217#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002218 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002219 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002220 (char *)strerror(EAFNOSUPPORT));
2221#else
2222 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002223 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002224 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002225#endif
2226 return NULL;
2227 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002228
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002229 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002230
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002231 case AF_INET:
2232 if (alen < sizeof(struct sockaddr_in))
2233 return NULL;
2234 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002235
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002236#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002237 case AF_INET6:
2238 if (alen < sizeof(struct sockaddr_in6))
2239 return NULL;
2240 break;
2241#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002242
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002243 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002244
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002245 if ((name_list = PyList_New(0)) == NULL)
2246 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002247
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002248 if ((addr_list = PyList_New(0)) == NULL)
2249 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002250
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002251 for (pch = h->h_aliases; *pch != NULL; pch++) {
2252 int status;
2253 tmp = PyString_FromString(*pch);
2254 if (tmp == NULL)
2255 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002256
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002257 status = PyList_Append(name_list, tmp);
2258 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002259
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002260 if (status)
2261 goto err;
2262 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002263
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002264 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2265 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002266
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002267 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002268
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002269 case AF_INET:
2270 {
2271 struct sockaddr_in sin;
2272 memset(&sin, 0, sizeof(sin));
2273 sin.sin_family = af;
2274#ifdef HAVE_SOCKADDR_SA_LEN
2275 sin.sin_len = sizeof(sin);
2276#endif
2277 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2278 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002279
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002280 if (pch == h->h_addr_list && alen >= sizeof(sin))
2281 memcpy((char *) addr, &sin, sizeof(sin));
2282 break;
2283 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002284
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002285#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002286 case AF_INET6:
2287 {
2288 struct sockaddr_in6 sin6;
2289 memset(&sin6, 0, sizeof(sin6));
2290 sin6.sin6_family = af;
2291#ifdef HAVE_SOCKADDR_SA_LEN
2292 sin6.sin6_len = sizeof(sin6);
2293#endif
2294 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2295 tmp = makeipaddr((struct sockaddr *)&sin6,
2296 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002297
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002298 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2299 memcpy((char *) addr, &sin6, sizeof(sin6));
2300 break;
2301 }
2302#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002303
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002304 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002305 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002306 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002307 return NULL;
2308 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002309
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002310 if (tmp == NULL)
2311 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002312
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002313 status = PyList_Append(addr_list, tmp);
2314 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002315
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002316 if (status)
2317 goto err;
2318 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002319
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002320 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002321
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002322 err:
2323 Py_XDECREF(name_list);
2324 Py_XDECREF(addr_list);
2325 return rtn_tuple;
2326}
2327
2328
2329/* Python interface to gethostbyname_ex(name). */
2330
2331/*ARGSUSED*/
2332static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002333socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002334{
2335 char *name;
2336 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002337 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002338 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002339 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002340#ifdef HAVE_GETHOSTBYNAME_R
2341 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002342#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2343 struct hostent_data data;
2344#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002345 char buf[16384];
2346 int buf_len = (sizeof buf) - 1;
2347 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002348#endif
2349#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002350 int result;
2351#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002352#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002353
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002354 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002355 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002356 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002357 return NULL;
2358 Py_BEGIN_ALLOW_THREADS
2359#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002360#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002361 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2362 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002363#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002364 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002365#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002366 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002367 result = gethostbyname_r(name, &hp_allocated, &data);
2368 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002369#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002370#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002371#ifdef USE_GETHOSTBYNAME_LOCK
2372 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002373#endif
2374 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002375#endif /* HAVE_GETHOSTBYNAME_R */
2376 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002377 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002378 addr.ss_family.
2379 Therefore, we cast the sockaddr_storage into sockaddr to
2380 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002381 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002382 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002383 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002384#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002385 PyThread_release_lock(gethostbyname_lock);
2386#endif
2387 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002388}
2389
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002390PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002391"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2392\n\
2393Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002394for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002395
2396
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002397/* Python interface to gethostbyaddr(IP). */
2398
2399/*ARGSUSED*/
2400static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002401socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002402{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002403#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002404 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002405#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002406 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002407#endif
2408 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002409 char *ip_num;
2410 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002411 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002412#ifdef HAVE_GETHOSTBYNAME_R
2413 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002414#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2415 struct hostent_data data;
2416#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002417 char buf[16384];
2418 int buf_len = (sizeof buf) - 1;
2419 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002420#endif
2421#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002422 int result;
2423#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002424#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002425 char *ap;
2426 int al;
2427 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002428
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002429 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002430 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002431 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002432 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002433 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002434 af = sa->sa_family;
2435 ap = NULL;
2436 al = 0;
2437 switch (af) {
2438 case AF_INET:
2439 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2440 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2441 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002442#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002443 case AF_INET6:
2444 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2445 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2446 break;
2447#endif
2448 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002449 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002450 return NULL;
2451 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002452 Py_BEGIN_ALLOW_THREADS
2453#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002454#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002455 result = gethostbyaddr_r(ap, al, af,
2456 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002457 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002458#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002459 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002460 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002461#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002462 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002463 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002464 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002465#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002466#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002467#ifdef USE_GETHOSTBYNAME_LOCK
2468 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002469#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002470 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002471#endif /* HAVE_GETHOSTBYNAME_R */
2472 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002473 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002474#ifdef USE_GETHOSTBYNAME_LOCK
2475 PyThread_release_lock(gethostbyname_lock);
2476#endif
2477 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002478}
2479
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002480PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002481"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2482\n\
2483Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002484for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002485
Guido van Rossum30a685f1991-06-27 15:51:29 +00002486
2487/* Python interface to getservbyname(name).
2488 This only returns the port number, since the other info is already
2489 known or not useful (like the list of aliases). */
2490
2491/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002493socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002494{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002495 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002496 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002497 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002498 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002499 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002500 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002501 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002502 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002503 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002504 return NULL;
2505 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002506 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002507}
2508
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002509PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002510"getservbyname(servicename, protocolname) -> integer\n\
2511\n\
2512Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002513The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002514
Guido van Rossum30a685f1991-06-27 15:51:29 +00002515
Guido van Rossum3901d851996-12-19 16:35:04 +00002516/* Python interface to getprotobyname(name).
2517 This only returns the protocol number, since the other info is
2518 already known or not useful (like the list of aliases). */
2519
2520/*ARGSUSED*/
2521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002522socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002523{
2524 char *name;
2525 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002526#ifdef __BEOS__
2527/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002528 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002529 return NULL;
2530#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002531 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002532 return NULL;
2533 Py_BEGIN_ALLOW_THREADS
2534 sp = getprotobyname(name);
2535 Py_END_ALLOW_THREADS
2536 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002537 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002538 return NULL;
2539 }
2540 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002541#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002542}
2543
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002544PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002545"getprotobyname(name) -> integer\n\
2546\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002547Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002548
Guido van Rossum3901d851996-12-19 16:35:04 +00002549
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002550#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002551/* Create a socket object from a numeric file description.
2552 Useful e.g. if stdin is a socket.
2553 Additional arguments as for socket(). */
2554
2555/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002556static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002557socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002558{
Guido van Rossum73624e91994-10-10 17:59:00 +00002559 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002560 SOCKET_T fd;
2561 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002562 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2563 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002564 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002565 /* Dup the fd so it and the socket can be closed independently */
2566 fd = dup(fd);
2567 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002568 return set_error();
2569 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002570 /* From now on, ignore SIGPIPE and let the error checking
2571 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002572#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002573 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002574#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002575 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002576}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002577
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002578PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002579"fromfd(fd, family, type[, proto]) -> socket object\n\
2580\n\
2581Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002582The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002583
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002584#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002585
Guido van Rossum82a5c661998-07-07 20:45:43 +00002586
Guido van Rossum006bf911996-06-12 04:04:55 +00002587static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002588socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002589{
2590 int x1, x2;
2591
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002592 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002593 return NULL;
2594 }
2595 x2 = (int)ntohs((short)x1);
2596 return PyInt_FromLong(x2);
2597}
2598
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002599PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002600"ntohs(integer) -> integer\n\
2601\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002602Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002603
2604
Guido van Rossum006bf911996-06-12 04:04:55 +00002605static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002606socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002607{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002608 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002609
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002610 if (PyInt_Check(arg)) {
2611 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002612 if (x == (unsigned long) -1 && PyErr_Occurred())
2613 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002614 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002615 else if (PyLong_Check(arg)) {
2616 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002617 if (x == (unsigned long) -1 && PyErr_Occurred())
2618 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002619#if SIZEOF_LONG > 4
2620 {
2621 unsigned long y;
2622 /* only want the trailing 32 bits */
2623 y = x & 0xFFFFFFFFUL;
2624 if (y ^ x)
2625 return PyErr_Format(PyExc_OverflowError,
2626 "long int larger than 32 bits");
2627 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002628 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002629#endif
2630 }
2631 else
Tim Peters58141872002-08-06 22:25:02 +00002632 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002633 "expected int/long, %s found",
2634 arg->ob_type->tp_name);
2635 if (x == (unsigned long) -1 && PyErr_Occurred())
2636 return NULL;
2637 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002638}
2639
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002640PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002641"ntohl(integer) -> integer\n\
2642\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002643Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002644
2645
Guido van Rossum006bf911996-06-12 04:04:55 +00002646static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002647socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002648{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002649 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002650
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002651 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002652 return NULL;
2653 }
2654 x2 = (int)htons((short)x1);
2655 return PyInt_FromLong(x2);
2656}
2657
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002658PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002659"htons(integer) -> integer\n\
2660\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002661Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002662
2663
Guido van Rossum006bf911996-06-12 04:04:55 +00002664static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002665socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002666{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002667 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002668
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002669 if (PyInt_Check(arg)) {
2670 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002671 if (x == (unsigned long) -1 && PyErr_Occurred())
2672 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002673 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002674 else if (PyLong_Check(arg)) {
2675 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002676 if (x == (unsigned long) -1 && PyErr_Occurred())
2677 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002678#if SIZEOF_LONG > 4
2679 {
2680 unsigned long y;
2681 /* only want the trailing 32 bits */
2682 y = x & 0xFFFFFFFFUL;
2683 if (y ^ x)
2684 return PyErr_Format(PyExc_OverflowError,
2685 "long int larger than 32 bits");
2686 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002687 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002688#endif
2689 }
2690 else
Tim Peters58141872002-08-06 22:25:02 +00002691 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002692 "expected int/long, %s found",
2693 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002694 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002695}
2696
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002697PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002698"htonl(integer) -> integer\n\
2699\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002700Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002701
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002702/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002703
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002704PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002705"inet_aton(string) -> packed 32-bit IP representation\n\
2706\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002707Convert 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 +00002708binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002709
2710static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002711socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002712{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002713#ifndef INADDR_NONE
2714#define INADDR_NONE (-1)
2715#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002716#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002717 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002718#else
2719 /* Have to use inet_addr() instead */
2720 unsigned long packed_addr;
2721#endif
2722 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002723
Tim Peters1df9fdd2003-02-13 03:13:40 +00002724 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002725 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002726
Tim Peters1df9fdd2003-02-13 03:13:40 +00002727
2728#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002729 if (inet_aton(ip_addr, &buf))
2730 return PyString_FromStringAndSize((char *)(&buf),
2731 sizeof(buf));
2732
2733 PyErr_SetString(socket_error,
2734 "illegal IP address string passed to inet_aton");
2735 return NULL;
2736
Tim Peters1df9fdd2003-02-13 03:13:40 +00002737#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002738 /* XXX Problem here: inet_aton('255.255.255.255') raises
2739 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002740 packed_addr = inet_addr(ip_addr);
2741
2742 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002743 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002744 "illegal IP address string passed to inet_aton");
2745 return NULL;
2746 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002747 return PyString_FromStringAndSize((char *) &packed_addr,
2748 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002749#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002750}
2751
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002752PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002753"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002754\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002755Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002756
2757static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002758socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002759{
2760 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002761 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002762 struct in_addr packed_addr;
2763
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002764 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002765 return NULL;
2766 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002767
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002768 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002769 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002770 "packed IP wrong length for inet_ntoa");
2771 return NULL;
2772 }
2773
2774 memcpy(&packed_addr, packed_str, addr_len);
2775
2776 return PyString_FromString(inet_ntoa(packed_addr));
2777}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002778
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002779/* Python interface to getaddrinfo(host, port). */
2780
2781/*ARGSUSED*/
2782static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002783socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002784{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002785 struct addrinfo hints, *res;
2786 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002787 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002788 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002789 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002790 char *hptr, *pptr;
2791 int family, socktype, protocol, flags;
2792 int error;
2793 PyObject *all = (PyObject *)NULL;
2794 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002795 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002796
2797 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002798 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002799 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
2800 &hobj, &pobj, &family, &socktype,
2801 &protocol, &flags)) {
2802 return NULL;
2803 }
2804 if (hobj == Py_None) {
2805 hptr = NULL;
2806 } else if (PyUnicode_Check(hobj)) {
2807 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
2808 if (!idna)
2809 return NULL;
2810 hptr = PyString_AsString(idna);
2811 } else if (PyString_Check(hobj)) {
2812 hptr = PyString_AsString(hobj);
2813 } else {
2814 PyErr_SetString(PyExc_TypeError,
2815 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002816 return NULL;
2817 }
2818 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002819 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002820 pptr = pbuf;
2821 } else if (PyString_Check(pobj)) {
2822 pptr = PyString_AsString(pobj);
2823 } else if (pobj == Py_None) {
2824 pptr = (char *)NULL;
2825 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002826 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002827 return NULL;
2828 }
2829 memset(&hints, 0, sizeof(hints));
2830 hints.ai_family = family;
2831 hints.ai_socktype = socktype;
2832 hints.ai_protocol = protocol;
2833 hints.ai_flags = flags;
2834 error = getaddrinfo(hptr, pptr, &hints, &res0);
2835 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002836 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002837 return NULL;
2838 }
2839
2840 if ((all = PyList_New(0)) == NULL)
2841 goto err;
2842 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002843 PyObject *addr =
2844 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2845 if (addr == NULL)
2846 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002847 single = Py_BuildValue("iiisO", res->ai_family,
2848 res->ai_socktype, res->ai_protocol,
2849 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002850 addr);
2851 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002852 if (single == NULL)
2853 goto err;
2854
2855 if (PyList_Append(all, single))
2856 goto err;
2857 Py_XDECREF(single);
2858 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00002859 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00002860 if (res0)
2861 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002862 return all;
2863 err:
2864 Py_XDECREF(single);
2865 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00002866 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002867 if (res0)
2868 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002869 return (PyObject *)NULL;
2870}
2871
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002872PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002873"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2874 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002875\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002876Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002877
2878/* Python interface to getnameinfo(sa, flags). */
2879
2880/*ARGSUSED*/
2881static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002882socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002883{
2884 PyObject *sa = (PyObject *)NULL;
2885 int flags;
2886 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002887 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002888 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2889 struct addrinfo hints, *res = NULL;
2890 int error;
2891 PyObject *ret = (PyObject *)NULL;
2892
2893 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002894 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002895 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002896 if (!PyArg_ParseTuple(sa, "si|ii",
2897 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002898 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002899 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002900 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002901 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002902 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002903 error = getaddrinfo(hostp, pbuf, &hints, &res);
2904 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002905 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002906 goto fail;
2907 }
2908 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002909 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002910 "sockaddr resolved to multiple addresses");
2911 goto fail;
2912 }
2913 switch (res->ai_family) {
2914 case AF_INET:
2915 {
2916 char *t1;
2917 int t2;
2918 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002919 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002920 "IPv4 sockaddr must be 2 tuple");
2921 goto fail;
2922 }
2923 break;
2924 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002925#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002926 case AF_INET6:
2927 {
2928 struct sockaddr_in6 *sin6;
2929 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2930 sin6->sin6_flowinfo = flowinfo;
2931 sin6->sin6_scope_id = scope_id;
2932 break;
2933 }
2934#endif
2935 }
2936 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2937 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2938 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002939 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002940 goto fail;
2941 }
2942 ret = Py_BuildValue("ss", hbuf, pbuf);
2943
2944fail:
2945 if (res)
2946 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002947 return ret;
2948}
2949
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002950PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002951"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002952\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002953Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002954
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002955
2956/* Python API to getting and setting the default timeout value. */
2957
2958static PyObject *
2959socket_getdefaulttimeout(PyObject *self)
2960{
2961 if (defaulttimeout < 0.0) {
2962 Py_INCREF(Py_None);
2963 return Py_None;
2964 }
2965 else
2966 return PyFloat_FromDouble(defaulttimeout);
2967}
2968
2969PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002970"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002971\n\
2972Returns the default timeout in floating seconds for new socket objects.\n\
2973A value of None indicates that new socket objects have no timeout.\n\
2974When the socket module is first imported, the default is None.");
2975
2976static PyObject *
2977socket_setdefaulttimeout(PyObject *self, PyObject *arg)
2978{
2979 double timeout;
2980
2981 if (arg == Py_None)
2982 timeout = -1.0;
2983 else {
2984 timeout = PyFloat_AsDouble(arg);
2985 if (timeout < 0.0) {
2986 if (!PyErr_Occurred())
2987 PyErr_SetString(PyExc_ValueError,
2988 "Timeout value out of range");
2989 return NULL;
2990 }
2991 }
2992
2993 defaulttimeout = timeout;
2994
2995 Py_INCREF(Py_None);
2996 return Py_None;
2997}
2998
2999PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003000"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003001\n\
3002Set the default timeout in floating seconds for new socket objects.\n\
3003A value of None indicates that new socket objects have no timeout.\n\
3004When the socket module is first imported, the default is None.");
3005
3006
Guido van Rossum30a685f1991-06-27 15:51:29 +00003007/* List of functions exported by this module. */
3008
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003009static PyMethodDef socket_methods[] = {
3010 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003011 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003012 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003013 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003014 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003015 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003016 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003017 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003018 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003019 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003020 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003021 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003022#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003023 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003024 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003025#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003026 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003027 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003028 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003029 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003030 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003031 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003032 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003033 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003034 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003035 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003036 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003037 METH_VARARGS, inet_ntoa_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003038 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003039 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003040 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003041 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003042 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003043 METH_NOARGS, getdefaulttimeout_doc},
3044 {"setdefaulttimeout", socket_setdefaulttimeout,
3045 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003046 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003047};
3048
Guido van Rossum30a685f1991-06-27 15:51:29 +00003049
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003050#ifdef RISCOS
3051#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003052
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003053static int
3054os_init(void)
3055{
3056 _kernel_swi_regs r;
3057
3058 r.r[0] = 0;
3059 _kernel_swi(0x43380, &r, &r);
3060 taskwindow = r.r[0];
3061
3062 return 0;
3063}
3064
3065#endif /* RISCOS */
3066
3067
3068#ifdef MS_WINDOWS
3069#define OS_INIT_DEFINED
3070
3071/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003072
3073static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003074os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003075{
3076 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003077}
3078
3079static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003080os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003081{
3082 WSADATA WSAData;
3083 int ret;
3084 char buf[100];
3085 ret = WSAStartup(0x0101, &WSAData);
3086 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003087 case 0: /* No error */
3088 atexit(os_cleanup);
3089 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003090 case WSASYSNOTREADY:
3091 PyErr_SetString(PyExc_ImportError,
3092 "WSAStartup failed: network not ready");
3093 break;
3094 case WSAVERNOTSUPPORTED:
3095 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003096 PyErr_SetString(
3097 PyExc_ImportError,
3098 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003099 break;
3100 default:
Tim Peters885d4572001-11-28 20:27:42 +00003101 PyOS_snprintf(buf, sizeof(buf),
3102 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003103 PyErr_SetString(PyExc_ImportError, buf);
3104 break;
3105 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003106 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003107}
3108
Guido van Rossum8d665e61996-06-26 18:22:49 +00003109#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003110
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003111
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003112#ifdef PYOS_OS2
3113#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003114
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003115/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003116
3117static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003118os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003119{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003120#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003121 char reason[64];
3122 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003123
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003124 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003125 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003126 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003127
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003128 PyOS_snprintf(reason, sizeof(reason),
3129 "OS/2 TCP/IP Error# %d", sock_errno());
3130 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003131
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003132 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003133#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003134 /* No need to initialise sockets with GCC/EMX */
3135 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003136#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003137}
3138
3139#endif /* PYOS_OS2 */
3140
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003141
3142#ifndef OS_INIT_DEFINED
3143static int
3144os_init(void)
3145{
3146 return 1; /* Success */
3147}
3148#endif
3149
3150
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003151/* C API table - always add new things to the end for binary
3152 compatibility. */
3153static
3154PySocketModule_APIObject PySocketModuleAPI =
3155{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003156 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003157};
3158
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003159
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003160/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003161
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003162 This module is actually called "_socket", and there's a wrapper
3163 "socket.py" which implements some additional functionality. On some
3164 platforms (e.g. Windows and OS/2), socket.py also implements a
3165 wrapper for the socket type that provides missing functionality such
3166 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3167 with an ImportError exception if os-specific initialization fails.
3168 On Windows, this does WINSOCK initialization. When WINSOCK is
3169 initialized succesfully, a call to WSACleanup() is scheduled to be
3170 made at exit time.
3171*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003172
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003173PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003174"Implementation module for socket operations.\n\
3175\n\
3176See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003177
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003178PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003179init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003180{
Fred Drake4baedc12002-04-01 14:53:37 +00003181 PyObject *m;
Fred Drake4baedc12002-04-01 14:53:37 +00003182
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003183 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003184 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003185
3186 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003187 m = Py_InitModule3(PySocket_MODULE_NAME,
3188 socket_methods,
3189 socket_doc);
3190
3191 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3192 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003193 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003194 Py_INCREF(socket_error);
3195 PyModule_AddObject(m, "error", socket_error);
3196 socket_herror = PyErr_NewException("socket.herror",
3197 socket_error, NULL);
3198 if (socket_herror == NULL)
3199 return;
3200 Py_INCREF(socket_herror);
3201 PyModule_AddObject(m, "herror", socket_herror);
3202 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003203 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003204 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003205 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003206 Py_INCREF(socket_gaierror);
3207 PyModule_AddObject(m, "gaierror", socket_gaierror);
3208 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003209 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003210 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003211 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003212 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003213 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003214 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003215 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003216
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003217 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003218 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003219 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3220 ) != 0)
3221 return;
3222
Guido van Rossum09be4091999-08-09 14:40:40 +00003223 /* Address families (we only support AF_INET and AF_UNIX) */
3224#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003225 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003226#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003227 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003228#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003229 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003230#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003231#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003232 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003233#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003234#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003235 /* Amateur Radio AX.25 */
3236 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003237#endif
3238#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003239 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003240#endif
3241#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003242 /* Appletalk DDP */
3243 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003244#endif
3245#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003246 /* Amateur radio NetROM */
3247 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003248#endif
3249#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003250 /* Multiprotocol bridge */
3251 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003252#endif
3253#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003254 /* Reserved for Werner's ATM */
3255 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003256#endif
3257#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003258 /* Reserved for X.25 project */
3259 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003260#endif
3261#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003262 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003263#endif
3264#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003265 /* Amateur Radio X.25 PLP */
3266 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003267#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003268#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003269 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3270 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3271 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3272 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3273 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3274 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3275 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3276 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3277 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003278#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003279
3280 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003281 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3282 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003283#ifndef __BEOS__
3284/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003285 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3286 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003287#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003288 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003289#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003290#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003291
3292#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003293 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003294#endif
3295#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003296 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003297#endif
3298#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003299 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003300#endif
3301#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003302 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003303#endif
3304#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003305 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003306#endif
3307#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003308 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003309#endif
3310#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003311 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003312#endif
3313#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003314 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003315#endif
3316#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003317 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003318#endif
3319#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003320 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003321#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003322#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003323 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003324#endif
3325#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003326 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003327#endif
3328#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003329 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003330#endif
3331#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003332 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003333#endif
3334#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003335 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003336#endif
3337#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003338 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003339#endif
3340#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003341 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003342#endif
3343#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003344 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003345#endif
3346
3347 /* Maximum number of connections for "listen" */
3348#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003349 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003350#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003351 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003352#endif
3353
3354 /* Flags for send, recv */
3355#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003356 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003357#endif
3358#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003359 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003360#endif
3361#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003362 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003363#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003364#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003365 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003366#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003367#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003368 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003369#endif
3370#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003371 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003372#endif
3373#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003374 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003375#endif
3376#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003377 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003378#endif
3379#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003380 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003381#endif
3382#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003383 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003384#endif
3385
3386 /* Protocol level and numbers, usable for [gs]etsockopt */
3387#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003388 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003389#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003390#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003391 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003392#else
Fred Drake4baedc12002-04-01 14:53:37 +00003393 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003394#endif
3395#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003396 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003397#endif
3398#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003399 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003400#endif
3401#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003402 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003403#endif
3404#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003405 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003406#endif
3407#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003408 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003409#endif
3410#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003411 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003412#else
Fred Drake4baedc12002-04-01 14:53:37 +00003413 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003414#endif
3415#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003416 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003417#else
Fred Drake4baedc12002-04-01 14:53:37 +00003418 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003419#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003420#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003421 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003422#else
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003424#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003425#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003426 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003427#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003428#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003429 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003430#else
Fred Drake4baedc12002-04-01 14:53:37 +00003431 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003432#endif
3433#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003434 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003435#endif
3436#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003437 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003438#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003439#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003440 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003441#endif
3442#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003443 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003444#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003445#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003446 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003447#else
Fred Drake4baedc12002-04-01 14:53:37 +00003448 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003449#endif
3450#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003451 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003452#endif
3453#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003454 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003455#endif
3456#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003457 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003458#else
Fred Drake4baedc12002-04-01 14:53:37 +00003459 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003460#endif
3461#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003462 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003463#endif
3464#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003465 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003466#endif
3467#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003468 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003469#endif
3470#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003471 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003472#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003473#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003474 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003475#endif
3476#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003477 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003478#endif
3479#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003480 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003481#endif
3482#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003483 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003484#endif
3485#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003486 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003487#endif
3488#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003489 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003490#endif
3491#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003492 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003493#endif
3494#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003495 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003496#endif
3497#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003498 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003499#endif
3500#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003501 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003502#endif
3503#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003504 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003505#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003506#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003507 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003508#endif
3509#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003510 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003511#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003512#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003513 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003514#endif
3515#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003516 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003517#endif
3518#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003519 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003520#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003521#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003522 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003523#endif
3524/**/
3525#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003526 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003527#else
Fred Drake4baedc12002-04-01 14:53:37 +00003528 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003529#endif
3530#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003531 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003532#endif
3533
3534 /* Some port configuration */
3535#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003536 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003537#else
Fred Drake4baedc12002-04-01 14:53:37 +00003538 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003539#endif
3540#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003541 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003542#else
Fred Drake4baedc12002-04-01 14:53:37 +00003543 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003544#endif
3545
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003546 /* Some reserved IP v.4 addresses */
3547#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003548 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003549#else
Fred Drake4baedc12002-04-01 14:53:37 +00003550 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003551#endif
3552#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003553 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003554#else
Fred Drake4baedc12002-04-01 14:53:37 +00003555 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003556#endif
3557#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003558 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003559#else
Fred Drake4baedc12002-04-01 14:53:37 +00003560 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003561#endif
3562#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003563 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003564#else
Fred Drake4baedc12002-04-01 14:53:37 +00003565 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003566#endif
3567#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003568 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3569 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003570#else
Fred Drake4baedc12002-04-01 14:53:37 +00003571 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003572#endif
3573#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003574 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3575 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003576#else
Fred Drake4baedc12002-04-01 14:53:37 +00003577 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003578#endif
3579#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003580 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003581#else
Fred Drake4baedc12002-04-01 14:53:37 +00003582 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003583#endif
3584
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003585 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003586#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003587 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003588#endif
3589#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003590 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003591#endif
3592#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003593 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003594#endif
3595#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003596 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003597#endif
3598#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003599 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003600#endif
3601#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003602 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003603#endif
3604#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003605 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003606#endif
3607#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003608 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003609#endif
3610#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003611 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003612#endif
3613#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003614 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003615#endif
3616#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003617 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003618#endif
3619#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003620 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003621#endif
3622#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003623 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003624#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003625#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003626 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3627 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003628#endif
3629#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003630 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3631 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003632#endif
3633#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003634 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003635#endif
3636
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003637 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3638#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003639 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003640#endif
3641#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003642 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003643#endif
3644#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003645 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003646#endif
3647#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003648 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003649#endif
3650#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003651 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003652#endif
3653#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003654 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003655#endif
3656
Guido van Rossum09be4091999-08-09 14:40:40 +00003657 /* TCP options */
3658#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003659 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003660#endif
3661#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003662 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003663#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003664#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003665 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003666#endif
3667#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003668 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003669#endif
3670#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003671 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003672#endif
3673#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003674 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003675#endif
3676#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003677 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003678#endif
3679#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003680 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003681#endif
3682#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003683 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003684#endif
3685#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003686 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003687#endif
3688#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003689 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003690#endif
3691#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003692 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003693#endif
3694
Guido van Rossum09be4091999-08-09 14:40:40 +00003695
3696 /* IPX options */
3697#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003698 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003699#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003700
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003701 /* get{addr,name}info parameters */
3702#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003703 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003704#endif
3705#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003706 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003707#endif
3708#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003709 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003710#endif
3711#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003712 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003713#endif
3714#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003715 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003716#endif
3717#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003718 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003719#endif
3720#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003721 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003722#endif
3723#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003724 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003725#endif
3726#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003727 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003728#endif
3729#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003730 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003731#endif
3732#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003733 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003734#endif
3735#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003736 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003737#endif
3738#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003739 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003740#endif
3741#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003742 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003743#endif
3744#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003745 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003746#endif
3747#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003748 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003749#endif
3750#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003751 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003752#endif
3753#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003754 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003755#endif
3756#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003757 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003758#endif
3759#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003760 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003761#endif
3762#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003763 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003764#endif
3765#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003766 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003767#endif
3768#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003769 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003770#endif
3771#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003772 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003773#endif
3774#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003775 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003776#endif
3777#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003778 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003779#endif
3780#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003781 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003782#endif
3783#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003784 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003785#endif
3786#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003787 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003788#endif
3789#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003790 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003791#endif
3792
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003793 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003794#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003795 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003796#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003797}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003798
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003799
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003800#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003801
3802/* Simplistic emulation code for inet_pton that only works for IPv4 */
3803
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003804int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003805inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003806{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003807 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003808 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003809 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003810 if (packed_addr == INADDR_NONE)
3811 return 0;
3812 memcpy(dst, &packed_addr, 4);
3813 return 1;
3814 }
3815 /* Should set errno to EAFNOSUPPORT */
3816 return -1;
3817}
3818
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003819const char *
3820inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003821{
3822 if (af == AF_INET) {
3823 struct in_addr packed_addr;
3824 if (size < 16)
3825 /* Should set errno to ENOSPC. */
3826 return NULL;
3827 memcpy(&packed_addr, src, sizeof(packed_addr));
3828 return strncpy(dst, inet_ntoa(packed_addr), size);
3829 }
3830 /* Should set errno to EAFNOSUPPORT */
3831 return NULL;
3832}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003833
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003834#endif