blob: d7354ba1f1698c814c07b883443a1bb490a365af [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 Rossum30a685f1991-06-27 15:51:29 +000022- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000023- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000024- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000025- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000027- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000028- socket.ntohs(16 bit value) --> new int object
29- socket.ntohl(32 bit value) --> new int object
30- socket.htons(16 bit value) --> new int object
31- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000032- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
33 --> List of (family, socktype, proto, canonname, sockaddr)
34- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000035- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000036- socket.inet_aton(IP address) -> 32-bit packed IP representation
37- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000038- socket.getdefaulttimeout() -> None | float
39- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000040- an Internet socket address is a pair (hostname, port)
41 where hostname can be anything recognized by gethostbyname()
42 (including the dd.dd.dd.dd notation) and port is in host byte order
43- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000044- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000045- an AF_PACKET socket address is a tuple containing a string
46 specifying the ethernet interface and an integer specifying
47 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000048 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
49 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000050 networking code, but accepted since they are returned by the
51 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000052
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000053Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000054
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000055- names starting with sock_ are socket object methods
56- names starting with socket_ are module-level functions
57- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000058
Guido van Rossum6574b3e1991-06-25 21:36:08 +000059*/
60
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000061#include "Python.h"
62
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000063/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000064PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000065"socket([family[, type[, proto]]]) -> socket object\n\
66\n\
67Open a socket of the given type. The family argument specifies the\n\
68address family; it defaults to AF_INET. The type argument specifies\n\
69whether this is a stream (SOCK_STREAM, this is the default)\n\
70or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
71specifying the default protocol. Keyword arguments are accepted.\n\
72\n\
73A socket object represents one endpoint of a network connection.\n\
74\n\
75Methods of socket objects (keyword arguments not allowed):\n\
76\n\
77accept() -- accept a connection, returning new socket and client address\n\
78bind(addr) -- bind the socket to a local address\n\
79close() -- close the socket\n\
80connect(addr) -- connect the socket to a remote address\n\
81connect_ex(addr) -- connect, return an error code instead of an exception\n\
82dup() -- return a new socket object identical to the current one [*]\n\
83fileno() -- return underlying file descriptor\n\
84getpeername() -- return remote address [*]\n\
85getsockname() -- return local address\n\
86getsockopt(level, optname[, buflen]) -- get socket options\n\
87gettimeout() -- return timeout or None\n\
88listen(n) -- start listening for incoming connections\n\
89makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
90recv(buflen[, flags]) -- receive data\n\
91recvfrom(buflen[, flags]) -- receive data and sender's address\n\
92sendall(data[, flags]) -- send all data\n\
93send(data[, flags]) -- send data, may not send all of it\n\
94sendto(data[, flags], addr) -- send data to a given address\n\
95setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
96setsockopt(level, optname, value) -- set socket options\n\
97settimeout(None | float) -- set or clear the timeout\n\
98shutdown(how) -- shut down traffic in one or both directions\n\
99\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000101
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000102/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
103 I hope some day someone can clean this up please... */
104
Guido van Rossum9376b741999-09-15 22:01:40 +0000105/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
106 script doesn't get this right, so we hardcode some platform checks below.
107 On the other hand, not all Linux versions agree, so there the settings
108 computed by the configure script are needed! */
109
110#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000111# undef HAVE_GETHOSTBYNAME_R_3_ARG
112# undef HAVE_GETHOSTBYNAME_R_5_ARG
113# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000114#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000115
Guido van Rossum7a122991999-04-13 04:07:32 +0000116#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000117# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000118#endif
119
Guido van Rossume7de2061999-03-24 17:24:33 +0000120#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000121# if defined(_AIX) || defined(__osf__)
122# define HAVE_GETHOSTBYNAME_R_3_ARG
123# elif defined(__sun) || defined(__sgi)
124# define HAVE_GETHOSTBYNAME_R_5_ARG
125# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000126/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000127# else
128# undef HAVE_GETHOSTBYNAME_R
129# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000130#endif
131
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000132#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
133 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000134# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000135#endif
136
137#ifdef USE_GETHOSTBYNAME_LOCK
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000138# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000139#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000140
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000141#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000142# include <types.h>
143# include <io.h>
144# include <sys/ioctl.h>
145# include <utils.h>
146# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000147#endif
148
149#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000150# define INCL_DOS
151# define INCL_DOSERRORS
152# define INCL_NOPMAPI
153# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000154#endif
155
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000156/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000157#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000158#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000160/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000162#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163
164/* Addressing includes */
165
Guido van Rossum6f489d91996-06-28 20:15:15 +0000166#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167
168/* Non-MS WINDOWS includes */
169# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000170
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# ifdef __BEOS__
173# include <net/netdb.h>
174# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
175# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000176typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000178# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000180
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# ifndef RISCOS
182# include <fcntl.h>
183# else
184# include <sys/fcntl.h>
185# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000186int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000187# endif
188
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000189#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000190
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000191/* MS_WINDOWS includes */
192# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000193
Jeremy Hylton22308652001-02-02 03:23:09 +0000194#endif
195
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000196#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000197# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000198#endif
199
200#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000201# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000202#endif
203
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000204#ifndef O_NDELAY
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000205# define O_NDELAY O_NONBLOCK /* For QNX only? */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000206#endif
207
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000208#include "addrinfo.h"
209
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000210#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000211int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000212const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000213#endif
214
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000215#ifdef __APPLE__
216/* On OS X, getaddrinfo returns no error indication of lookup
217 failure, so we must use the emulation instead of the libinfo
218 implementation. Unfortunately, performing an autoconf test
219 for this bug would require DNS access for the machine performing
220 the configuration, which is not acceptable. Therefore, we
221 determine the bug just by checking for __APPLE__. If this bug
222 gets ever fixed, perhaps checking for sys/version.h would be
223 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000224#ifndef HAVE_GETNAMEINFO
225/* This bug seems to be fixed in Jaguar. Ths easiest way I could
226 Find to check for Jaguar is that it has getnameinfo(), which
227 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000228#undef HAVE_GETADDRINFO
229/* avoid clashes with the C library definition of the symbol. */
230#define getaddrinfo fake_getaddrinfo
231#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000232#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000233
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000234/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000235#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000236#include "getaddrinfo.c"
237#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000238#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000239#include "getnameinfo.c"
240#endif
241
Guido van Rossumbcc20741998-08-04 22:53:56 +0000242#if defined(MS_WINDOWS) || defined(__BEOS__)
243/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000244/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000245#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000246#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000247#endif
248
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000249#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000250#define EAFNOSUPPORT WSAEAFNOSUPPORT
251#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000252#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000253
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000254#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000255#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000256#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000257#endif
258
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000259#ifndef SOCKETCLOSE
260#define SOCKETCLOSE close
261#endif
262
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000263/* XXX There's a problem here: *static* functions are not supposed to have
264 a Py prefix (or use CapitalizedWords). Later... */
265
Guido van Rossum30a685f1991-06-27 15:51:29 +0000266/* Global variable holding the exception type for errors detected
267 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000268static PyObject *socket_error;
269static PyObject *socket_herror;
270static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000271
Guido van Rossum48a680c2001-03-02 06:34:14 +0000272#ifdef RISCOS
273/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
274static int taskwindow;
275#endif
276
Tim Peters643a7fc2002-02-17 04:13:21 +0000277/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000278 The sock_type variable contains pointers to various functions,
279 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000280 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000281static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000282
Guido van Rossum30a685f1991-06-27 15:51:29 +0000283/* Convenience function to raise an error according to errno
284 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000285
Guido van Rossum73624e91994-10-10 17:59:00 +0000286static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000287set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000288{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000289#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000290 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000291 static struct {
292 int no;
293 const char *msg;
294 } *msgp, msgs[] = {
295 {WSAEINTR, "Interrupted system call"},
296 {WSAEBADF, "Bad file descriptor"},
297 {WSAEACCES, "Permission denied"},
298 {WSAEFAULT, "Bad address"},
299 {WSAEINVAL, "Invalid argument"},
300 {WSAEMFILE, "Too many open files"},
301 {WSAEWOULDBLOCK,
302 "The socket operation could not complete "
303 "without blocking"},
304 {WSAEINPROGRESS, "Operation now in progress"},
305 {WSAEALREADY, "Operation already in progress"},
306 {WSAENOTSOCK, "Socket operation on non-socket"},
307 {WSAEDESTADDRREQ, "Destination address required"},
308 {WSAEMSGSIZE, "Message too long"},
309 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
310 {WSAENOPROTOOPT, "Protocol not available"},
311 {WSAEPROTONOSUPPORT, "Protocol not supported"},
312 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
313 {WSAEOPNOTSUPP, "Operation not supported"},
314 {WSAEPFNOSUPPORT, "Protocol family not supported"},
315 {WSAEAFNOSUPPORT, "Address family not supported"},
316 {WSAEADDRINUSE, "Address already in use"},
317 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
318 {WSAENETDOWN, "Network is down"},
319 {WSAENETUNREACH, "Network is unreachable"},
320 {WSAENETRESET, "Network dropped connection on reset"},
321 {WSAECONNABORTED, "Software caused connection abort"},
322 {WSAECONNRESET, "Connection reset by peer"},
323 {WSAENOBUFS, "No buffer space available"},
324 {WSAEISCONN, "Socket is already connected"},
325 {WSAENOTCONN, "Socket is not connected"},
326 {WSAESHUTDOWN, "Can't send after socket shutdown"},
327 {WSAETOOMANYREFS, "Too many references: can't splice"},
328 {WSAETIMEDOUT, "Operation timed out"},
329 {WSAECONNREFUSED, "Connection refused"},
330 {WSAELOOP, "Too many levels of symbolic links"},
331 {WSAENAMETOOLONG, "File name too long"},
332 {WSAEHOSTDOWN, "Host is down"},
333 {WSAEHOSTUNREACH, "No route to host"},
334 {WSAENOTEMPTY, "Directory not empty"},
335 {WSAEPROCLIM, "Too many processes"},
336 {WSAEUSERS, "Too many users"},
337 {WSAEDQUOT, "Disc quota exceeded"},
338 {WSAESTALE, "Stale NFS file handle"},
339 {WSAEREMOTE, "Too many levels of remote in path"},
340 {WSASYSNOTREADY, "Network subsystem is unvailable"},
341 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
342 {WSANOTINITIALISED,
343 "Successful WSAStartup() not yet performed"},
344 {WSAEDISCON, "Graceful shutdown in progress"},
345 /* Resolver errors */
346 {WSAHOST_NOT_FOUND, "No such host is known"},
347 {WSATRY_AGAIN, "Host not found, or server failed"},
348 {WSANO_RECOVERY, "Unexpected server error encountered"},
349 {WSANO_DATA, "Valid name without requested data"},
350 {WSANO_ADDRESS, "No address, look for MX record"},
351 {0, NULL}
352 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000353 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000354 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000355 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000356
Mark Hammond46a733d2000-07-24 01:45:11 +0000357 for (msgp = msgs; msgp->msg; msgp++) {
358 if (err_no == msgp->no) {
359 msg = msgp->msg;
360 break;
361 }
362 }
363
364 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000365 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000366 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000367 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000368 }
369 return NULL;
370 }
371 else
372#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000373
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000374#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000375 if (sock_errno() != NO_ERROR) {
376 APIRET rc;
377 ULONG msglen;
378 char outbuf[100];
379 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000380
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000381 /* Retrieve socket-related error message from MPTN.MSG file */
382 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
383 myerrorcode - SOCBASEERR + 26,
384 "mptn.msg",
385 &msglen);
386 if (rc == NO_ERROR) {
387 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000388
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000389 /* OS/2 doesn't guarantee a terminator */
390 outbuf[msglen] = '\0';
391 if (strlen(outbuf) > 0) {
392 /* If non-empty msg, trim CRLF */
393 char *lastc = &outbuf[ strlen(outbuf)-1 ];
394 while (lastc > outbuf && isspace(*lastc)) {
395 /* Trim trailing whitespace (CRLF) */
396 *lastc-- = '\0';
397 }
398 }
399 v = Py_BuildValue("(is)", myerrorcode, outbuf);
400 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000401 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000402 Py_DECREF(v);
403 }
404 return NULL;
405 }
406 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000407#endif
408
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000409 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000410}
411
Guido van Rossum30a685f1991-06-27 15:51:29 +0000412
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000413static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000414set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000415{
416 PyObject *v;
417
418#ifdef HAVE_HSTRERROR
419 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
420#else
421 v = Py_BuildValue("(is)", h_error, "host not found");
422#endif
423 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000424 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000425 Py_DECREF(v);
426 }
427
428 return NULL;
429}
430
431
432static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000433set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000434{
435 PyObject *v;
436
Martin v. Löwis272cb402002-03-01 08:31:07 +0000437#ifdef EAI_SYSTEM
438 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000439 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000440 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000441#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000442
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000443#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000444 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000445#else
446 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
447#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000448 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000449 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000450 Py_DECREF(v);
451 }
452
453 return NULL;
454}
455
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000456/* Function to perform the setting of socket blocking mode
457 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000458static int
459internal_setblocking(PySocketSockObject *s, int block)
460{
461#ifndef RISCOS
462#ifndef MS_WINDOWS
463 int delay_flag;
464#endif
465#endif
466
467 Py_BEGIN_ALLOW_THREADS
468#ifdef __BEOS__
469 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000470 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
471 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000472#else
473#ifndef RISCOS
474#ifndef MS_WINDOWS
475#if defined(PYOS_OS2) && !defined(PYCC_GCC)
476 block = !block;
477 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
478#else /* !PYOS_OS2 */
479 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
480 if (block)
481 delay_flag &= (~O_NDELAY);
482 else
483 delay_flag |= O_NDELAY;
484 fcntl(s->sock_fd, F_SETFL, delay_flag);
485#endif /* !PYOS_OS2 */
486#else /* MS_WINDOWS */
487 block = !block;
488 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
489#endif /* MS_WINDOWS */
490#endif /* __BEOS__ */
491#endif /* RISCOS */
492 Py_END_ALLOW_THREADS
493
494 /* Since these don't return anything */
495 return 1;
496}
497
Guido van Rossum11ba0942002-06-13 15:07:44 +0000498/* Do a select() on the socket, if necessary (sock_timeout > 0).
499 The argument writing indicates the direction.
500 This does not raise an exception or return a success indicator;
501 we'll let the actual socket call do that. */
502static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000503internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000504{
505 fd_set fds;
506 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000507
Guido van Rossumad654902002-07-19 12:44:59 +0000508 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000509 if (s->sock_timeout <= 0.0)
510 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000511
Guido van Rossumad654902002-07-19 12:44:59 +0000512 /* Guard against closed socket */
513 if (s->sock_fd < 0)
514 return;
515
Guido van Rossum67f7a382002-06-06 21:08:16 +0000516 /* Construct the arguments to select */
517 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000518 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000519 FD_ZERO(&fds);
520 FD_SET(s->sock_fd, &fds);
521
522 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000523 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000524 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000525 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000526 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000527}
528
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000529/* Initialize a new socket object. */
530
Tim Petersa12b4cf2002-07-18 22:38:44 +0000531static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000532
Mark Hammond62b1ab12002-07-23 06:31:15 +0000533PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000534init_sockobject(PySocketSockObject *s,
535 SOCKET_T fd, int family, int type, int proto)
536{
537#ifdef RISCOS
538 int block = 1;
539#endif
540 s->sock_fd = fd;
541 s->sock_family = family;
542 s->sock_type = type;
543 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000544 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000545
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000546 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000547
548 if (defaulttimeout >= 0.0)
549 internal_setblocking(s, 0);
550
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000551#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000552 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000553 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000554#endif
555}
556
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558/* Create a new socket object.
559 This just creates the object and initializes it.
560 If the creation fails, return NULL and set an exception (implicit
561 in NEWOBJ()). */
562
Guido van Rossum73624e91994-10-10 17:59:00 +0000563static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000564new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565{
Guido van Rossum73624e91994-10-10 17:59:00 +0000566 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000567 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000568 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000569 if (s != NULL)
570 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000571 return s;
572}
573
Guido van Rossum30a685f1991-06-27 15:51:29 +0000574
Guido van Rossum48a680c2001-03-02 06:34:14 +0000575/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000576 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000577#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000578PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000579#endif
580
581
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582/* Convert a string specifying a host name or one of a few symbolic
583 names to a numeric IP address. This usually calls gethostbyname()
584 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000586 an error occurred; then an exception is raised. */
587
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000588static int
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000589setipaddr(char *name, struct sockaddr *addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000590{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591 struct addrinfo hints, *res;
592 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593
Guido van Rossuma376cc51996-12-05 23:43:35 +0000594 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000595 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000596 int siz;
597 memset(&hints, 0, sizeof(hints));
598 hints.ai_family = af;
599 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
600 hints.ai_flags = AI_PASSIVE;
601 error = getaddrinfo(NULL, "0", &hints, &res);
602 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000603 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000604 return -1;
605 }
606 switch (res->ai_family) {
607 case AF_INET:
608 siz = 4;
609 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000610#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611 case AF_INET6:
612 siz = 16;
613 break;
614#endif
615 default:
616 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000617 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618 "unsupported address family");
619 return -1;
620 }
621 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000622 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000623 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000624 "wildcard resolved to multiple address");
625 return -1;
626 }
627 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
628 freeaddrinfo(res);
629 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000630 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000631 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000632 struct sockaddr_in *sin;
633 if (af != PF_INET && af != PF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000634 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000635 "address family mismatched");
636 return -1;
637 }
638 sin = (struct sockaddr_in *)addr_ret;
639 memset((void *) sin, '\0', sizeof(*sin));
640 sin->sin_family = AF_INET;
641#ifdef HAVE_SOCKADDR_SA_LEN
642 sin->sin_len = sizeof(*sin);
643#endif
644 sin->sin_addr.s_addr = INADDR_BROADCAST;
645 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000646 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000647 memset(&hints, 0, sizeof(hints));
648 hints.ai_family = af;
649 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000650#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000651 if (error == EAI_NONAME && af == AF_UNSPEC) {
652 /* On Tru64 V5.1, numeric-to-addr conversion fails
653 if no address family is given. Assume IPv4 for now.*/
654 hints.ai_family = AF_INET;
655 error = getaddrinfo(name, NULL, &hints, &res);
656 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000657#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000658 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000659 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000660 return -1;
661 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000662 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
663 freeaddrinfo(res);
664 switch (addr_ret->sa_family) {
665 case AF_INET:
666 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000667#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000668 case AF_INET6:
669 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000670#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000671 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000672 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000673 return -1;
674 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000675}
676
Guido van Rossum30a685f1991-06-27 15:51:29 +0000677
Guido van Rossum30a685f1991-06-27 15:51:29 +0000678/* Create a string object representing an IP address.
679 This is always a string of the form 'dd.dd.dd.dd' (with variable
680 size numbers). */
681
Guido van Rossum73624e91994-10-10 17:59:00 +0000682static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000683makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000684{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000685 char buf[NI_MAXHOST];
686 int error;
687
688 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
689 NI_NUMERICHOST);
690 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000691 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000692 return NULL;
693 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000694 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000695}
696
697
698/* Create an object representing the given socket address,
699 suitable for passing it back to bind(), connect() etc.
700 The family field of the sockaddr structure is inspected
701 to determine what kind of address it really is. */
702
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000704static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000705makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000706{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000707 if (addrlen == 0) {
708 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000709 Py_INCREF(Py_None);
710 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000711 }
712
Guido van Rossumbcc20741998-08-04 22:53:56 +0000713#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000714 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000715 addr->sa_family = AF_INET;
716#endif
717
Guido van Rossum30a685f1991-06-27 15:51:29 +0000718 switch (addr->sa_family) {
719
720 case AF_INET:
721 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000722 struct sockaddr_in *a;
723 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000724 PyObject *ret = NULL;
725 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000726 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000727 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
728 Py_DECREF(addrobj);
729 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000730 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000732
Guido van Rossumb6775db1994-08-01 11:34:53 +0000733#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000734 case AF_UNIX:
735 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000736 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000737 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000738 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000739#endif /* AF_UNIX */
740
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000741#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000742 case AF_INET6:
743 {
744 struct sockaddr_in6 *a;
745 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
746 PyObject *ret = NULL;
747 if (addrobj) {
748 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000749 ret = Py_BuildValue("Oiii",
750 addrobj,
751 ntohs(a->sin6_port),
752 a->sin6_flowinfo,
753 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000754 Py_DECREF(addrobj);
755 }
756 return ret;
757 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000758#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000759
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000760#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000761 case AF_PACKET:
762 {
763 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
764 char *ifname = "";
765 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000766 /* need to look up interface name give index */
767 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000768 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000769 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000770 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000771 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000772 return Py_BuildValue("shbhs#",
773 ifname,
774 ntohs(a->sll_protocol),
775 a->sll_pkttype,
776 a->sll_hatype,
777 a->sll_addr,
778 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000779 }
780#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000781
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782 /* More cases here... */
783
784 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000785 /* If we don't know the address family, don't raise an
786 exception -- return it as a tuple. */
787 return Py_BuildValue("is#",
788 addr->sa_family,
789 addr->sa_data,
790 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000791
Guido van Rossum30a685f1991-06-27 15:51:29 +0000792 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000793}
794
Guido van Rossum30a685f1991-06-27 15:51:29 +0000795
796/* Parse a socket address argument according to the socket object's
797 address family. Return 1 if the address was in the proper format,
798 0 of not. The address is returned through addr_ret, its length
799 through len_ret. */
800
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000801static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000802getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000803 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000805 switch (s->sock_family) {
806
Guido van Rossumb6775db1994-08-01 11:34:53 +0000807#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000808 case AF_UNIX:
809 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000810 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000811 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000812 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000813 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000814 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000815 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000816 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000817 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000818 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000819 return 0;
820 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000821 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000822 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000823 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000824 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000825 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826 return 1;
827 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000828#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829
Guido van Rossum30a685f1991-06-27 15:51:29 +0000830 case AF_INET:
831 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000832 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000833 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000835 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000836 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000837 PyErr_Format(
838 PyExc_TypeError,
839 "getsockaddrarg: "
840 "AF_INET address must be tuple, not %.500s",
841 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000842 return 0;
843 }
844 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000845 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000846 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000848 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000849 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000850 *addr_ret = (struct sockaddr *) addr;
851 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852 return 1;
853 }
854
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000855#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000856 case AF_INET6:
857 {
858 struct sockaddr_in6* addr;
859 char *host;
860 int port, flowinfo, scope_id;
861 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
862 flowinfo = scope_id = 0;
863 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000864 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000865 return 0;
866 }
867 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
868 return 0;
869 addr->sin6_family = s->sock_family;
870 addr->sin6_port = htons((short)port);
871 addr->sin6_flowinfo = flowinfo;
872 addr->sin6_scope_id = scope_id;
873 *addr_ret = (struct sockaddr *) addr;
874 *len_ret = sizeof *addr;
875 return 1;
876 }
877#endif
878
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000879#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000880 case AF_PACKET:
881 {
882 struct sockaddr_ll* addr;
883 struct ifreq ifr;
884 char *interfaceName;
885 int protoNumber;
886 int hatype = 0;
887 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000888 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000889
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000890 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
891 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000892 return 0;
893 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
894 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000895 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000896 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000897 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000898 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000899 addr = &(s->sock_addr.ll);
900 addr->sll_family = AF_PACKET;
901 addr->sll_protocol = htons((short)protoNumber);
902 addr->sll_ifindex = ifr.ifr_ifindex;
903 addr->sll_pkttype = pkttype;
904 addr->sll_hatype = hatype;
905 *addr_ret = (struct sockaddr *) addr;
906 *len_ret = sizeof *addr;
907 return 1;
908 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000909#endif
910
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911 /* More cases here... */
912
913 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000914 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000915 return 0;
916
917 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000918}
919
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920
Guido van Rossum48a680c2001-03-02 06:34:14 +0000921/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000922 Return 1 if the family is known, 0 otherwise. The length is returned
923 through len_ret. */
924
925static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000926getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000927{
928 switch (s->sock_family) {
929
Guido van Rossumb6775db1994-08-01 11:34:53 +0000930#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000931 case AF_UNIX:
932 {
933 *len_ret = sizeof (struct sockaddr_un);
934 return 1;
935 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000936#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000937
938 case AF_INET:
939 {
940 *len_ret = sizeof (struct sockaddr_in);
941 return 1;
942 }
943
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000944#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000945 case AF_INET6:
946 {
947 *len_ret = sizeof (struct sockaddr_in6);
948 return 1;
949 }
950#endif
951
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000952#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000953 case AF_PACKET:
954 {
955 *len_ret = sizeof (struct sockaddr_ll);
956 return 1;
957 }
958#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000959
Guido van Rossum710e1df1992-06-12 10:39:36 +0000960 /* More cases here... */
961
962 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000963 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000964 return 0;
965
966 }
967}
968
969
Guido van Rossum30a685f1991-06-27 15:51:29 +0000970/* s.accept() method */
971
Guido van Rossum73624e91994-10-10 17:59:00 +0000972static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000973sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000974{
975 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000976 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000977 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000978 PyObject *sock = NULL;
979 PyObject *addr = NULL;
980 PyObject *res = NULL;
981
Guido van Rossum710e1df1992-06-12 10:39:36 +0000982 if (!getsockaddrlen(s, &addrlen))
983 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000984 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000985
Guido van Rossum73624e91994-10-10 17:59:00 +0000986 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +0000987 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000988 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000989 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000990
Fred Drakea04eaad2000-06-30 02:46:07 +0000991#ifdef MS_WINDOWS
992 if (newfd == INVALID_SOCKET)
993#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000994 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000995#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000996 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +0000997
Guido van Rossum30a685f1991-06-27 15:51:29 +0000998 /* Create the new object with unspecified family,
999 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001000 sock = (PyObject *) new_sockobject(newfd,
1001 s->sock_family,
1002 s->sock_type,
1003 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001004
Barry Warsaw752300b1997-01-03 17:18:10 +00001005 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001006 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001007 goto finally;
1008 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001009 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001010 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001011 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001012 goto finally;
1013
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001014 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001015
Guido van Rossum67f7a382002-06-06 21:08:16 +00001016finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001017 Py_XDECREF(sock);
1018 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001019 return res;
1020}
1021
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001022PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001023"accept() -> (socket object, address info)\n\
1024\n\
1025Wait for an incoming connection. Return a new socket representing the\n\
1026connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001027info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001028
Guido van Rossum11ba0942002-06-13 15:07:44 +00001029/* s.setblocking(flag) method. Argument:
1030 False -- non-blocking mode; same as settimeout(0)
1031 True -- blocking mode; same as settimeout(None)
1032*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001033
Guido van Rossum73624e91994-10-10 17:59:00 +00001034static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001035sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001036{
1037 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001038
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001039 block = PyInt_AsLong(arg);
1040 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001041 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001042
Guido van Rossum11ba0942002-06-13 15:07:44 +00001043 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001044 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001045
Guido van Rossum73624e91994-10-10 17:59:00 +00001046 Py_INCREF(Py_None);
1047 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001048}
Guido van Rossume4485b01994-09-07 14:32:49 +00001049
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001050PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001051"setblocking(flag)\n\
1052\n\
1053Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001054setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001055setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001056
Guido van Rossum11ba0942002-06-13 15:07:44 +00001057/* s.settimeout(timeout) method. Argument:
1058 None -- no timeout, blocking mode; same as setblocking(True)
1059 0.0 -- non-blocking mode; same as setblocking(False)
1060 > 0 -- timeout mode; operations time out after timeout seconds
1061 < 0 -- illegal; raises an exception
1062*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001063static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001064sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001065{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001066 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001067
1068 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001069 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001070 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001071 timeout = PyFloat_AsDouble(arg);
1072 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001073 if (!PyErr_Occurred())
1074 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001075 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001076 return NULL;
1077 }
1078 }
1079
Guido van Rossum11ba0942002-06-13 15:07:44 +00001080 s->sock_timeout = timeout;
1081 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001082
1083 Py_INCREF(Py_None);
1084 return Py_None;
1085}
1086
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001087PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001088"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001089\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001090Set a timeout on socket operations. 'timeout' can be a float,\n\
1091giving in seconds, or None. Setting a timeout of None disables\n\
1092the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001093Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001094
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001095/* s.gettimeout() method.
1096 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001097static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001098sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001099{
1100 if (s->sock_timeout < 0.0) {
1101 Py_INCREF(Py_None);
1102 return Py_None;
1103 }
1104 else
1105 return PyFloat_FromDouble(s->sock_timeout);
1106}
1107
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001108PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001109"gettimeout()\n\
1110\n\
1111Returns the timeout in floating seconds associated with socket \n\
1112operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001113operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001114
Guido van Rossum48a680c2001-03-02 06:34:14 +00001115#ifdef RISCOS
1116/* s.sleeptaskw(1 | 0) method */
1117
1118static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001119sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001120{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001121 int block;
1122 int delay_flag;
1123 if (!PyArg_Parse(args, "i", &block))
1124 return NULL;
1125 Py_BEGIN_ALLOW_THREADS
1126 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1127 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001128
Guido van Rossum67f7a382002-06-06 21:08:16 +00001129 Py_INCREF(Py_None);
1130 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001131}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001132PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001133"sleeptaskw(flag)\n\
1134\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001135Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001136#endif
1137
1138
Guido van Rossumaee08791992-09-08 09:05:33 +00001139/* s.setsockopt() method.
1140 With an integer third argument, sets an integer option.
1141 With a string third argument, sets an option from a buffer;
1142 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001143
Guido van Rossum73624e91994-10-10 17:59:00 +00001144static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001145sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001146{
1147 int level;
1148 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001149 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001150 char *buf;
1151 int buflen;
1152 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001153
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001154 if (PyArg_ParseTuple(args, "iii:setsockopt",
1155 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001156 buf = (char *) &flag;
1157 buflen = sizeof flag;
1158 }
1159 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001160 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001161 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1162 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001163 return NULL;
1164 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001165 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001166 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001167 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001168 Py_INCREF(Py_None);
1169 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001170}
1171
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001172PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001173"setsockopt(level, option, value)\n\
1174\n\
1175Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001176The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001177
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001178
Guido van Rossumaee08791992-09-08 09:05:33 +00001179/* s.getsockopt() method.
1180 With two arguments, retrieves an integer option.
1181 With a third integer argument, retrieves a string buffer of that size;
1182 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001183
Guido van Rossum73624e91994-10-10 17:59:00 +00001184static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001185sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001186{
1187 int level;
1188 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001189 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001190 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001191 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001192
Guido van Rossumbcc20741998-08-04 22:53:56 +00001193#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001194 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001195 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001196 return NULL;
1197#else
1198
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001199 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1200 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001201 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001202
Guido van Rossumbe32c891996-06-20 16:25:29 +00001203 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001204 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001205 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001206 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001207 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001208 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001209 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001210 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001211 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001212 if (buflen <= 0 || buflen > 1024) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001213 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001214 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001215 return NULL;
1216 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001217 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001218 if (buf == NULL)
1219 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001220 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001221 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001222 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001224 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001225 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001227 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001228#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001229}
1230
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001231PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001232"getsockopt(level, option[, buffersize]) -> value\n\
1233\n\
1234Get a socket option. See the Unix manual for level and option.\n\
1235If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001236string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001237
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001238
Fred Drake728819a2000-07-01 03:40:12 +00001239/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001240
Guido van Rossum73624e91994-10-10 17:59:00 +00001241static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001242sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001243{
1244 struct sockaddr *addr;
1245 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001246 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001247
Fred Drake728819a2000-07-01 03:40:12 +00001248 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001249 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001250 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001251 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001252 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001253 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001254 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001255 Py_INCREF(Py_None);
1256 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001257}
1258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001259PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001260"bind(address)\n\
1261\n\
1262Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001263pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001264sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001265
Guido van Rossum30a685f1991-06-27 15:51:29 +00001266
1267/* s.close() method.
1268 Set the file descriptor to -1 so operations tried subsequently
1269 will surely fail. */
1270
Guido van Rossum73624e91994-10-10 17:59:00 +00001271static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001272sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001273{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001274 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001275
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001276 if ((fd = s->sock_fd) != -1) {
1277 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001278 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001279 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001280 Py_END_ALLOW_THREADS
1281 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001282 Py_INCREF(Py_None);
1283 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001284}
1285
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001286PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001287"close()\n\
1288\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001289Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001290
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001291static int
1292internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1293{
1294 int res;
1295
1296 res = connect(s->sock_fd, addr, addrlen);
1297
1298#ifdef MS_WINDOWS
1299
1300 if (s->sock_timeout > 0.0) {
1301 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
1302 internal_select(s, 1);
1303 res = connect(s->sock_fd, addr, addrlen);
1304 if (res < 0 && WSAGetLastError() == WSAEISCONN)
1305 res = 0;
1306 }
1307 }
1308
1309 if (res < 0)
1310 res = WSAGetLastError();
1311
1312#else
1313
1314 if (s->sock_timeout > 0.0) {
1315 if (res < 0 && errno == EINPROGRESS) {
1316 internal_select(s, 1);
1317 res = connect(s->sock_fd, addr, addrlen);
1318 }
1319 }
1320
1321 if (res < 0)
1322 res = errno;
1323
1324#endif
1325
1326 return res;
1327}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001328
Fred Drake728819a2000-07-01 03:40:12 +00001329/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001330
Guido van Rossum73624e91994-10-10 17:59:00 +00001331static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001332sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001333{
1334 struct sockaddr *addr;
1335 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001336 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001337
Fred Drake728819a2000-07-01 03:40:12 +00001338 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001339 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001340
Guido van Rossum73624e91994-10-10 17:59:00 +00001341 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001342 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001343 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001344
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001345 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001346 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001347 Py_INCREF(Py_None);
1348 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001349}
1350
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001351PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001352"connect(address)\n\
1353\n\
1354Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001355is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001356
Guido van Rossum30a685f1991-06-27 15:51:29 +00001357
Fred Drake728819a2000-07-01 03:40:12 +00001358/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001359
1360static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001361sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001362{
1363 struct sockaddr *addr;
1364 int addrlen;
1365 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001366
Fred Drake728819a2000-07-01 03:40:12 +00001367 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001368 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001369
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001370 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001371 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001372 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001373
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001374 return PyInt_FromLong((long) res);
1375}
1376
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001377PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001378"connect_ex(address)\n\
1379\n\
1380This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001381instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001382
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001383
Guido van Rossumed233a51992-06-23 09:07:03 +00001384/* s.fileno() method */
1385
Guido van Rossum73624e91994-10-10 17:59:00 +00001386static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001387sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001388{
Fred Drakea04eaad2000-06-30 02:46:07 +00001389#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001390 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001391#else
1392 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1393#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001394}
1395
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001396PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001397"fileno() -> integer\n\
1398\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001399Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001400
Guido van Rossumed233a51992-06-23 09:07:03 +00001401
Guido van Rossumbe32c891996-06-20 16:25:29 +00001402#ifndef NO_DUP
1403/* s.dup() method */
1404
1405static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001406sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001407{
Fred Drakea04eaad2000-06-30 02:46:07 +00001408 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001409 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001410
Guido van Rossumbe32c891996-06-20 16:25:29 +00001411 newfd = dup(s->sock_fd);
1412 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001413 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001414 sock = (PyObject *) new_sockobject(newfd,
1415 s->sock_family,
1416 s->sock_type,
1417 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001418 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001419 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001420 return sock;
1421}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001422
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001423PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001424"dup() -> socket object\n\
1425\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001426Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001427
Guido van Rossumbe32c891996-06-20 16:25:29 +00001428#endif
1429
1430
Guido van Rossumc89705d1992-11-26 08:54:07 +00001431/* s.getsockname() method */
1432
Guido van Rossum73624e91994-10-10 17:59:00 +00001433static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001434sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001435{
1436 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001437 int res;
1438 socklen_t addrlen;
1439
Guido van Rossumc89705d1992-11-26 08:54:07 +00001440 if (!getsockaddrlen(s, &addrlen))
1441 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001442 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001443 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001444 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001445 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001446 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001447 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001448 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001449}
1450
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001451PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001452"getsockname() -> address info\n\
1453\n\
1454Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001455info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001456
Guido van Rossumc89705d1992-11-26 08:54:07 +00001457
Guido van Rossumb6775db1994-08-01 11:34:53 +00001458#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001459/* s.getpeername() method */
1460
Guido van Rossum73624e91994-10-10 17:59:00 +00001461static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001462sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001463{
1464 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001465 int res;
1466 socklen_t addrlen;
1467
Guido van Rossumc89705d1992-11-26 08:54:07 +00001468 if (!getsockaddrlen(s, &addrlen))
1469 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001470 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001471 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001472 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001473 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001474 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001475 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001476 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001477}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001479PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001480"getpeername() -> address info\n\
1481\n\
1482Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001483info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001484
Guido van Rossumb6775db1994-08-01 11:34:53 +00001485#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001486
1487
Guido van Rossum30a685f1991-06-27 15:51:29 +00001488/* s.listen(n) method */
1489
Guido van Rossum73624e91994-10-10 17:59:00 +00001490static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001491sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001492{
1493 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001494 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001495
1496 backlog = PyInt_AsLong(arg);
1497 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001498 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001499 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001500 if (backlog < 1)
1501 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001502 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001503 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001504 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001505 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001506 Py_INCREF(Py_None);
1507 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001508}
1509
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001510PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001511"listen(backlog)\n\
1512\n\
1513Enable a server to accept connections. The backlog argument must be at\n\
1514least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001515will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001516
1517
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001518#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001519/* s.makefile(mode) method.
1520 Create a new open file object referring to a dupped version of
1521 the socket's file descriptor. (The dup() call is necessary so
1522 that the open file and socket objects may be closed independent
1523 of each other.)
1524 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1525
Guido van Rossum73624e91994-10-10 17:59:00 +00001526static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001527sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001528{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001529 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001530 char *mode = "r";
1531 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001532#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001533 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001534#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001535 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001536#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001537 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001538 PyObject *f;
1539
Guido van Rossum43713e52000-02-29 13:59:29 +00001540 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001541 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001542#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001543 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1544 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001545#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001546 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001547#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001548 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001549 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001550 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001551 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001552 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001553#ifdef USE_GUSI2
1554 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001555 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001556 bufsize = 0;
1557#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001558 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1559 if (f != NULL)
1560 PyFile_SetBufSize(f, bufsize);
1561 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001562}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001563
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001564PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001565"makefile([mode[, buffersize]]) -> file object\n\
1566\n\
1567Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001568The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001569
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001570#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001571
Guido van Rossum48a680c2001-03-02 06:34:14 +00001572
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001573/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001574
Guido van Rossum73624e91994-10-10 17:59:00 +00001575static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001576sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001577{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001578 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001579 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001580
Guido van Rossum43713e52000-02-29 13:59:29 +00001581 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001582 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001583
1584 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001585 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001586 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001587 return NULL;
1588 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001589
Guido van Rossum73624e91994-10-10 17:59:00 +00001590 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001591 if (buf == NULL)
1592 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001593
Guido van Rossum73624e91994-10-10 17:59:00 +00001594 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001595 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001596 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001597 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001598
Guido van Rossum7c53b771995-09-13 18:39:47 +00001599 if (n < 0) {
1600 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001601 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001602 }
Tim Peters5de98422002-04-27 18:44:32 +00001603 if (n != len)
1604 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001605 return buf;
1606}
1607
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001608PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001609"recv(buffersize[, flags]) -> data\n\
1610\n\
1611Receive up to buffersize bytes from the socket. For the optional flags\n\
1612argument, see the Unix manual. When no data is available, block until\n\
1613at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001614the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001615
Guido van Rossum30a685f1991-06-27 15:51:29 +00001616
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001617/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001618
Guido van Rossum73624e91994-10-10 17:59:00 +00001619static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001620sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621{
1622 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001623 PyObject *buf = NULL;
1624 PyObject *addr = NULL;
1625 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001626 int len, n, flags = 0;
1627 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001628
Guido van Rossum43713e52000-02-29 13:59:29 +00001629 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001630 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001631
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001632 if (!getsockaddrlen(s, &addrlen))
1633 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001634 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001635 if (buf == NULL)
1636 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001637
Guido van Rossum73624e91994-10-10 17:59:00 +00001638 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001639 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001640 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001641 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001642#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001643#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001644 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001645#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001646 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001647#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001648#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001649 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001650#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001651 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001652 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001653
Guido van Rossum7c53b771995-09-13 18:39:47 +00001654 if (n < 0) {
1655 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001656 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001657 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001658
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001659 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001660 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001661
Guido van Rossum67f7a382002-06-06 21:08:16 +00001662 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001663 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001664 goto finally;
1665
Guido van Rossum73624e91994-10-10 17:59:00 +00001666 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001667
1668finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001669 Py_XDECREF(addr);
1670 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001671 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001672}
1673
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001674PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001675"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1676\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001677Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001678
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001679/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001680
Guido van Rossum73624e91994-10-10 17:59:00 +00001681static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001682sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001683{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001684 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001685 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001686
Guido van Rossum43713e52000-02-29 13:59:29 +00001687 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001688 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001689
Guido van Rossum73624e91994-10-10 17:59:00 +00001690 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001691 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001692 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001693 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001694
Guido van Rossum30a685f1991-06-27 15:51:29 +00001695 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001696 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001697 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001698}
1699
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001700PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001701"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001702\n\
1703Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001704argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001705sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001706
1707
1708/* s.sendall(data [,flags]) method */
1709
1710static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001711sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001712{
1713 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001714 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001715
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001716 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1717 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001718
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001719 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001720 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001721 do {
1722 n = send(s->sock_fd, buf, len, flags);
1723 if (n < 0)
1724 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001725 buf += n;
1726 len -= n;
1727 } while (len > 0);
1728 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001729
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001730 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001731 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001732
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001733 Py_INCREF(Py_None);
1734 return Py_None;
1735}
1736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001737PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001738"sendall(data[, flags])\n\
1739\n\
1740Send a data string to the socket. For the optional flags\n\
1741argument, see the Unix manual. This calls send() repeatedly\n\
1742until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001743to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001744
Guido van Rossum30a685f1991-06-27 15:51:29 +00001745
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001746/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001747
Guido van Rossum73624e91994-10-10 17:59:00 +00001748static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001749sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001750{
Guido van Rossum73624e91994-10-10 17:59:00 +00001751 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001752 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001753 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001754 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001755
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001756 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001757 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001758 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001759 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1760 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001761 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001762 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001763
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001764 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001765 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001766
Guido van Rossum73624e91994-10-10 17:59:00 +00001767 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001768 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001769 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001770 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001771
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001772 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001773 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001774 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001775}
1776
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001777PyDoc_STRVAR(sendto_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001778"sendto(data[, flags], address)\n\
1779\n\
1780Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001781For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001782
Guido van Rossum30a685f1991-06-27 15:51:29 +00001783
1784/* s.shutdown(how) method */
1785
Guido van Rossum73624e91994-10-10 17:59:00 +00001786static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001787sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001788{
1789 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001790 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001791
1792 how = PyInt_AsLong(arg);
1793 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001794 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001795 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001796 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001797 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001798 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001799 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001800 Py_INCREF(Py_None);
1801 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001802}
1803
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001804PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001805"shutdown(flag)\n\
1806\n\
1807Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001808of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001809
Guido van Rossum30a685f1991-06-27 15:51:29 +00001810
1811/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001812
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001813static PyMethodDef sock_methods[] = {
1814 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001815 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001816 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001817 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001818 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001819 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001820 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001821 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001822 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001823 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001824#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001825 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001826 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001827#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001828 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001829 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001830#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001831 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001832 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001833#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001834 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001835 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001836 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001837 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001838 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001839 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001840#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001841 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001842 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001843#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001844 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001845 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001846 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001847 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001848 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001849 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001850 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001851 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001852 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001853 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001854 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001855 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001856 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001857 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001858 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001859 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001860 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001861 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001862 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001863 shutdown_doc},
1864#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001865 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001866 sleeptaskw_doc},
1867#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001868 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001869};
1870
Guido van Rossum30a685f1991-06-27 15:51:29 +00001871
Guido van Rossum73624e91994-10-10 17:59:00 +00001872/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001873 First close the file description. */
1874
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001875static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001876sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001877{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001878 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001879 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001880 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001881}
1882
Guido van Rossum30a685f1991-06-27 15:51:29 +00001883
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001884static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001885sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001886{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001887 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001888#if SIZEOF_SOCKET_T > SIZEOF_LONG
1889 if (s->sock_fd > LONG_MAX) {
1890 /* this can occur on Win64, and actually there is a special
1891 ugly printf formatter for decimal pointer length integer
1892 printing, only bother if necessary*/
1893 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001894 "no printf formatter to display "
1895 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00001896 return NULL;
1897 }
1898#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001899 PyOS_snprintf(
1900 buf, sizeof(buf),
1901 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1902 (long)s->sock_fd, s->sock_family,
1903 s->sock_type,
1904 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001905 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001906}
1907
1908
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001909/* Create a new, uninitialized socket object. */
1910
1911static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001912sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001913{
1914 PyObject *new;
1915
1916 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00001917 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001918 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001919 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001920 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00001921 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001922 return new;
1923}
1924
1925
1926/* Initialize a new socket object. */
1927
1928/*ARGSUSED*/
1929static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00001930sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001931{
1932 PySocketSockObject *s = (PySocketSockObject *)self;
1933 SOCKET_T fd;
1934 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1935 static char *keywords[] = {"family", "type", "proto", 0};
1936
1937 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1938 "|iii:socket", keywords,
1939 &family, &type, &proto))
1940 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001941
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001942 Py_BEGIN_ALLOW_THREADS
1943 fd = socket(family, type, proto);
1944 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001945
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001946#ifdef MS_WINDOWS
1947 if (fd == INVALID_SOCKET)
1948#else
1949 if (fd < 0)
1950#endif
1951 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001952 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001953 return -1;
1954 }
1955 init_sockobject(s, fd, family, type, proto);
1956 /* From now on, ignore SIGPIPE and let the error checking
1957 do the work. */
1958#ifdef SIGPIPE
1959 (void) signal(SIGPIPE, SIG_IGN);
1960#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001961
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001962 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001963
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001964}
1965
1966
Guido van Rossumb6775db1994-08-01 11:34:53 +00001967/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001968
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001969static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001970 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001971 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001972 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001973 sizeof(PySocketSockObject), /* tp_basicsize */
1974 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001975 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001976 0, /* tp_print */
1977 0, /* tp_getattr */
1978 0, /* tp_setattr */
1979 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001980 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001981 0, /* tp_as_number */
1982 0, /* tp_as_sequence */
1983 0, /* tp_as_mapping */
1984 0, /* tp_hash */
1985 0, /* tp_call */
1986 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001987 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001988 0, /* tp_setattro */
1989 0, /* tp_as_buffer */
1990 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001991 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001992 0, /* tp_traverse */
1993 0, /* tp_clear */
1994 0, /* tp_richcompare */
1995 0, /* tp_weaklistoffset */
1996 0, /* tp_iter */
1997 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001998 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001999 0, /* tp_members */
2000 0, /* tp_getset */
2001 0, /* tp_base */
2002 0, /* tp_dict */
2003 0, /* tp_descr_get */
2004 0, /* tp_descr_set */
2005 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002006 sock_initobj, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002007 0, /* set below */ /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002008 sock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002009 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002010};
2011
Guido van Rossum30a685f1991-06-27 15:51:29 +00002012
Guido van Rossum81194471991-07-27 21:42:02 +00002013/* Python interface to gethostname(). */
2014
2015/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002016static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002017socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002018{
2019 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002020 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002021 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002022 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002023 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002024 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002025 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002026 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002027 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002028 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002029 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002030}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002032PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002033"gethostname() -> string\n\
2034\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002035Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002036
Guido van Rossumff4949e1992-08-05 19:58:53 +00002037
Guido van Rossum30a685f1991-06-27 15:51:29 +00002038/* Python interface to gethostbyname(name). */
2039
2040/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002042socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002043{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002044 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002045 struct sockaddr_storage addrbuf;
2046
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002047 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002048 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002049 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002050 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002051 return makeipaddr((struct sockaddr *)&addrbuf,
2052 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002053}
2054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002055PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002056"gethostbyname(host) -> address\n\
2057\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002058Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002059
2060
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002061/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2062
2063static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002064gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002065{
2066 char **pch;
2067 PyObject *rtn_tuple = (PyObject *)NULL;
2068 PyObject *name_list = (PyObject *)NULL;
2069 PyObject *addr_list = (PyObject *)NULL;
2070 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002071
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002072 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002073 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002074#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002075 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002076#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002077 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002078#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002079 return NULL;
2080 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002081
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002082 if (h->h_addrtype != af) {
2083#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002084 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002085 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002086 (char *)strerror(EAFNOSUPPORT));
2087#else
2088 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002089 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002090 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002091#endif
2092 return NULL;
2093 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002094
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002095 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002096
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002097 case AF_INET:
2098 if (alen < sizeof(struct sockaddr_in))
2099 return NULL;
2100 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002101
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002102#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002103 case AF_INET6:
2104 if (alen < sizeof(struct sockaddr_in6))
2105 return NULL;
2106 break;
2107#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002108
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002109 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002110
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002111 if ((name_list = PyList_New(0)) == NULL)
2112 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002113
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002114 if ((addr_list = PyList_New(0)) == NULL)
2115 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002116
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002117 for (pch = h->h_aliases; *pch != NULL; pch++) {
2118 int status;
2119 tmp = PyString_FromString(*pch);
2120 if (tmp == NULL)
2121 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002122
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002123 status = PyList_Append(name_list, tmp);
2124 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002125
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002126 if (status)
2127 goto err;
2128 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002129
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002130 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2131 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002132
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002133 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002134
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002135 case AF_INET:
2136 {
2137 struct sockaddr_in sin;
2138 memset(&sin, 0, sizeof(sin));
2139 sin.sin_family = af;
2140#ifdef HAVE_SOCKADDR_SA_LEN
2141 sin.sin_len = sizeof(sin);
2142#endif
2143 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2144 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002145
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002146 if (pch == h->h_addr_list && alen >= sizeof(sin))
2147 memcpy((char *) addr, &sin, sizeof(sin));
2148 break;
2149 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002150
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002151#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002152 case AF_INET6:
2153 {
2154 struct sockaddr_in6 sin6;
2155 memset(&sin6, 0, sizeof(sin6));
2156 sin6.sin6_family = af;
2157#ifdef HAVE_SOCKADDR_SA_LEN
2158 sin6.sin6_len = sizeof(sin6);
2159#endif
2160 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2161 tmp = makeipaddr((struct sockaddr *)&sin6,
2162 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002163
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002164 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2165 memcpy((char *) addr, &sin6, sizeof(sin6));
2166 break;
2167 }
2168#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002169
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002170 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002171 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002172 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002173 return NULL;
2174 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002175
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002176 if (tmp == NULL)
2177 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002178
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002179 status = PyList_Append(addr_list, tmp);
2180 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002181
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002182 if (status)
2183 goto err;
2184 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002185
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002186 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002187
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002188 err:
2189 Py_XDECREF(name_list);
2190 Py_XDECREF(addr_list);
2191 return rtn_tuple;
2192}
2193
2194
2195/* Python interface to gethostbyname_ex(name). */
2196
2197/*ARGSUSED*/
2198static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002199socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002200{
2201 char *name;
2202 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002203 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002204 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002205 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002206#ifdef HAVE_GETHOSTBYNAME_R
2207 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002208#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2209 struct hostent_data data;
2210#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002211 char buf[16384];
2212 int buf_len = (sizeof buf) - 1;
2213 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002214#endif
2215#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002216 int result;
2217#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002218#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002219
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002220 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002221 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002222 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002223 return NULL;
2224 Py_BEGIN_ALLOW_THREADS
2225#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002226#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002227 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2228 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002229#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002230 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002231#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002232 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002233 result = gethostbyname_r(name, &hp_allocated, &data);
2234 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002235#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002236#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002237#ifdef USE_GETHOSTBYNAME_LOCK
2238 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002239#endif
2240 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002241#endif /* HAVE_GETHOSTBYNAME_R */
2242 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002243 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002244 addr.ss_family.
2245 Therefore, we cast the sockaddr_storage into sockaddr to
2246 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002247 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002248 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002249 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002250#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002251 PyThread_release_lock(gethostbyname_lock);
2252#endif
2253 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002254}
2255
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002256PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002257"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2258\n\
2259Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002260for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002261
2262
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002263/* Python interface to gethostbyaddr(IP). */
2264
2265/*ARGSUSED*/
2266static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002267socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002268{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002269#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002270 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002271#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002272 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002273#endif
2274 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002275 char *ip_num;
2276 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002277 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002278#ifdef HAVE_GETHOSTBYNAME_R
2279 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002280#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2281 struct hostent_data data;
2282#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002283 char buf[16384];
2284 int buf_len = (sizeof buf) - 1;
2285 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002286#endif
2287#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002288 int result;
2289#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002290#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002291 char *ap;
2292 int al;
2293 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002294
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002295 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002296 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002297 af = PF_UNSPEC;
2298 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002299 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002300 af = sa->sa_family;
2301 ap = NULL;
2302 al = 0;
2303 switch (af) {
2304 case AF_INET:
2305 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2306 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2307 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002308#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002309 case AF_INET6:
2310 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2311 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2312 break;
2313#endif
2314 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002315 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002316 return NULL;
2317 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002318 Py_BEGIN_ALLOW_THREADS
2319#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002320#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002321 result = gethostbyaddr_r(ap, al, af,
2322 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002323 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002324#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002325 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002326 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002327#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002328 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002329 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002330 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002331#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002332#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002333#ifdef USE_GETHOSTBYNAME_LOCK
2334 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002335#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002336 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002337#endif /* HAVE_GETHOSTBYNAME_R */
2338 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002339 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002340#ifdef USE_GETHOSTBYNAME_LOCK
2341 PyThread_release_lock(gethostbyname_lock);
2342#endif
2343 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002344}
2345
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002346PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002347"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2348\n\
2349Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002350for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002351
Guido van Rossum30a685f1991-06-27 15:51:29 +00002352
2353/* Python interface to getservbyname(name).
2354 This only returns the port number, since the other info is already
2355 known or not useful (like the list of aliases). */
2356
2357/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002358static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002359socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002360{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002361 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002362 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002363 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002364 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002365 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002366 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002367 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002368 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002369 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002370 return NULL;
2371 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002372 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002373}
2374
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002375PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002376"getservbyname(servicename, protocolname) -> integer\n\
2377\n\
2378Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002379The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002380
Guido van Rossum30a685f1991-06-27 15:51:29 +00002381
Guido van Rossum3901d851996-12-19 16:35:04 +00002382/* Python interface to getprotobyname(name).
2383 This only returns the protocol number, since the other info is
2384 already known or not useful (like the list of aliases). */
2385
2386/*ARGSUSED*/
2387static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002388socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002389{
2390 char *name;
2391 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002392#ifdef __BEOS__
2393/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002394 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002395 return NULL;
2396#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002397 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002398 return NULL;
2399 Py_BEGIN_ALLOW_THREADS
2400 sp = getprotobyname(name);
2401 Py_END_ALLOW_THREADS
2402 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002403 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002404 return NULL;
2405 }
2406 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002407#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002408}
2409
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002410PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002411"getprotobyname(name) -> integer\n\
2412\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002413Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002414
Guido van Rossum3901d851996-12-19 16:35:04 +00002415
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002416#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002417/* Create a socket object from a numeric file description.
2418 Useful e.g. if stdin is a socket.
2419 Additional arguments as for socket(). */
2420
2421/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002422static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002423socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002424{
Guido van Rossum73624e91994-10-10 17:59:00 +00002425 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002426 SOCKET_T fd;
2427 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002428 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2429 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002430 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002431 /* Dup the fd so it and the socket can be closed independently */
2432 fd = dup(fd);
2433 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002434 return set_error();
2435 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002436 /* From now on, ignore SIGPIPE and let the error checking
2437 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002438#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002439 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002440#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002441 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002442}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002443
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002444PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002445"fromfd(fd, family, type[, proto]) -> socket object\n\
2446\n\
2447Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002448The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002449
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002450#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002451
Guido van Rossum82a5c661998-07-07 20:45:43 +00002452
Guido van Rossum006bf911996-06-12 04:04:55 +00002453static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002454socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002455{
2456 int x1, x2;
2457
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002458 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002459 return NULL;
2460 }
2461 x2 = (int)ntohs((short)x1);
2462 return PyInt_FromLong(x2);
2463}
2464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002465PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002466"ntohs(integer) -> integer\n\
2467\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002468Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002469
2470
Guido van Rossum006bf911996-06-12 04:04:55 +00002471static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002472socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002473{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002474 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002475
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002476 if (PyInt_Check(arg)) {
2477 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002478 if (x == (unsigned long) -1 && PyErr_Occurred())
2479 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002480 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002481 else if (PyLong_Check(arg)) {
2482 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002483 if (x == (unsigned long) -1 && PyErr_Occurred())
2484 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002485#if SIZEOF_LONG > 4
2486 {
2487 unsigned long y;
2488 /* only want the trailing 32 bits */
2489 y = x & 0xFFFFFFFFUL;
2490 if (y ^ x)
2491 return PyErr_Format(PyExc_OverflowError,
2492 "long int larger than 32 bits");
2493 x = y;
2494 }
2495#endif
2496 }
2497 else
2498 return PyErr_Format(PyExc_TypeError,
2499 "expected int/long, %s found",
2500 arg->ob_type->tp_name);
2501 if (x == (unsigned long) -1 && PyErr_Occurred())
2502 return NULL;
2503 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002504}
2505
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002506PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002507"ntohl(integer) -> integer\n\
2508\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002509Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002510
2511
Guido van Rossum006bf911996-06-12 04:04:55 +00002512static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002513socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002514{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002515 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002516
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002517 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002518 return NULL;
2519 }
2520 x2 = (int)htons((short)x1);
2521 return PyInt_FromLong(x2);
2522}
2523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002524PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002525"htons(integer) -> integer\n\
2526\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002527Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002528
2529
Guido van Rossum006bf911996-06-12 04:04:55 +00002530static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002531socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002532{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002533 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002534
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002535 if (PyInt_Check(arg)) {
2536 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002537 if (x == (unsigned long) -1 && PyErr_Occurred())
2538 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002539 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002540 else if (PyLong_Check(arg)) {
2541 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002542 if (x == (unsigned long) -1 && PyErr_Occurred())
2543 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002544#if SIZEOF_LONG > 4
2545 {
2546 unsigned long y;
2547 /* only want the trailing 32 bits */
2548 y = x & 0xFFFFFFFFUL;
2549 if (y ^ x)
2550 return PyErr_Format(PyExc_OverflowError,
2551 "long int larger than 32 bits");
2552 x = y;
2553 }
2554#endif
2555 }
2556 else
2557 return PyErr_Format(PyExc_TypeError,
2558 "expected int/long, %s found",
2559 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002560 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002561}
2562
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002563PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002564"htonl(integer) -> integer\n\
2565\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002566Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002567
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002568/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002569
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002570PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002571"inet_aton(string) -> packed 32-bit IP representation\n\
2572\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002573Convert 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 +00002574binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002575
2576static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002577socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002578{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002579#ifndef INADDR_NONE
2580#define INADDR_NONE (-1)
2581#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002582
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002583 /* Have to use inet_addr() instead */
2584 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002585 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002586
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002587 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002588 return NULL;
2589 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002590 packed_addr = inet_addr(ip_addr);
2591
2592 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002593 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002594 "illegal IP address string passed to inet_aton");
2595 return NULL;
2596 }
2597
2598 return PyString_FromStringAndSize((char *) &packed_addr,
2599 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002600}
2601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002602PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002603"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002604\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002605Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002606
2607static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002608socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002609{
2610 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002611 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002612 struct in_addr packed_addr;
2613
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002614 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002615 return NULL;
2616 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002617
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002618 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002619 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002620 "packed IP wrong length for inet_ntoa");
2621 return NULL;
2622 }
2623
2624 memcpy(&packed_addr, packed_str, addr_len);
2625
2626 return PyString_FromString(inet_ntoa(packed_addr));
2627}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002628
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002629/* Python interface to getaddrinfo(host, port). */
2630
2631/*ARGSUSED*/
2632static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002633socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002634{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002635 struct addrinfo hints, *res;
2636 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002637 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002638 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002639 char *hptr, *pptr;
2640 int family, socktype, protocol, flags;
2641 int error;
2642 PyObject *all = (PyObject *)NULL;
2643 PyObject *single = (PyObject *)NULL;
2644
2645 family = socktype = protocol = flags = 0;
2646 family = PF_UNSPEC;
2647 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2648 &hptr, &pobj, &family, &socktype,
2649 &protocol, &flags)) {
2650 return NULL;
2651 }
2652 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002653 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002654 pptr = pbuf;
2655 } else if (PyString_Check(pobj)) {
2656 pptr = PyString_AsString(pobj);
2657 } else if (pobj == Py_None) {
2658 pptr = (char *)NULL;
2659 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002660 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002661 return NULL;
2662 }
2663 memset(&hints, 0, sizeof(hints));
2664 hints.ai_family = family;
2665 hints.ai_socktype = socktype;
2666 hints.ai_protocol = protocol;
2667 hints.ai_flags = flags;
2668 error = getaddrinfo(hptr, pptr, &hints, &res0);
2669 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002670 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002671 return NULL;
2672 }
2673
2674 if ((all = PyList_New(0)) == NULL)
2675 goto err;
2676 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002677 PyObject *addr =
2678 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2679 if (addr == NULL)
2680 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002681 single = Py_BuildValue("iiisO", res->ai_family,
2682 res->ai_socktype, res->ai_protocol,
2683 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002684 addr);
2685 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002686 if (single == NULL)
2687 goto err;
2688
2689 if (PyList_Append(all, single))
2690 goto err;
2691 Py_XDECREF(single);
2692 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002693 return all;
2694 err:
2695 Py_XDECREF(single);
2696 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002697 if (res0)
2698 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002699 return (PyObject *)NULL;
2700}
2701
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002702PyDoc_STRVAR(getaddrinfo_doc,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002703"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2704 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2705\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002706Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002707
2708/* Python interface to getnameinfo(sa, flags). */
2709
2710/*ARGSUSED*/
2711static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002712socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002713{
2714 PyObject *sa = (PyObject *)NULL;
2715 int flags;
2716 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002717 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002718 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2719 struct addrinfo hints, *res = NULL;
2720 int error;
2721 PyObject *ret = (PyObject *)NULL;
2722
2723 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002724 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002725 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002726 if (!PyArg_ParseTuple(sa, "si|ii",
2727 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002728 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002729 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002730 memset(&hints, 0, sizeof(hints));
2731 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002732 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002733 error = getaddrinfo(hostp, pbuf, &hints, &res);
2734 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002735 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002736 goto fail;
2737 }
2738 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002739 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002740 "sockaddr resolved to multiple addresses");
2741 goto fail;
2742 }
2743 switch (res->ai_family) {
2744 case AF_INET:
2745 {
2746 char *t1;
2747 int t2;
2748 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002749 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002750 "IPv4 sockaddr must be 2 tuple");
2751 goto fail;
2752 }
2753 break;
2754 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002755#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002756 case AF_INET6:
2757 {
2758 struct sockaddr_in6 *sin6;
2759 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2760 sin6->sin6_flowinfo = flowinfo;
2761 sin6->sin6_scope_id = scope_id;
2762 break;
2763 }
2764#endif
2765 }
2766 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2767 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2768 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002769 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002770 goto fail;
2771 }
2772 ret = Py_BuildValue("ss", hbuf, pbuf);
2773
2774fail:
2775 if (res)
2776 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002777 return ret;
2778}
2779
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002780PyDoc_STRVAR(getnameinfo_doc,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002781"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2782\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002783Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002784
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002785
2786/* Python API to getting and setting the default timeout value. */
2787
2788static PyObject *
2789socket_getdefaulttimeout(PyObject *self)
2790{
2791 if (defaulttimeout < 0.0) {
2792 Py_INCREF(Py_None);
2793 return Py_None;
2794 }
2795 else
2796 return PyFloat_FromDouble(defaulttimeout);
2797}
2798
2799PyDoc_STRVAR(getdefaulttimeout_doc,
2800"socket.getdefaulttimeout() -> None | float\n\
2801\n\
2802Returns the default timeout in floating seconds for new socket objects.\n\
2803A value of None indicates that new socket objects have no timeout.\n\
2804When the socket module is first imported, the default is None.");
2805
2806static PyObject *
2807socket_setdefaulttimeout(PyObject *self, PyObject *arg)
2808{
2809 double timeout;
2810
2811 if (arg == Py_None)
2812 timeout = -1.0;
2813 else {
2814 timeout = PyFloat_AsDouble(arg);
2815 if (timeout < 0.0) {
2816 if (!PyErr_Occurred())
2817 PyErr_SetString(PyExc_ValueError,
2818 "Timeout value out of range");
2819 return NULL;
2820 }
2821 }
2822
2823 defaulttimeout = timeout;
2824
2825 Py_INCREF(Py_None);
2826 return Py_None;
2827}
2828
2829PyDoc_STRVAR(setdefaulttimeout_doc,
2830"socket.setdefaulttimeout(None | float)\n\
2831\n\
2832Set the default timeout in floating seconds for new socket objects.\n\
2833A value of None indicates that new socket objects have no timeout.\n\
2834When the socket module is first imported, the default is None.");
2835
2836
Guido van Rossum30a685f1991-06-27 15:51:29 +00002837/* List of functions exported by this module. */
2838
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002839static PyMethodDef socket_methods[] = {
2840 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002841 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002842 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002843 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002844 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002845 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002846 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002847 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002848 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002849 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002850 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002851 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002852#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002853 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002854 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002855#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002856 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002857 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002858 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002859 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002860 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002861 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002862 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002863 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002864 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002865 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002866 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002867 METH_VARARGS, inet_ntoa_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002868 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002869 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002870 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002871 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00002872 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002873 METH_NOARGS, getdefaulttimeout_doc},
2874 {"setdefaulttimeout", socket_setdefaulttimeout,
2875 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002876 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002877};
2878
Guido van Rossum30a685f1991-06-27 15:51:29 +00002879
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002880#ifdef RISCOS
2881#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00002882
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002883static int
2884os_init(void)
2885{
2886 _kernel_swi_regs r;
2887
2888 r.r[0] = 0;
2889 _kernel_swi(0x43380, &r, &r);
2890 taskwindow = r.r[0];
2891
2892 return 0;
2893}
2894
2895#endif /* RISCOS */
2896
2897
2898#ifdef MS_WINDOWS
2899#define OS_INIT_DEFINED
2900
2901/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002902
2903static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002904os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002905{
2906 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002907}
2908
2909static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002910os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002911{
2912 WSADATA WSAData;
2913 int ret;
2914 char buf[100];
2915 ret = WSAStartup(0x0101, &WSAData);
2916 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002917 case 0: /* No error */
2918 atexit(os_cleanup);
2919 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002920 case WSASYSNOTREADY:
2921 PyErr_SetString(PyExc_ImportError,
2922 "WSAStartup failed: network not ready");
2923 break;
2924 case WSAVERNOTSUPPORTED:
2925 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002926 PyErr_SetString(
2927 PyExc_ImportError,
2928 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00002929 break;
2930 default:
Tim Peters885d4572001-11-28 20:27:42 +00002931 PyOS_snprintf(buf, sizeof(buf),
2932 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002933 PyErr_SetString(PyExc_ImportError, buf);
2934 break;
2935 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002936 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002937}
2938
Guido van Rossum8d665e61996-06-26 18:22:49 +00002939#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002940
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002941
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002942#ifdef PYOS_OS2
2943#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002944
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002945/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002946
2947static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002948os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002949{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002950#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002951 char reason[64];
2952 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002953
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002954 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002955 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002956 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002957
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002958 PyOS_snprintf(reason, sizeof(reason),
2959 "OS/2 TCP/IP Error# %d", sock_errno());
2960 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002961
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002962 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002963#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002964 /* No need to initialise sockets with GCC/EMX */
2965 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002966#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002967}
2968
2969#endif /* PYOS_OS2 */
2970
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002971
2972#ifndef OS_INIT_DEFINED
2973static int
2974os_init(void)
2975{
2976 return 1; /* Success */
2977}
2978#endif
2979
2980
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002981/* C API table - always add new things to the end for binary
2982 compatibility. */
2983static
2984PySocketModule_APIObject PySocketModuleAPI =
2985{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002986 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002987};
2988
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002989
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002990/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002991
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002992 This module is actually called "_socket", and there's a wrapper
2993 "socket.py" which implements some additional functionality. On some
2994 platforms (e.g. Windows and OS/2), socket.py also implements a
2995 wrapper for the socket type that provides missing functionality such
2996 as makefile(), dup() and fromfd(). The import of "_socket" may fail
2997 with an ImportError exception if os-specific initialization fails.
2998 On Windows, this does WINSOCK initialization. When WINSOCK is
2999 initialized succesfully, a call to WSACleanup() is scheduled to be
3000 made at exit time.
3001*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003003PyDoc_STRVAR(socket_doc,
Fred Drakea136d492000-08-16 14:18:30 +00003004"Implementation module for socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003005for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003006
Guido van Rossum3886bb61998-12-04 18:50:17 +00003007DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003008init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003009{
Fred Drake4baedc12002-04-01 14:53:37 +00003010 PyObject *m;
Fred Drake4baedc12002-04-01 14:53:37 +00003011
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003012 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003013 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003014
3015 sock_type.ob_type = &PyType_Type;
3016 sock_type.tp_getattro = PyObject_GenericGetAttr;
3017 sock_type.tp_alloc = PyType_GenericAlloc;
3018 sock_type.tp_free = PyObject_Del;
3019 m = Py_InitModule3(PySocket_MODULE_NAME,
3020 socket_methods,
3021 socket_doc);
3022
3023 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3024 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003025 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003026 Py_INCREF(socket_error);
3027 PyModule_AddObject(m, "error", socket_error);
3028 socket_herror = PyErr_NewException("socket.herror",
3029 socket_error, NULL);
3030 if (socket_herror == NULL)
3031 return;
3032 Py_INCREF(socket_herror);
3033 PyModule_AddObject(m, "herror", socket_herror);
3034 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003035 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003036 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003037 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003038 Py_INCREF(socket_gaierror);
3039 PyModule_AddObject(m, "gaierror", socket_gaierror);
3040 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003041 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003042 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003043 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003044 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003045 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003046 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003047 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003048
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003049 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003050 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003051 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3052 ) != 0)
3053 return;
3054
Guido van Rossum09be4091999-08-09 14:40:40 +00003055 /* Address families (we only support AF_INET and AF_UNIX) */
3056#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003057 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003058#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003059 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003060#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003061 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003062#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003063#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00003064 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003065#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003066#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003067 /* Amateur Radio AX.25 */
3068 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003069#endif
3070#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003071 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003072#endif
3073#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003074 /* Appletalk DDP */
3075 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003076#endif
3077#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003078 /* Amateur radio NetROM */
3079 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003080#endif
3081#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003082 /* Multiprotocol bridge */
3083 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003084#endif
3085#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003086 /* Reserved for Werner's ATM */
3087 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003088#endif
3089#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003090 /* Reserved for X.25 project */
3091 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003092#endif
3093#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003094 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003095#endif
3096#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003097 /* Amateur Radio X.25 PLP */
3098 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003099#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003100#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003101 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3102 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3103 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3104 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3105 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3106 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3107 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3108 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3109 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003110#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003111
3112 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003113 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3114 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003115#ifndef __BEOS__
3116/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003117 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3118 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3119 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003120#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003121
3122#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003123 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003124#endif
3125#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003126 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003127#endif
3128#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003129 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003130#endif
3131#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003132 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003133#endif
3134#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003135 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003136#endif
3137#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003138 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003139#endif
3140#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003141 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003142#endif
3143#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003144 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003145#endif
3146#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003147 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003148#endif
3149#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003150 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003151#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003152#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003153 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003154#endif
3155#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003156 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003157#endif
3158#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003159 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003160#endif
3161#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003162 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003163#endif
3164#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003165 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003166#endif
3167#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003168 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003169#endif
3170#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003171 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003172#endif
3173#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003174 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003175#endif
3176
3177 /* Maximum number of connections for "listen" */
3178#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003179 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003180#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003181 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003182#endif
3183
3184 /* Flags for send, recv */
3185#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003186 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003187#endif
3188#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003189 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003190#endif
3191#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003192 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003193#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003194#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003195 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003196#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003197#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003198 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003199#endif
3200#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003201 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003202#endif
3203#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003204 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003205#endif
3206#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003207 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003208#endif
3209#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003210 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003211#endif
3212#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003213 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003214#endif
3215
3216 /* Protocol level and numbers, usable for [gs]etsockopt */
3217#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003218 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003219#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003220#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003221 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003222#else
Fred Drake4baedc12002-04-01 14:53:37 +00003223 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003224#endif
3225#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003226 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003227#endif
3228#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003229 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003230#endif
3231#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003232 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003233#endif
3234#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003235 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003236#endif
3237#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003238 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003239#endif
3240#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003241 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003242#else
Fred Drake4baedc12002-04-01 14:53:37 +00003243 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003244#endif
3245#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003246 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003247#else
Fred Drake4baedc12002-04-01 14:53:37 +00003248 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003249#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003250#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003251 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003252#else
Fred Drake4baedc12002-04-01 14:53:37 +00003253 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003254#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003255#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003256 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003257#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003258#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003259 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003260#else
Fred Drake4baedc12002-04-01 14:53:37 +00003261 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003262#endif
3263#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003264 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003265#endif
3266#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003267 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003268#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003269#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003270 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003271#endif
3272#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003273 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003274#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003275#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003276 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003277#else
Fred Drake4baedc12002-04-01 14:53:37 +00003278 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003279#endif
3280#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003281 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003282#endif
3283#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003284 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003285#endif
3286#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003287 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003288#else
Fred Drake4baedc12002-04-01 14:53:37 +00003289 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003290#endif
3291#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003292 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003293#endif
3294#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003295 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003296#endif
3297#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003298 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003299#endif
3300#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003301 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003302#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003303#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003304 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003305#endif
3306#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003307 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003308#endif
3309#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003310 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003311#endif
3312#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003313 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003314#endif
3315#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003316 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003317#endif
3318#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003319 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003320#endif
3321#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003322 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003323#endif
3324#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003325 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003326#endif
3327#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003328 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003329#endif
3330#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003331 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003332#endif
3333#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003334 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003335#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003336#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003337 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003338#endif
3339#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003340 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003341#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003342#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003343 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003344#endif
3345#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003346 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003347#endif
3348#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003349 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003350#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003351#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003352 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003353#endif
3354/**/
3355#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003356 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003357#else
Fred Drake4baedc12002-04-01 14:53:37 +00003358 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003359#endif
3360#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003361 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003362#endif
3363
3364 /* Some port configuration */
3365#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003366 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003367#else
Fred Drake4baedc12002-04-01 14:53:37 +00003368 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003369#endif
3370#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003371 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003372#else
Fred Drake4baedc12002-04-01 14:53:37 +00003373 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003374#endif
3375
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003376 /* Some reserved IP v.4 addresses */
3377#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003378 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003379#else
Fred Drake4baedc12002-04-01 14:53:37 +00003380 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003381#endif
3382#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003383 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003384#else
Fred Drake4baedc12002-04-01 14:53:37 +00003385 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003386#endif
3387#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003388 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003389#else
Fred Drake4baedc12002-04-01 14:53:37 +00003390 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003391#endif
3392#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003393 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003394#else
Fred Drake4baedc12002-04-01 14:53:37 +00003395 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003396#endif
3397#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003398 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3399 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003400#else
Fred Drake4baedc12002-04-01 14:53:37 +00003401 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003402#endif
3403#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003404 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3405 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003406#else
Fred Drake4baedc12002-04-01 14:53:37 +00003407 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003408#endif
3409#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003410 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003411#else
Fred Drake4baedc12002-04-01 14:53:37 +00003412 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003413#endif
3414
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003415 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003416#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003417 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003418#endif
3419#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003420 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003421#endif
3422#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003424#endif
3425#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003426 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003427#endif
3428#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003429 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003430#endif
3431#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003432 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003433#endif
3434#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003435 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003436#endif
3437#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003438 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003439#endif
3440#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003441 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003442#endif
3443#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003444 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003445#endif
3446#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003447 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003448#endif
3449#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003450 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003451#endif
3452#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003453 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003454#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003455#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003456 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3457 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003458#endif
3459#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003460 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3461 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003462#endif
3463#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003464 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003465#endif
3466
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003467 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3468#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003469 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003470#endif
3471#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003472 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003473#endif
3474#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003475 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003476#endif
3477#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003478 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003479#endif
3480#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003481 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003482#endif
3483#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003484 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003485#endif
3486
Guido van Rossum09be4091999-08-09 14:40:40 +00003487 /* TCP options */
3488#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003489 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003490#endif
3491#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003492 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003493#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003494#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003495 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003496#endif
3497#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003498 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003499#endif
3500#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003501 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003502#endif
3503#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003504 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003505#endif
3506#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003507 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003508#endif
3509#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003510 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003511#endif
3512#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003513 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003514#endif
3515#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003516 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003517#endif
3518#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003519 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003520#endif
3521#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003522 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003523#endif
3524
Guido van Rossum09be4091999-08-09 14:40:40 +00003525
3526 /* IPX options */
3527#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003528 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003529#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003530
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003531 /* get{addr,name}info parameters */
3532#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003533 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003534#endif
3535#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003536 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003537#endif
3538#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003539 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003540#endif
3541#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003542 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003543#endif
3544#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003545 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003546#endif
3547#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003548 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003549#endif
3550#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003551 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003552#endif
3553#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003554 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003555#endif
3556#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003557 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003558#endif
3559#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003560 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003561#endif
3562#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003563 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003564#endif
3565#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003566 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003567#endif
3568#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003569 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003570#endif
3571#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003572 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003573#endif
3574#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003575 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003576#endif
3577#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003578 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003579#endif
3580#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003581 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003582#endif
3583#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003584 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003585#endif
3586#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003587 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003588#endif
3589#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003590 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003591#endif
3592#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003593 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003594#endif
3595#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003596 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003597#endif
3598#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003599 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003600#endif
3601#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003602 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003603#endif
3604#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003605 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003606#endif
3607#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003608 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003609#endif
3610#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003611 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003612#endif
3613#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003614 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003615#endif
3616#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003617 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003618#endif
3619#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003620 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003621#endif
3622
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003623 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003624#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003625 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003626#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003627}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003628
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003629
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003630#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003631
3632/* Simplistic emulation code for inet_pton that only works for IPv4 */
3633
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003634int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003635inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003636{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003637 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003638 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003639 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003640 if (packed_addr == INADDR_NONE)
3641 return 0;
3642 memcpy(dst, &packed_addr, 4);
3643 return 1;
3644 }
3645 /* Should set errno to EAFNOSUPPORT */
3646 return -1;
3647}
3648
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003649const char *
3650inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003651{
3652 if (af == AF_INET) {
3653 struct in_addr packed_addr;
3654 if (size < 16)
3655 /* Should set errno to ENOSPC. */
3656 return NULL;
3657 memcpy(&packed_addr, src, sizeof(packed_addr));
3658 return strncpy(dst, inet_ntoa(packed_addr), size);
3659 }
3660 /* Should set errno to EAFNOSUPPORT */
3661 return NULL;
3662}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003663
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003664#endif