blob: a790900d259432bf58054a8e4a414eef77327646 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Jeremy Hylton22308652001-02-02 03:23:09 +000010 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000011- No read/write operations (use sendall/recv or makefile instead).
12- Additional restrictions apply on some non-Unix platforms (compensated
13 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000018- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
19 a subclass of socket.error
20- socket.herror: exception raised for gethostby* errors,
21 a subclass of socket.error
Guido van Rossum83a072d2002-09-03 19:10:18 +000022- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
23 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000024- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000025- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000027- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000028- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum83a072d2002-09-03 19:10:18 +000029- socket.socket([family[, type [, proto]]]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000030- socket.ntohs(16 bit value) --> new int object
31- socket.ntohl(32 bit value) --> new int object
32- socket.htons(16 bit value) --> new int object
33- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000034- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
35 --> List of (family, socktype, proto, canonname, sockaddr)
36- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000037- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000038- socket.inet_aton(IP address) -> 32-bit packed IP representation
39- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000040- socket.getdefaulttimeout() -> None | float
41- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000042- an Internet socket address is a pair (hostname, port)
43 where hostname can be anything recognized by gethostbyname()
44 (including the dd.dd.dd.dd notation) and port is in host byte order
45- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000046- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000047- an AF_PACKET socket address is a tuple containing a string
48 specifying the ethernet interface and an integer specifying
49 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000050 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
51 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000052 networking code, but accepted since they are returned by the
53 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000054
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000055Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000056
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000057- names starting with sock_ are socket object methods
58- names starting with socket_ are module-level functions
59- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000060
Guido van Rossum6574b3e1991-06-25 21:36:08 +000061*/
62
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000063#include "Python.h"
64
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000065/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000066PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000067"socket([family[, type[, proto]]]) -> socket object\n\
68\n\
69Open a socket of the given type. The family argument specifies the\n\
70address family; it defaults to AF_INET. The type argument specifies\n\
71whether this is a stream (SOCK_STREAM, this is the default)\n\
72or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
73specifying the default protocol. Keyword arguments are accepted.\n\
74\n\
75A socket object represents one endpoint of a network connection.\n\
76\n\
77Methods of socket objects (keyword arguments not allowed):\n\
78\n\
79accept() -- accept a connection, returning new socket and client address\n\
80bind(addr) -- bind the socket to a local address\n\
81close() -- close the socket\n\
82connect(addr) -- connect the socket to a remote address\n\
83connect_ex(addr) -- connect, return an error code instead of an exception\n\
84dup() -- return a new socket object identical to the current one [*]\n\
85fileno() -- return underlying file descriptor\n\
86getpeername() -- return remote address [*]\n\
87getsockname() -- return local address\n\
88getsockopt(level, optname[, buflen]) -- get socket options\n\
89gettimeout() -- return timeout or None\n\
90listen(n) -- start listening for incoming connections\n\
91makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
92recv(buflen[, flags]) -- receive data\n\
93recvfrom(buflen[, flags]) -- receive data and sender's address\n\
94sendall(data[, flags]) -- send all data\n\
95send(data[, flags]) -- send data, may not send all of it\n\
96sendto(data[, flags], addr) -- send data to a given address\n\
97setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
98setsockopt(level, optname, value) -- set socket options\n\
99settimeout(None | float) -- set or clear the timeout\n\
100shutdown(how) -- shut down traffic in one or both directions\n\
101\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000103
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000104/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
105 I hope some day someone can clean this up please... */
106
Guido van Rossum9376b741999-09-15 22:01:40 +0000107/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
108 script doesn't get this right, so we hardcode some platform checks below.
109 On the other hand, not all Linux versions agree, so there the settings
110 computed by the configure script are needed! */
111
112#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000113# undef HAVE_GETHOSTBYNAME_R_3_ARG
114# undef HAVE_GETHOSTBYNAME_R_5_ARG
115# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000116#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000117
Guido van Rossum7a122991999-04-13 04:07:32 +0000118#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000119# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000120#endif
121
Guido van Rossume7de2061999-03-24 17:24:33 +0000122#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000123# if defined(_AIX) || defined(__osf__)
124# define HAVE_GETHOSTBYNAME_R_3_ARG
125# elif defined(__sun) || defined(__sgi)
126# define HAVE_GETHOSTBYNAME_R_5_ARG
127# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000128/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000129# else
130# undef HAVE_GETHOSTBYNAME_R
131# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000132#endif
133
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000134#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
135 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000136# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000137#endif
138
139#ifdef USE_GETHOSTBYNAME_LOCK
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000141#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000142
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000143#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000144# include <types.h>
145# include <io.h>
146# include <sys/ioctl.h>
147# include <utils.h>
148# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000149#endif
150
151#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152# define INCL_DOS
153# define INCL_DOSERRORS
154# define INCL_NOPMAPI
155# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000156#endif
157
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000158/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000159#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000160#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000162/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000164#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000165
166/* Addressing includes */
167
Guido van Rossum6f489d91996-06-28 20:15:15 +0000168#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000169
170/* Non-MS WINDOWS includes */
171# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000172
Guido van Rossum9376b741999-09-15 22:01:40 +0000173/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000174# ifdef __BEOS__
175# include <net/netdb.h>
176# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
177# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000178typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000180# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000182
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000183# ifndef RISCOS
184# include <fcntl.h>
185# else
186# include <sys/fcntl.h>
187# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000188int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000189# endif
190
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000191#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000192
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000193/* MS_WINDOWS includes */
194# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000195
Jeremy Hylton22308652001-02-02 03:23:09 +0000196#endif
197
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000198#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000199# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000200#endif
201
202#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000203# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000204#endif
205
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000206#ifndef O_NDELAY
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000207# define O_NDELAY O_NONBLOCK /* For QNX only? */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000208#endif
209
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000210#include "addrinfo.h"
211
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000212#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000213int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000214const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000215#endif
216
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000217#ifdef __APPLE__
218/* On OS X, getaddrinfo returns no error indication of lookup
219 failure, so we must use the emulation instead of the libinfo
220 implementation. Unfortunately, performing an autoconf test
221 for this bug would require DNS access for the machine performing
222 the configuration, which is not acceptable. Therefore, we
223 determine the bug just by checking for __APPLE__. If this bug
224 gets ever fixed, perhaps checking for sys/version.h would be
225 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000226#ifndef HAVE_GETNAMEINFO
227/* This bug seems to be fixed in Jaguar. Ths easiest way I could
228 Find to check for Jaguar is that it has getnameinfo(), which
229 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000230#undef HAVE_GETADDRINFO
231/* avoid clashes with the C library definition of the symbol. */
232#define getaddrinfo fake_getaddrinfo
233#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000234#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000235
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000236/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000237#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000238#include "getaddrinfo.c"
239#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000240#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000241#include "getnameinfo.c"
242#endif
243
Guido van Rossumbcc20741998-08-04 22:53:56 +0000244#if defined(MS_WINDOWS) || defined(__BEOS__)
245/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000246/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000247#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000248#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000249#endif
250
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000251#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000252#define EAFNOSUPPORT WSAEAFNOSUPPORT
253#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000254#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000255
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000256#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000257#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000258#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000259#endif
260
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000261#ifndef SOCKETCLOSE
262#define SOCKETCLOSE close
263#endif
264
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000265/* XXX There's a problem here: *static* functions are not supposed to have
266 a Py prefix (or use CapitalizedWords). Later... */
267
Guido van Rossum30a685f1991-06-27 15:51:29 +0000268/* Global variable holding the exception type for errors detected
269 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000270static PyObject *socket_error;
271static PyObject *socket_herror;
272static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000273
Guido van Rossum48a680c2001-03-02 06:34:14 +0000274#ifdef RISCOS
275/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
276static int taskwindow;
277#endif
278
Tim Peters643a7fc2002-02-17 04:13:21 +0000279/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000280 The sock_type variable contains pointers to various functions,
281 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000282 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000283static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000284
Guido van Rossum30a685f1991-06-27 15:51:29 +0000285/* Convenience function to raise an error according to errno
286 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000287
Guido van Rossum73624e91994-10-10 17:59:00 +0000288static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000289set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000290{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000291#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000292 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000293 static struct {
294 int no;
295 const char *msg;
296 } *msgp, msgs[] = {
297 {WSAEINTR, "Interrupted system call"},
298 {WSAEBADF, "Bad file descriptor"},
299 {WSAEACCES, "Permission denied"},
300 {WSAEFAULT, "Bad address"},
301 {WSAEINVAL, "Invalid argument"},
302 {WSAEMFILE, "Too many open files"},
303 {WSAEWOULDBLOCK,
304 "The socket operation could not complete "
305 "without blocking"},
306 {WSAEINPROGRESS, "Operation now in progress"},
307 {WSAEALREADY, "Operation already in progress"},
308 {WSAENOTSOCK, "Socket operation on non-socket"},
309 {WSAEDESTADDRREQ, "Destination address required"},
310 {WSAEMSGSIZE, "Message too long"},
311 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
312 {WSAENOPROTOOPT, "Protocol not available"},
313 {WSAEPROTONOSUPPORT, "Protocol not supported"},
314 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
315 {WSAEOPNOTSUPP, "Operation not supported"},
316 {WSAEPFNOSUPPORT, "Protocol family not supported"},
317 {WSAEAFNOSUPPORT, "Address family not supported"},
318 {WSAEADDRINUSE, "Address already in use"},
319 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
320 {WSAENETDOWN, "Network is down"},
321 {WSAENETUNREACH, "Network is unreachable"},
322 {WSAENETRESET, "Network dropped connection on reset"},
323 {WSAECONNABORTED, "Software caused connection abort"},
324 {WSAECONNRESET, "Connection reset by peer"},
325 {WSAENOBUFS, "No buffer space available"},
326 {WSAEISCONN, "Socket is already connected"},
327 {WSAENOTCONN, "Socket is not connected"},
328 {WSAESHUTDOWN, "Can't send after socket shutdown"},
329 {WSAETOOMANYREFS, "Too many references: can't splice"},
330 {WSAETIMEDOUT, "Operation timed out"},
331 {WSAECONNREFUSED, "Connection refused"},
332 {WSAELOOP, "Too many levels of symbolic links"},
333 {WSAENAMETOOLONG, "File name too long"},
334 {WSAEHOSTDOWN, "Host is down"},
335 {WSAEHOSTUNREACH, "No route to host"},
336 {WSAENOTEMPTY, "Directory not empty"},
337 {WSAEPROCLIM, "Too many processes"},
338 {WSAEUSERS, "Too many users"},
339 {WSAEDQUOT, "Disc quota exceeded"},
340 {WSAESTALE, "Stale NFS file handle"},
341 {WSAEREMOTE, "Too many levels of remote in path"},
342 {WSASYSNOTREADY, "Network subsystem is unvailable"},
343 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
344 {WSANOTINITIALISED,
345 "Successful WSAStartup() not yet performed"},
346 {WSAEDISCON, "Graceful shutdown in progress"},
347 /* Resolver errors */
348 {WSAHOST_NOT_FOUND, "No such host is known"},
349 {WSATRY_AGAIN, "Host not found, or server failed"},
350 {WSANO_RECOVERY, "Unexpected server error encountered"},
351 {WSANO_DATA, "Valid name without requested data"},
352 {WSANO_ADDRESS, "No address, look for MX record"},
353 {0, NULL}
354 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000355 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000356 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000357 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000358
Mark Hammond46a733d2000-07-24 01:45:11 +0000359 for (msgp = msgs; msgp->msg; msgp++) {
360 if (err_no == msgp->no) {
361 msg = msgp->msg;
362 break;
363 }
364 }
365
366 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000367 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000368 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000369 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000370 }
371 return NULL;
372 }
373 else
374#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000375
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000376#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000377 if (sock_errno() != NO_ERROR) {
378 APIRET rc;
379 ULONG msglen;
380 char outbuf[100];
381 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000382
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000383 /* Retrieve socket-related error message from MPTN.MSG file */
384 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
385 myerrorcode - SOCBASEERR + 26,
386 "mptn.msg",
387 &msglen);
388 if (rc == NO_ERROR) {
389 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000390
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000391 /* OS/2 doesn't guarantee a terminator */
392 outbuf[msglen] = '\0';
393 if (strlen(outbuf) > 0) {
394 /* If non-empty msg, trim CRLF */
395 char *lastc = &outbuf[ strlen(outbuf)-1 ];
396 while (lastc > outbuf && isspace(*lastc)) {
397 /* Trim trailing whitespace (CRLF) */
398 *lastc-- = '\0';
399 }
400 }
401 v = Py_BuildValue("(is)", myerrorcode, outbuf);
402 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000403 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000404 Py_DECREF(v);
405 }
406 return NULL;
407 }
408 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000409#endif
410
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000411 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000412}
413
Guido van Rossum30a685f1991-06-27 15:51:29 +0000414
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000415static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000416set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000417{
418 PyObject *v;
419
420#ifdef HAVE_HSTRERROR
421 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
422#else
423 v = Py_BuildValue("(is)", h_error, "host not found");
424#endif
425 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000426 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000427 Py_DECREF(v);
428 }
429
430 return NULL;
431}
432
433
434static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000435set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000436{
437 PyObject *v;
438
Martin v. Löwis272cb402002-03-01 08:31:07 +0000439#ifdef EAI_SYSTEM
440 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000441 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000442 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000443#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000444
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000445#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000446 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000447#else
448 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
449#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000450 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000451 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000452 Py_DECREF(v);
453 }
454
455 return NULL;
456}
457
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000458/* Function to perform the setting of socket blocking mode
459 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000460static int
461internal_setblocking(PySocketSockObject *s, int block)
462{
463#ifndef RISCOS
464#ifndef MS_WINDOWS
465 int delay_flag;
466#endif
467#endif
468
469 Py_BEGIN_ALLOW_THREADS
470#ifdef __BEOS__
471 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000472 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
473 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000474#else
475#ifndef RISCOS
476#ifndef MS_WINDOWS
477#if defined(PYOS_OS2) && !defined(PYCC_GCC)
478 block = !block;
479 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
480#else /* !PYOS_OS2 */
481 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
482 if (block)
483 delay_flag &= (~O_NDELAY);
484 else
485 delay_flag |= O_NDELAY;
486 fcntl(s->sock_fd, F_SETFL, delay_flag);
487#endif /* !PYOS_OS2 */
488#else /* MS_WINDOWS */
489 block = !block;
490 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
491#endif /* MS_WINDOWS */
492#endif /* __BEOS__ */
493#endif /* RISCOS */
494 Py_END_ALLOW_THREADS
495
496 /* Since these don't return anything */
497 return 1;
498}
499
Guido van Rossum11ba0942002-06-13 15:07:44 +0000500/* Do a select() on the socket, if necessary (sock_timeout > 0).
501 The argument writing indicates the direction.
502 This does not raise an exception or return a success indicator;
503 we'll let the actual socket call do that. */
504static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000505internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000506{
507 fd_set fds;
508 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000509
Guido van Rossumad654902002-07-19 12:44:59 +0000510 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000511 if (s->sock_timeout <= 0.0)
512 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000513
Guido van Rossumad654902002-07-19 12:44:59 +0000514 /* Guard against closed socket */
515 if (s->sock_fd < 0)
516 return;
517
Guido van Rossum67f7a382002-06-06 21:08:16 +0000518 /* Construct the arguments to select */
519 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000520 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000521 FD_ZERO(&fds);
522 FD_SET(s->sock_fd, &fds);
523
524 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000525 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000526 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000527 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000528 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000529}
530
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000531/* Initialize a new socket object. */
532
Tim Petersa12b4cf2002-07-18 22:38:44 +0000533static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000534
Mark Hammond62b1ab12002-07-23 06:31:15 +0000535PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000536init_sockobject(PySocketSockObject *s,
537 SOCKET_T fd, int family, int type, int proto)
538{
539#ifdef RISCOS
540 int block = 1;
541#endif
542 s->sock_fd = fd;
543 s->sock_family = family;
544 s->sock_type = type;
545 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000546 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000547
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000548 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000549
550 if (defaulttimeout >= 0.0)
551 internal_setblocking(s, 0);
552
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000553#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000554 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000555 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000556#endif
557}
558
559
Guido van Rossum30a685f1991-06-27 15:51:29 +0000560/* Create a new socket object.
561 This just creates the object and initializes it.
562 If the creation fails, return NULL and set an exception (implicit
563 in NEWOBJ()). */
564
Guido van Rossum73624e91994-10-10 17:59:00 +0000565static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000566new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567{
Guido van Rossum73624e91994-10-10 17:59:00 +0000568 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000569 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000570 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000571 if (s != NULL)
572 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000573 return s;
574}
575
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576
Guido van Rossum48a680c2001-03-02 06:34:14 +0000577/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000578 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000579#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000580PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000581#endif
582
583
Guido van Rossum30a685f1991-06-27 15:51:29 +0000584/* Convert a string specifying a host name or one of a few symbolic
585 names to a numeric IP address. This usually calls gethostbyname()
586 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000587 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000588 an error occurred; then an exception is raised. */
589
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000590static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000591setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000592{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000593 struct addrinfo hints, *res;
594 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000595
Guido van Rossuma376cc51996-12-05 23:43:35 +0000596 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000597 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598 int siz;
599 memset(&hints, 0, sizeof(hints));
600 hints.ai_family = af;
601 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
602 hints.ai_flags = AI_PASSIVE;
603 error = getaddrinfo(NULL, "0", &hints, &res);
604 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000605 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606 return -1;
607 }
608 switch (res->ai_family) {
609 case AF_INET:
610 siz = 4;
611 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000612#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613 case AF_INET6:
614 siz = 16;
615 break;
616#endif
617 default:
618 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000619 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000620 "unsupported address family");
621 return -1;
622 }
623 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000624 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000625 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000626 "wildcard resolved to multiple address");
627 return -1;
628 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000629 if (res->ai_addrlen < addr_ret_size)
630 addr_ret_size = res->ai_addrlen;
631 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000632 freeaddrinfo(res);
633 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000634 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000635 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000636 struct sockaddr_in *sin;
637 if (af != PF_INET && af != PF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000638 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000639 "address family mismatched");
640 return -1;
641 }
642 sin = (struct sockaddr_in *)addr_ret;
643 memset((void *) sin, '\0', sizeof(*sin));
644 sin->sin_family = AF_INET;
645#ifdef HAVE_SOCKADDR_SA_LEN
646 sin->sin_len = sizeof(*sin);
647#endif
648 sin->sin_addr.s_addr = INADDR_BROADCAST;
649 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000650 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000651 memset(&hints, 0, sizeof(hints));
652 hints.ai_family = af;
653 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000654#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000655 if (error == EAI_NONAME && af == AF_UNSPEC) {
656 /* On Tru64 V5.1, numeric-to-addr conversion fails
657 if no address family is given. Assume IPv4 for now.*/
658 hints.ai_family = AF_INET;
659 error = getaddrinfo(name, NULL, &hints, &res);
660 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000661#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000662 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000663 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000664 return -1;
665 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000666 if (res->ai_addrlen < addr_ret_size)
667 addr_ret_size = res->ai_addrlen;
668 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000669 freeaddrinfo(res);
670 switch (addr_ret->sa_family) {
671 case AF_INET:
672 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000673#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000674 case AF_INET6:
675 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000676#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000677 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000678 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000679 return -1;
680 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000681}
682
Guido van Rossum30a685f1991-06-27 15:51:29 +0000683
Guido van Rossum30a685f1991-06-27 15:51:29 +0000684/* Create a string object representing an IP address.
685 This is always a string of the form 'dd.dd.dd.dd' (with variable
686 size numbers). */
687
Guido van Rossum73624e91994-10-10 17:59:00 +0000688static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000689makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000690{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000691 char buf[NI_MAXHOST];
692 int error;
693
694 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
695 NI_NUMERICHOST);
696 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000697 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000698 return NULL;
699 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000700 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000701}
702
703
704/* Create an object representing the given socket address,
705 suitable for passing it back to bind(), connect() etc.
706 The family field of the sockaddr structure is inspected
707 to determine what kind of address it really is. */
708
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000709/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000710static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000711makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000712{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000713 if (addrlen == 0) {
714 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000715 Py_INCREF(Py_None);
716 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000717 }
718
Guido van Rossumbcc20741998-08-04 22:53:56 +0000719#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000720 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000721 addr->sa_family = AF_INET;
722#endif
723
Guido van Rossum30a685f1991-06-27 15:51:29 +0000724 switch (addr->sa_family) {
725
726 case AF_INET:
727 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000728 struct sockaddr_in *a;
729 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000730 PyObject *ret = NULL;
731 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000732 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000733 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
734 Py_DECREF(addrobj);
735 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000736 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000737 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000738
Guido van Rossumb6775db1994-08-01 11:34:53 +0000739#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000740 case AF_UNIX:
741 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000742 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000743 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000744 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000745#endif /* AF_UNIX */
746
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000747#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000748 case AF_INET6:
749 {
750 struct sockaddr_in6 *a;
751 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
752 PyObject *ret = NULL;
753 if (addrobj) {
754 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000755 ret = Py_BuildValue("Oiii",
756 addrobj,
757 ntohs(a->sin6_port),
758 a->sin6_flowinfo,
759 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000760 Py_DECREF(addrobj);
761 }
762 return ret;
763 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000764#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000765
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000766#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000767 case AF_PACKET:
768 {
769 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
770 char *ifname = "";
771 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000772 /* need to look up interface name give index */
773 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000774 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000775 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000776 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000777 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000778 return Py_BuildValue("shbhs#",
779 ifname,
780 ntohs(a->sll_protocol),
781 a->sll_pkttype,
782 a->sll_hatype,
783 a->sll_addr,
784 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000785 }
786#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000787
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788 /* More cases here... */
789
790 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000791 /* If we don't know the address family, don't raise an
792 exception -- return it as a tuple. */
793 return Py_BuildValue("is#",
794 addr->sa_family,
795 addr->sa_data,
796 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000797
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000799}
800
Guido van Rossum30a685f1991-06-27 15:51:29 +0000801
802/* Parse a socket address argument according to the socket object's
803 address family. Return 1 if the address was in the proper format,
804 0 of not. The address is returned through addr_ret, its length
805 through len_ret. */
806
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000808getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000809 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000811 switch (s->sock_family) {
812
Guido van Rossumb6775db1994-08-01 11:34:53 +0000813#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000814 case AF_UNIX:
815 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000816 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000817 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000818 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000819 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000820 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000821 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000822 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000823 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000824 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000825 return 0;
826 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000827 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000828 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000829 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000830 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000831 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000832 return 1;
833 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000834#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000835
Guido van Rossum30a685f1991-06-27 15:51:29 +0000836 case AF_INET:
837 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000838 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000839 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000840 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000841 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000842 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000843 PyErr_Format(
844 PyExc_TypeError,
845 "getsockaddrarg: "
846 "AF_INET address must be tuple, not %.500s",
847 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000848 return 0;
849 }
850 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000851 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000852 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000854 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000855 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000856 *addr_ret = (struct sockaddr *) addr;
857 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000858 return 1;
859 }
860
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000861#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000862 case AF_INET6:
863 {
864 struct sockaddr_in6* addr;
865 char *host;
866 int port, flowinfo, scope_id;
867 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
868 flowinfo = scope_id = 0;
869 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000870 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000871 return 0;
872 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000873 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000874 return 0;
875 addr->sin6_family = s->sock_family;
876 addr->sin6_port = htons((short)port);
877 addr->sin6_flowinfo = flowinfo;
878 addr->sin6_scope_id = scope_id;
879 *addr_ret = (struct sockaddr *) addr;
880 *len_ret = sizeof *addr;
881 return 1;
882 }
883#endif
884
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000885#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000886 case AF_PACKET:
887 {
888 struct sockaddr_ll* addr;
889 struct ifreq ifr;
890 char *interfaceName;
891 int protoNumber;
892 int hatype = 0;
893 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000894 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000895
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000896 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
897 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000898 return 0;
899 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
900 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000901 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000902 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000903 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000904 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000905 addr = &(s->sock_addr.ll);
906 addr->sll_family = AF_PACKET;
907 addr->sll_protocol = htons((short)protoNumber);
908 addr->sll_ifindex = ifr.ifr_ifindex;
909 addr->sll_pkttype = pkttype;
910 addr->sll_hatype = hatype;
911 *addr_ret = (struct sockaddr *) addr;
912 *len_ret = sizeof *addr;
913 return 1;
914 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000915#endif
916
Guido van Rossum30a685f1991-06-27 15:51:29 +0000917 /* More cases here... */
918
919 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000920 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000921 return 0;
922
923 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000924}
925
Guido van Rossum30a685f1991-06-27 15:51:29 +0000926
Guido van Rossum48a680c2001-03-02 06:34:14 +0000927/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000928 Return 1 if the family is known, 0 otherwise. The length is returned
929 through len_ret. */
930
931static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000932getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000933{
934 switch (s->sock_family) {
935
Guido van Rossumb6775db1994-08-01 11:34:53 +0000936#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000937 case AF_UNIX:
938 {
939 *len_ret = sizeof (struct sockaddr_un);
940 return 1;
941 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000942#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000943
944 case AF_INET:
945 {
946 *len_ret = sizeof (struct sockaddr_in);
947 return 1;
948 }
949
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000950#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000951 case AF_INET6:
952 {
953 *len_ret = sizeof (struct sockaddr_in6);
954 return 1;
955 }
956#endif
957
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000958#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000959 case AF_PACKET:
960 {
961 *len_ret = sizeof (struct sockaddr_ll);
962 return 1;
963 }
964#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000965
Guido van Rossum710e1df1992-06-12 10:39:36 +0000966 /* More cases here... */
967
968 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000969 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000970 return 0;
971
972 }
973}
974
975
Guido van Rossum30a685f1991-06-27 15:51:29 +0000976/* s.accept() method */
977
Guido van Rossum73624e91994-10-10 17:59:00 +0000978static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000979sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000980{
981 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000982 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000983 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000984 PyObject *sock = NULL;
985 PyObject *addr = NULL;
986 PyObject *res = NULL;
987
Guido van Rossum710e1df1992-06-12 10:39:36 +0000988 if (!getsockaddrlen(s, &addrlen))
989 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000990 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000991
Guido van Rossum73624e91994-10-10 17:59:00 +0000992 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +0000993 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000994 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000996
Fred Drakea04eaad2000-06-30 02:46:07 +0000997#ifdef MS_WINDOWS
998 if (newfd == INVALID_SOCKET)
999#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001000 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001001#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001002 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001003
Guido van Rossum30a685f1991-06-27 15:51:29 +00001004 /* Create the new object with unspecified family,
1005 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001006 sock = (PyObject *) new_sockobject(newfd,
1007 s->sock_family,
1008 s->sock_type,
1009 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001010
Barry Warsaw752300b1997-01-03 17:18:10 +00001011 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001012 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001013 goto finally;
1014 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001015 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001016 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001017 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001018 goto finally;
1019
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001020 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001021
Guido van Rossum67f7a382002-06-06 21:08:16 +00001022finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001023 Py_XDECREF(sock);
1024 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001025 return res;
1026}
1027
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001028PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001029"accept() -> (socket object, address info)\n\
1030\n\
1031Wait for an incoming connection. Return a new socket representing the\n\
1032connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001033info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001034
Guido van Rossum11ba0942002-06-13 15:07:44 +00001035/* s.setblocking(flag) method. Argument:
1036 False -- non-blocking mode; same as settimeout(0)
1037 True -- blocking mode; same as settimeout(None)
1038*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001039
Guido van Rossum73624e91994-10-10 17:59:00 +00001040static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001041sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001042{
1043 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001044
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001045 block = PyInt_AsLong(arg);
1046 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001047 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001048
Guido van Rossum11ba0942002-06-13 15:07:44 +00001049 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001050 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001051
Guido van Rossum73624e91994-10-10 17:59:00 +00001052 Py_INCREF(Py_None);
1053 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001054}
Guido van Rossume4485b01994-09-07 14:32:49 +00001055
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001056PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001057"setblocking(flag)\n\
1058\n\
1059Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001060setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001061setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001062
Guido van Rossum11ba0942002-06-13 15:07:44 +00001063/* s.settimeout(timeout) method. Argument:
1064 None -- no timeout, blocking mode; same as setblocking(True)
1065 0.0 -- non-blocking mode; same as setblocking(False)
1066 > 0 -- timeout mode; operations time out after timeout seconds
1067 < 0 -- illegal; raises an exception
1068*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001069static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001070sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001071{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001072 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001073
1074 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001075 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001076 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001077 timeout = PyFloat_AsDouble(arg);
1078 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001079 if (!PyErr_Occurred())
1080 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001081 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001082 return NULL;
1083 }
1084 }
1085
Guido van Rossum11ba0942002-06-13 15:07:44 +00001086 s->sock_timeout = timeout;
1087 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001088
1089 Py_INCREF(Py_None);
1090 return Py_None;
1091}
1092
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001093PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001094"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001095\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001096Set a timeout on socket operations. 'timeout' can be a float,\n\
1097giving in seconds, or None. Setting a timeout of None disables\n\
1098the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001099Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001100
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001101/* s.gettimeout() method.
1102 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001103static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001104sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001105{
1106 if (s->sock_timeout < 0.0) {
1107 Py_INCREF(Py_None);
1108 return Py_None;
1109 }
1110 else
1111 return PyFloat_FromDouble(s->sock_timeout);
1112}
1113
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001114PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001115"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001116\n\
1117Returns the timeout in floating seconds associated with socket \n\
1118operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001119operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001120
Guido van Rossum48a680c2001-03-02 06:34:14 +00001121#ifdef RISCOS
1122/* s.sleeptaskw(1 | 0) method */
1123
1124static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001125sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001126{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001127 int block;
1128 int delay_flag;
1129 if (!PyArg_Parse(args, "i", &block))
1130 return NULL;
1131 Py_BEGIN_ALLOW_THREADS
1132 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1133 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001134
Guido van Rossum67f7a382002-06-06 21:08:16 +00001135 Py_INCREF(Py_None);
1136 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001137}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001138PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001139"sleeptaskw(flag)\n\
1140\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001141Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001142#endif
1143
1144
Guido van Rossumaee08791992-09-08 09:05:33 +00001145/* s.setsockopt() method.
1146 With an integer third argument, sets an integer option.
1147 With a string third argument, sets an option from a buffer;
1148 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001149
Guido van Rossum73624e91994-10-10 17:59:00 +00001150static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001151sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001152{
1153 int level;
1154 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001155 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001156 char *buf;
1157 int buflen;
1158 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001159
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001160 if (PyArg_ParseTuple(args, "iii:setsockopt",
1161 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001162 buf = (char *) &flag;
1163 buflen = sizeof flag;
1164 }
1165 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001166 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001167 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1168 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001169 return NULL;
1170 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001171 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001172 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001173 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001174 Py_INCREF(Py_None);
1175 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001176}
1177
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001178PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001179"setsockopt(level, option, value)\n\
1180\n\
1181Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001182The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001183
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001184
Guido van Rossumaee08791992-09-08 09:05:33 +00001185/* s.getsockopt() method.
1186 With two arguments, retrieves an integer option.
1187 With a third integer argument, retrieves a string buffer of that size;
1188 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001189
Guido van Rossum73624e91994-10-10 17:59:00 +00001190static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001191sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001192{
1193 int level;
1194 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001195 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001196 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001197 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001198
Guido van Rossumbcc20741998-08-04 22:53:56 +00001199#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001200 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001201 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001202 return NULL;
1203#else
1204
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001205 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1206 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001207 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001208
Guido van Rossumbe32c891996-06-20 16:25:29 +00001209 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001210 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001211 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001212 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001213 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001214 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001215 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001216 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001217 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001218 if (buflen <= 0 || buflen > 1024) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001219 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001220 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001221 return NULL;
1222 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001223 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001224 if (buf == NULL)
1225 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001226 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001227 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001228 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001229 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001230 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001231 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001232 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001233 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001234#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001235}
1236
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001237PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001238"getsockopt(level, option[, buffersize]) -> value\n\
1239\n\
1240Get a socket option. See the Unix manual for level and option.\n\
1241If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001242string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001243
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001244
Fred Drake728819a2000-07-01 03:40:12 +00001245/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001246
Guido van Rossum73624e91994-10-10 17:59:00 +00001247static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001248sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001249{
1250 struct sockaddr *addr;
1251 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001252 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001253
Fred Drake728819a2000-07-01 03:40:12 +00001254 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001255 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001256 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001257 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001258 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001259 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001260 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001261 Py_INCREF(Py_None);
1262 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001263}
1264
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001265PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001266"bind(address)\n\
1267\n\
1268Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001269pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001270sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001271
Guido van Rossum30a685f1991-06-27 15:51:29 +00001272
1273/* s.close() method.
1274 Set the file descriptor to -1 so operations tried subsequently
1275 will surely fail. */
1276
Guido van Rossum73624e91994-10-10 17:59:00 +00001277static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001278sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001279{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001280 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001281
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001282 if ((fd = s->sock_fd) != -1) {
1283 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001284 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001285 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001286 Py_END_ALLOW_THREADS
1287 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001288 Py_INCREF(Py_None);
1289 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001290}
1291
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001292PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001293"close()\n\
1294\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001295Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001296
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001297static int
1298internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1299{
1300 int res;
1301
1302 res = connect(s->sock_fd, addr, addrlen);
1303
1304#ifdef MS_WINDOWS
1305
1306 if (s->sock_timeout > 0.0) {
1307 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
1308 internal_select(s, 1);
1309 res = connect(s->sock_fd, addr, addrlen);
Tim Peters58141872002-08-06 22:25:02 +00001310 if (res < 0) {
1311 /* On Win98, WSAEISCONN was seen here. But
1312 * on Win2K, WSAEINVAL. So accept both as
1313 * meaning "fine".
1314 */
1315 int code = WSAGetLastError();
1316 if (code == WSAEISCONN ||
1317 code == WSAEINVAL)
1318 res = 0;
1319 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001320 }
1321 }
1322
1323 if (res < 0)
1324 res = WSAGetLastError();
1325
1326#else
1327
1328 if (s->sock_timeout > 0.0) {
1329 if (res < 0 && errno == EINPROGRESS) {
1330 internal_select(s, 1);
1331 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001332 if (res < 0 && errno == EISCONN)
1333 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001334 }
1335 }
1336
1337 if (res < 0)
1338 res = errno;
1339
1340#endif
1341
1342 return res;
1343}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001344
Fred Drake728819a2000-07-01 03:40:12 +00001345/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001346
Guido van Rossum73624e91994-10-10 17:59:00 +00001347static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001348sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001349{
1350 struct sockaddr *addr;
1351 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001352 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001353
Fred Drake728819a2000-07-01 03:40:12 +00001354 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001355 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001356
Guido van Rossum73624e91994-10-10 17:59:00 +00001357 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001358 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001359 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001360
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001361 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001362 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001363 Py_INCREF(Py_None);
1364 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001365}
1366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001367PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001368"connect(address)\n\
1369\n\
1370Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001371is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001372
Guido van Rossum30a685f1991-06-27 15:51:29 +00001373
Fred Drake728819a2000-07-01 03:40:12 +00001374/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001375
1376static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001377sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001378{
1379 struct sockaddr *addr;
1380 int addrlen;
1381 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001382
Fred Drake728819a2000-07-01 03:40:12 +00001383 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001384 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001385
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001386 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001387 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001388 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001389
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001390 return PyInt_FromLong((long) res);
1391}
1392
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001393PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001394"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001395\n\
1396This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001397instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001398
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001399
Guido van Rossumed233a51992-06-23 09:07:03 +00001400/* s.fileno() method */
1401
Guido van Rossum73624e91994-10-10 17:59:00 +00001402static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001403sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001404{
Fred Drakea04eaad2000-06-30 02:46:07 +00001405#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001406 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001407#else
1408 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1409#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001410}
1411
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001412PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001413"fileno() -> integer\n\
1414\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001415Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001416
Guido van Rossumed233a51992-06-23 09:07:03 +00001417
Guido van Rossumbe32c891996-06-20 16:25:29 +00001418#ifndef NO_DUP
1419/* s.dup() method */
1420
1421static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001422sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001423{
Fred Drakea04eaad2000-06-30 02:46:07 +00001424 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001425 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001426
Guido van Rossumbe32c891996-06-20 16:25:29 +00001427 newfd = dup(s->sock_fd);
1428 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001429 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001430 sock = (PyObject *) new_sockobject(newfd,
1431 s->sock_family,
1432 s->sock_type,
1433 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001434 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001435 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001436 return sock;
1437}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001438
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001439PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001440"dup() -> socket object\n\
1441\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001442Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001443
Guido van Rossumbe32c891996-06-20 16:25:29 +00001444#endif
1445
1446
Guido van Rossumc89705d1992-11-26 08:54:07 +00001447/* s.getsockname() method */
1448
Guido van Rossum73624e91994-10-10 17:59:00 +00001449static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001450sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001451{
1452 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001453 int res;
1454 socklen_t addrlen;
1455
Guido van Rossumc89705d1992-11-26 08:54:07 +00001456 if (!getsockaddrlen(s, &addrlen))
1457 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001458 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001459 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001460 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001461 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001462 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001463 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001464 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001465}
1466
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001467PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001468"getsockname() -> address info\n\
1469\n\
1470Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001471info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001472
Guido van Rossumc89705d1992-11-26 08:54:07 +00001473
Guido van Rossumb6775db1994-08-01 11:34:53 +00001474#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001475/* s.getpeername() method */
1476
Guido van Rossum73624e91994-10-10 17:59:00 +00001477static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001478sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001479{
1480 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001481 int res;
1482 socklen_t addrlen;
1483
Guido van Rossumc89705d1992-11-26 08:54:07 +00001484 if (!getsockaddrlen(s, &addrlen))
1485 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001486 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001487 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001488 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001489 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001490 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001491 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001492 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001493}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001494
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001495PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001496"getpeername() -> address info\n\
1497\n\
1498Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001499info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001500
Guido van Rossumb6775db1994-08-01 11:34:53 +00001501#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001502
1503
Guido van Rossum30a685f1991-06-27 15:51:29 +00001504/* s.listen(n) method */
1505
Guido van Rossum73624e91994-10-10 17:59:00 +00001506static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001507sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001508{
1509 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001510 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001511
1512 backlog = PyInt_AsLong(arg);
1513 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001514 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001515 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001516 if (backlog < 1)
1517 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001518 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001519 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001520 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001521 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001522 Py_INCREF(Py_None);
1523 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001524}
1525
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001526PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001527"listen(backlog)\n\
1528\n\
1529Enable a server to accept connections. The backlog argument must be at\n\
1530least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001531will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532
1533
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001534#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001535/* s.makefile(mode) method.
1536 Create a new open file object referring to a dupped version of
1537 the socket's file descriptor. (The dup() call is necessary so
1538 that the open file and socket objects may be closed independent
1539 of each other.)
1540 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1541
Guido van Rossum73624e91994-10-10 17:59:00 +00001542static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001543sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001544{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001545 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001546 char *mode = "r";
1547 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001548#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001549 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001550#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001551 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001552#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001553 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001554 PyObject *f;
1555
Guido van Rossum43713e52000-02-29 13:59:29 +00001556 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001557 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001558#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001559 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1560 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001561#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001562 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001563#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001564 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001565 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001566 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001567 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001568 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001569#ifdef USE_GUSI2
1570 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001571 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001572 bufsize = 0;
1573#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001574 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1575 if (f != NULL)
1576 PyFile_SetBufSize(f, bufsize);
1577 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001578}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001580PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001581"makefile([mode[, buffersize]]) -> file object\n\
1582\n\
1583Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001584The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001585
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001586#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001587
Guido van Rossum48a680c2001-03-02 06:34:14 +00001588
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001589/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001590
Guido van Rossum73624e91994-10-10 17:59:00 +00001591static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001592sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001593{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001594 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001595 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001596
Guido van Rossum43713e52000-02-29 13:59:29 +00001597 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001598 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001599
1600 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001601 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001602 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001603 return NULL;
1604 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001605
Guido van Rossum73624e91994-10-10 17:59:00 +00001606 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001607 if (buf == NULL)
1608 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001609
Guido van Rossum73624e91994-10-10 17:59:00 +00001610 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001611 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001612 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001613 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001614
Guido van Rossum7c53b771995-09-13 18:39:47 +00001615 if (n < 0) {
1616 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001617 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001618 }
Tim Peters5de98422002-04-27 18:44:32 +00001619 if (n != len)
1620 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621 return buf;
1622}
1623
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001624PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001625"recv(buffersize[, flags]) -> data\n\
1626\n\
1627Receive up to buffersize bytes from the socket. For the optional flags\n\
1628argument, see the Unix manual. When no data is available, block until\n\
1629at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001630the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001631
Guido van Rossum30a685f1991-06-27 15:51:29 +00001632
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001633/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001634
Guido van Rossum73624e91994-10-10 17:59:00 +00001635static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001636sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001637{
1638 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001639 PyObject *buf = NULL;
1640 PyObject *addr = NULL;
1641 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001642 int len, n, flags = 0;
1643 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001644
Guido van Rossum43713e52000-02-29 13:59:29 +00001645 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001646 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001647
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001648 if (!getsockaddrlen(s, &addrlen))
1649 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001650 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001651 if (buf == NULL)
1652 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001653
Guido van Rossum73624e91994-10-10 17:59:00 +00001654 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001655 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001656 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001657 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001658#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001659#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001660 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001661#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001662 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001663#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001664#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001665 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001666#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001667 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001668 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001669
Guido van Rossum7c53b771995-09-13 18:39:47 +00001670 if (n < 0) {
1671 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001672 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001673 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001674
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001675 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001676 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001677
Guido van Rossum67f7a382002-06-06 21:08:16 +00001678 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001679 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001680 goto finally;
1681
Guido van Rossum73624e91994-10-10 17:59:00 +00001682 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001683
1684finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001685 Py_XDECREF(addr);
1686 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001687 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001688}
1689
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001690PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001691"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1692\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001693Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001694
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001695/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001696
Guido van Rossum73624e91994-10-10 17:59:00 +00001697static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001698sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001699{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001700 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001701 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001702
Guido van Rossum43713e52000-02-29 13:59:29 +00001703 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001704 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001705
Guido van Rossum73624e91994-10-10 17:59:00 +00001706 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001707 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001708 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001709 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001710
Guido van Rossum30a685f1991-06-27 15:51:29 +00001711 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001712 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001713 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001714}
1715
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001716PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001717"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001718\n\
1719Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001720argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001721sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001722
1723
1724/* s.sendall(data [,flags]) method */
1725
1726static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001727sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001728{
1729 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001730 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001731
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001732 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1733 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001734
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001735 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001736 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001737 do {
1738 n = send(s->sock_fd, buf, len, flags);
1739 if (n < 0)
1740 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001741 buf += n;
1742 len -= n;
1743 } while (len > 0);
1744 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001745
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001746 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001747 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001748
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001749 Py_INCREF(Py_None);
1750 return Py_None;
1751}
1752
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001753PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001754"sendall(data[, flags])\n\
1755\n\
1756Send a data string to the socket. For the optional flags\n\
1757argument, see the Unix manual. This calls send() repeatedly\n\
1758until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001759to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001760
Guido van Rossum30a685f1991-06-27 15:51:29 +00001761
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001762/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001763
Guido van Rossum73624e91994-10-10 17:59:00 +00001764static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001765sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001766{
Guido van Rossum73624e91994-10-10 17:59:00 +00001767 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001768 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001769 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001770 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001771
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001772 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001773 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001774 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001775 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1776 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001777 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001778 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001779
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001780 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001781 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001782
Guido van Rossum73624e91994-10-10 17:59:00 +00001783 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001784 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001785 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001786 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001787
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001788 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001789 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001790 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001791}
1792
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001793PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001794"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001795\n\
1796Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001797For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001798
Guido van Rossum30a685f1991-06-27 15:51:29 +00001799
1800/* s.shutdown(how) method */
1801
Guido van Rossum73624e91994-10-10 17:59:00 +00001802static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001803sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001804{
1805 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001806 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001807
1808 how = PyInt_AsLong(arg);
1809 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001810 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001811 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001812 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001813 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001814 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001815 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001816 Py_INCREF(Py_None);
1817 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001818}
1819
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001820PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001821"shutdown(flag)\n\
1822\n\
1823Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001824of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001825
Guido van Rossum30a685f1991-06-27 15:51:29 +00001826
1827/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001828
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001829static PyMethodDef sock_methods[] = {
1830 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001831 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001832 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001833 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001834 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001835 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001836 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001837 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001838 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001839 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001840#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001841 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001842 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001843#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001844 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001845 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001846#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001847 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001848 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001849#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001850 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001851 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001852 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001853 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001854 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001855 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001856#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001857 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001858 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001859#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001860 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001861 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001862 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001863 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001864 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001865 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001866 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001867 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001868 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001869 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001870 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001871 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001872 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001873 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001874 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001875 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001876 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001877 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001878 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001879 shutdown_doc},
1880#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001881 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001882 sleeptaskw_doc},
1883#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001884 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001885};
1886
Guido van Rossum30a685f1991-06-27 15:51:29 +00001887
Guido van Rossum73624e91994-10-10 17:59:00 +00001888/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001889 First close the file description. */
1890
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001891static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001892sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001893{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001894 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001895 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001896 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001897}
1898
Guido van Rossum30a685f1991-06-27 15:51:29 +00001899
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001900static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001901sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001902{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001903 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001904#if SIZEOF_SOCKET_T > SIZEOF_LONG
1905 if (s->sock_fd > LONG_MAX) {
1906 /* this can occur on Win64, and actually there is a special
1907 ugly printf formatter for decimal pointer length integer
1908 printing, only bother if necessary*/
1909 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001910 "no printf formatter to display "
1911 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00001912 return NULL;
1913 }
1914#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001915 PyOS_snprintf(
1916 buf, sizeof(buf),
1917 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1918 (long)s->sock_fd, s->sock_family,
1919 s->sock_type,
1920 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001921 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001922}
1923
1924
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001925/* Create a new, uninitialized socket object. */
1926
1927static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001928sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001929{
1930 PyObject *new;
1931
1932 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00001933 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001934 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001935 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001936 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00001937 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001938 return new;
1939}
1940
1941
1942/* Initialize a new socket object. */
1943
1944/*ARGSUSED*/
1945static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00001946sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001947{
1948 PySocketSockObject *s = (PySocketSockObject *)self;
1949 SOCKET_T fd;
1950 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1951 static char *keywords[] = {"family", "type", "proto", 0};
1952
1953 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1954 "|iii:socket", keywords,
1955 &family, &type, &proto))
1956 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001957
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001958 Py_BEGIN_ALLOW_THREADS
1959 fd = socket(family, type, proto);
1960 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001961
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001962#ifdef MS_WINDOWS
1963 if (fd == INVALID_SOCKET)
1964#else
1965 if (fd < 0)
1966#endif
1967 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001968 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001969 return -1;
1970 }
1971 init_sockobject(s, fd, family, type, proto);
1972 /* From now on, ignore SIGPIPE and let the error checking
1973 do the work. */
1974#ifdef SIGPIPE
1975 (void) signal(SIGPIPE, SIG_IGN);
1976#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001977
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001978 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001979
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001980}
1981
1982
Guido van Rossumb6775db1994-08-01 11:34:53 +00001983/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001984
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001985static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001986 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001987 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001988 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001989 sizeof(PySocketSockObject), /* tp_basicsize */
1990 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001991 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001992 0, /* tp_print */
1993 0, /* tp_getattr */
1994 0, /* tp_setattr */
1995 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001996 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001997 0, /* tp_as_number */
1998 0, /* tp_as_sequence */
1999 0, /* tp_as_mapping */
2000 0, /* tp_hash */
2001 0, /* tp_call */
2002 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002003 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002004 0, /* tp_setattro */
2005 0, /* tp_as_buffer */
2006 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002007 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002008 0, /* tp_traverse */
2009 0, /* tp_clear */
2010 0, /* tp_richcompare */
2011 0, /* tp_weaklistoffset */
2012 0, /* tp_iter */
2013 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002014 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002015 0, /* tp_members */
2016 0, /* tp_getset */
2017 0, /* tp_base */
2018 0, /* tp_dict */
2019 0, /* tp_descr_get */
2020 0, /* tp_descr_set */
2021 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002022 sock_initobj, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002023 0, /* set below */ /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002024 sock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002025 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002026};
2027
Guido van Rossum30a685f1991-06-27 15:51:29 +00002028
Guido van Rossum81194471991-07-27 21:42:02 +00002029/* Python interface to gethostname(). */
2030
2031/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002032static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002033socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002034{
2035 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002036 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002037 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002038 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002039 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002040 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002041 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002042 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002043 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002044 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002045 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002046}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002047
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002048PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002049"gethostname() -> string\n\
2050\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002051Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002052
Guido van Rossumff4949e1992-08-05 19:58:53 +00002053
Guido van Rossum30a685f1991-06-27 15:51:29 +00002054/* Python interface to gethostbyname(name). */
2055
2056/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002057static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002058socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002059{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002060 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002061 struct sockaddr_storage addrbuf;
2062
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002063 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002064 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002065 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002066 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002067 return makeipaddr((struct sockaddr *)&addrbuf,
2068 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002069}
2070
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002071PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002072"gethostbyname(host) -> address\n\
2073\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002074Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002075
2076
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002077/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2078
2079static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002080gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002081{
2082 char **pch;
2083 PyObject *rtn_tuple = (PyObject *)NULL;
2084 PyObject *name_list = (PyObject *)NULL;
2085 PyObject *addr_list = (PyObject *)NULL;
2086 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002087
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002088 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002089 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002090#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002091 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002092#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002093 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002094#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002095 return NULL;
2096 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002097
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002098 if (h->h_addrtype != af) {
2099#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002100 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002101 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002102 (char *)strerror(EAFNOSUPPORT));
2103#else
2104 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002105 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002106 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002107#endif
2108 return NULL;
2109 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002110
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002111 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002112
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002113 case AF_INET:
2114 if (alen < sizeof(struct sockaddr_in))
2115 return NULL;
2116 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002117
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002118#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002119 case AF_INET6:
2120 if (alen < sizeof(struct sockaddr_in6))
2121 return NULL;
2122 break;
2123#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002124
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002125 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002126
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002127 if ((name_list = PyList_New(0)) == NULL)
2128 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002129
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002130 if ((addr_list = PyList_New(0)) == NULL)
2131 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002132
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002133 for (pch = h->h_aliases; *pch != NULL; pch++) {
2134 int status;
2135 tmp = PyString_FromString(*pch);
2136 if (tmp == NULL)
2137 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002138
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002139 status = PyList_Append(name_list, tmp);
2140 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002141
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002142 if (status)
2143 goto err;
2144 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002145
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002146 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2147 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002148
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002149 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002150
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002151 case AF_INET:
2152 {
2153 struct sockaddr_in sin;
2154 memset(&sin, 0, sizeof(sin));
2155 sin.sin_family = af;
2156#ifdef HAVE_SOCKADDR_SA_LEN
2157 sin.sin_len = sizeof(sin);
2158#endif
2159 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2160 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002161
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002162 if (pch == h->h_addr_list && alen >= sizeof(sin))
2163 memcpy((char *) addr, &sin, sizeof(sin));
2164 break;
2165 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002166
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002167#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002168 case AF_INET6:
2169 {
2170 struct sockaddr_in6 sin6;
2171 memset(&sin6, 0, sizeof(sin6));
2172 sin6.sin6_family = af;
2173#ifdef HAVE_SOCKADDR_SA_LEN
2174 sin6.sin6_len = sizeof(sin6);
2175#endif
2176 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2177 tmp = makeipaddr((struct sockaddr *)&sin6,
2178 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002179
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002180 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2181 memcpy((char *) addr, &sin6, sizeof(sin6));
2182 break;
2183 }
2184#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002185
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002186 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002187 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002188 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002189 return NULL;
2190 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002191
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002192 if (tmp == NULL)
2193 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002194
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002195 status = PyList_Append(addr_list, tmp);
2196 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002197
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002198 if (status)
2199 goto err;
2200 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002201
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002202 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002203
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002204 err:
2205 Py_XDECREF(name_list);
2206 Py_XDECREF(addr_list);
2207 return rtn_tuple;
2208}
2209
2210
2211/* Python interface to gethostbyname_ex(name). */
2212
2213/*ARGSUSED*/
2214static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002215socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002216{
2217 char *name;
2218 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002219 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002220 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002221 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002222#ifdef HAVE_GETHOSTBYNAME_R
2223 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002224#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2225 struct hostent_data data;
2226#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002227 char buf[16384];
2228 int buf_len = (sizeof buf) - 1;
2229 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002230#endif
2231#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002232 int result;
2233#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002234#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002235
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002236 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002237 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002238 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002239 return NULL;
2240 Py_BEGIN_ALLOW_THREADS
2241#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002242#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002243 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2244 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002245#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002246 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002247#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002248 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002249 result = gethostbyname_r(name, &hp_allocated, &data);
2250 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002251#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002252#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002253#ifdef USE_GETHOSTBYNAME_LOCK
2254 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002255#endif
2256 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002257#endif /* HAVE_GETHOSTBYNAME_R */
2258 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002259 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002260 addr.ss_family.
2261 Therefore, we cast the sockaddr_storage into sockaddr to
2262 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002263 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002264 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002265 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002266#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002267 PyThread_release_lock(gethostbyname_lock);
2268#endif
2269 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002270}
2271
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002272PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002273"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2274\n\
2275Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002276for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002277
2278
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002279/* Python interface to gethostbyaddr(IP). */
2280
2281/*ARGSUSED*/
2282static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002283socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002284{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002285#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002286 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002287#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002288 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002289#endif
2290 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002291 char *ip_num;
2292 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002293 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002294#ifdef HAVE_GETHOSTBYNAME_R
2295 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002296#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2297 struct hostent_data data;
2298#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002299 char buf[16384];
2300 int buf_len = (sizeof buf) - 1;
2301 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002302#endif
2303#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002304 int result;
2305#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002306#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002307 char *ap;
2308 int al;
2309 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002310
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002311 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002312 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002313 af = PF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002314 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002315 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002316 af = sa->sa_family;
2317 ap = NULL;
2318 al = 0;
2319 switch (af) {
2320 case AF_INET:
2321 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2322 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2323 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002324#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002325 case AF_INET6:
2326 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2327 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2328 break;
2329#endif
2330 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002331 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002332 return NULL;
2333 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002334 Py_BEGIN_ALLOW_THREADS
2335#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002336#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002337 result = gethostbyaddr_r(ap, al, af,
2338 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002339 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002340#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002341 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002342 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002343#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002344 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002345 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002346 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002347#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002348#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002349#ifdef USE_GETHOSTBYNAME_LOCK
2350 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002351#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002352 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002353#endif /* HAVE_GETHOSTBYNAME_R */
2354 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002355 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002356#ifdef USE_GETHOSTBYNAME_LOCK
2357 PyThread_release_lock(gethostbyname_lock);
2358#endif
2359 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002360}
2361
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002362PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002363"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2364\n\
2365Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002366for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002367
Guido van Rossum30a685f1991-06-27 15:51:29 +00002368
2369/* Python interface to getservbyname(name).
2370 This only returns the port number, since the other info is already
2371 known or not useful (like the list of aliases). */
2372
2373/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002374static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002376{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002377 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002378 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002379 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002380 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002381 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002382 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002383 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002384 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002385 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002386 return NULL;
2387 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002388 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002389}
2390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002391PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002392"getservbyname(servicename, protocolname) -> integer\n\
2393\n\
2394Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002395The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002396
Guido van Rossum30a685f1991-06-27 15:51:29 +00002397
Guido van Rossum3901d851996-12-19 16:35:04 +00002398/* Python interface to getprotobyname(name).
2399 This only returns the protocol number, since the other info is
2400 already known or not useful (like the list of aliases). */
2401
2402/*ARGSUSED*/
2403static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002404socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002405{
2406 char *name;
2407 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002408#ifdef __BEOS__
2409/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002410 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002411 return NULL;
2412#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002413 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002414 return NULL;
2415 Py_BEGIN_ALLOW_THREADS
2416 sp = getprotobyname(name);
2417 Py_END_ALLOW_THREADS
2418 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002419 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002420 return NULL;
2421 }
2422 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002423#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002424}
2425
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002426PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002427"getprotobyname(name) -> integer\n\
2428\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002429Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002430
Guido van Rossum3901d851996-12-19 16:35:04 +00002431
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002432#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002433/* Create a socket object from a numeric file description.
2434 Useful e.g. if stdin is a socket.
2435 Additional arguments as for socket(). */
2436
2437/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002438static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002439socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002440{
Guido van Rossum73624e91994-10-10 17:59:00 +00002441 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002442 SOCKET_T fd;
2443 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002444 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2445 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002446 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002447 /* Dup the fd so it and the socket can be closed independently */
2448 fd = dup(fd);
2449 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002450 return set_error();
2451 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002452 /* From now on, ignore SIGPIPE and let the error checking
2453 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002454#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002455 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002456#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002457 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002458}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002459
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002460PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002461"fromfd(fd, family, type[, proto]) -> socket object\n\
2462\n\
2463Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002464The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002465
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002466#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002467
Guido van Rossum82a5c661998-07-07 20:45:43 +00002468
Guido van Rossum006bf911996-06-12 04:04:55 +00002469static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002470socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002471{
2472 int x1, x2;
2473
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002474 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002475 return NULL;
2476 }
2477 x2 = (int)ntohs((short)x1);
2478 return PyInt_FromLong(x2);
2479}
2480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002481PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002482"ntohs(integer) -> integer\n\
2483\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002484Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002485
2486
Guido van Rossum006bf911996-06-12 04:04:55 +00002487static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002488socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002489{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002490 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002491
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002492 if (PyInt_Check(arg)) {
2493 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002494 if (x == (unsigned long) -1 && PyErr_Occurred())
2495 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002496 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002497 else if (PyLong_Check(arg)) {
2498 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002499 if (x == (unsigned long) -1 && PyErr_Occurred())
2500 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002501#if SIZEOF_LONG > 4
2502 {
2503 unsigned long y;
2504 /* only want the trailing 32 bits */
2505 y = x & 0xFFFFFFFFUL;
2506 if (y ^ x)
2507 return PyErr_Format(PyExc_OverflowError,
2508 "long int larger than 32 bits");
2509 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002510 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002511#endif
2512 }
2513 else
Tim Peters58141872002-08-06 22:25:02 +00002514 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002515 "expected int/long, %s found",
2516 arg->ob_type->tp_name);
2517 if (x == (unsigned long) -1 && PyErr_Occurred())
2518 return NULL;
2519 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002520}
2521
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002522PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002523"ntohl(integer) -> integer\n\
2524\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002526
2527
Guido van Rossum006bf911996-06-12 04:04:55 +00002528static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002529socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002530{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002531 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002532
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002533 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002534 return NULL;
2535 }
2536 x2 = (int)htons((short)x1);
2537 return PyInt_FromLong(x2);
2538}
2539
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002540PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002541"htons(integer) -> integer\n\
2542\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002543Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002544
2545
Guido van Rossum006bf911996-06-12 04:04:55 +00002546static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002547socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002548{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002549 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002550
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002551 if (PyInt_Check(arg)) {
2552 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002553 if (x == (unsigned long) -1 && PyErr_Occurred())
2554 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002555 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002556 else if (PyLong_Check(arg)) {
2557 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002558 if (x == (unsigned long) -1 && PyErr_Occurred())
2559 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002560#if SIZEOF_LONG > 4
2561 {
2562 unsigned long y;
2563 /* only want the trailing 32 bits */
2564 y = x & 0xFFFFFFFFUL;
2565 if (y ^ x)
2566 return PyErr_Format(PyExc_OverflowError,
2567 "long int larger than 32 bits");
2568 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002569 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002570#endif
2571 }
2572 else
Tim Peters58141872002-08-06 22:25:02 +00002573 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002574 "expected int/long, %s found",
2575 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002576 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002577}
2578
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002579PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002580"htonl(integer) -> integer\n\
2581\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002582Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002583
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002584/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002585
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002586PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002587"inet_aton(string) -> packed 32-bit IP representation\n\
2588\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002589Convert 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 +00002590binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002591
2592static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002593socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002594{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002595#ifndef INADDR_NONE
2596#define INADDR_NONE (-1)
2597#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002598
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002599 /* Have to use inet_addr() instead */
2600 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002601 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002602
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002603 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002604 return NULL;
2605 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002606 packed_addr = inet_addr(ip_addr);
2607
2608 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002609 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002610 "illegal IP address string passed to inet_aton");
2611 return NULL;
2612 }
2613
2614 return PyString_FromStringAndSize((char *) &packed_addr,
2615 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002616}
2617
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002618PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002619"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002620\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002621Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002622
2623static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002624socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002625{
2626 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002627 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002628 struct in_addr packed_addr;
2629
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002630 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002631 return NULL;
2632 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002633
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002634 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002635 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002636 "packed IP wrong length for inet_ntoa");
2637 return NULL;
2638 }
2639
2640 memcpy(&packed_addr, packed_str, addr_len);
2641
2642 return PyString_FromString(inet_ntoa(packed_addr));
2643}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002644
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002645/* Python interface to getaddrinfo(host, port). */
2646
2647/*ARGSUSED*/
2648static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002649socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002650{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002651 struct addrinfo hints, *res;
2652 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002653 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002654 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002655 char *hptr, *pptr;
2656 int family, socktype, protocol, flags;
2657 int error;
2658 PyObject *all = (PyObject *)NULL;
2659 PyObject *single = (PyObject *)NULL;
2660
2661 family = socktype = protocol = flags = 0;
2662 family = PF_UNSPEC;
2663 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2664 &hptr, &pobj, &family, &socktype,
2665 &protocol, &flags)) {
2666 return NULL;
2667 }
2668 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002669 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002670 pptr = pbuf;
2671 } else if (PyString_Check(pobj)) {
2672 pptr = PyString_AsString(pobj);
2673 } else if (pobj == Py_None) {
2674 pptr = (char *)NULL;
2675 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002676 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002677 return NULL;
2678 }
2679 memset(&hints, 0, sizeof(hints));
2680 hints.ai_family = family;
2681 hints.ai_socktype = socktype;
2682 hints.ai_protocol = protocol;
2683 hints.ai_flags = flags;
2684 error = getaddrinfo(hptr, pptr, &hints, &res0);
2685 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002686 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002687 return NULL;
2688 }
2689
2690 if ((all = PyList_New(0)) == NULL)
2691 goto err;
2692 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002693 PyObject *addr =
2694 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2695 if (addr == NULL)
2696 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002697 single = Py_BuildValue("iiisO", res->ai_family,
2698 res->ai_socktype, res->ai_protocol,
2699 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002700 addr);
2701 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002702 if (single == NULL)
2703 goto err;
2704
2705 if (PyList_Append(all, single))
2706 goto err;
2707 Py_XDECREF(single);
2708 }
Neal Norwitz90128ba2002-08-09 03:37:42 +00002709 if (res0)
2710 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002711 return all;
2712 err:
2713 Py_XDECREF(single);
2714 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002715 if (res0)
2716 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002717 return (PyObject *)NULL;
2718}
2719
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002720PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002721"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2722 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002723\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002724Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002725
2726/* Python interface to getnameinfo(sa, flags). */
2727
2728/*ARGSUSED*/
2729static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002730socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002731{
2732 PyObject *sa = (PyObject *)NULL;
2733 int flags;
2734 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002735 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002736 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2737 struct addrinfo hints, *res = NULL;
2738 int error;
2739 PyObject *ret = (PyObject *)NULL;
2740
2741 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002742 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002743 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002744 if (!PyArg_ParseTuple(sa, "si|ii",
2745 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002746 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002747 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002748 memset(&hints, 0, sizeof(hints));
2749 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002750 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002751 error = getaddrinfo(hostp, pbuf, &hints, &res);
2752 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002753 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002754 goto fail;
2755 }
2756 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002757 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002758 "sockaddr resolved to multiple addresses");
2759 goto fail;
2760 }
2761 switch (res->ai_family) {
2762 case AF_INET:
2763 {
2764 char *t1;
2765 int t2;
2766 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002767 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002768 "IPv4 sockaddr must be 2 tuple");
2769 goto fail;
2770 }
2771 break;
2772 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002773#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002774 case AF_INET6:
2775 {
2776 struct sockaddr_in6 *sin6;
2777 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2778 sin6->sin6_flowinfo = flowinfo;
2779 sin6->sin6_scope_id = scope_id;
2780 break;
2781 }
2782#endif
2783 }
2784 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2785 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2786 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002787 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002788 goto fail;
2789 }
2790 ret = Py_BuildValue("ss", hbuf, pbuf);
2791
2792fail:
2793 if (res)
2794 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002795 return ret;
2796}
2797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002798PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002799"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002800\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002801Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002802
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002803
2804/* Python API to getting and setting the default timeout value. */
2805
2806static PyObject *
2807socket_getdefaulttimeout(PyObject *self)
2808{
2809 if (defaulttimeout < 0.0) {
2810 Py_INCREF(Py_None);
2811 return Py_None;
2812 }
2813 else
2814 return PyFloat_FromDouble(defaulttimeout);
2815}
2816
2817PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002818"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002819\n\
2820Returns the default timeout in floating seconds for new socket objects.\n\
2821A value of None indicates that new socket objects have no timeout.\n\
2822When the socket module is first imported, the default is None.");
2823
2824static PyObject *
2825socket_setdefaulttimeout(PyObject *self, PyObject *arg)
2826{
2827 double timeout;
2828
2829 if (arg == Py_None)
2830 timeout = -1.0;
2831 else {
2832 timeout = PyFloat_AsDouble(arg);
2833 if (timeout < 0.0) {
2834 if (!PyErr_Occurred())
2835 PyErr_SetString(PyExc_ValueError,
2836 "Timeout value out of range");
2837 return NULL;
2838 }
2839 }
2840
2841 defaulttimeout = timeout;
2842
2843 Py_INCREF(Py_None);
2844 return Py_None;
2845}
2846
2847PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002848"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002849\n\
2850Set the default timeout in floating seconds for new socket objects.\n\
2851A value of None indicates that new socket objects have no timeout.\n\
2852When the socket module is first imported, the default is None.");
2853
2854
Guido van Rossum30a685f1991-06-27 15:51:29 +00002855/* List of functions exported by this module. */
2856
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002857static PyMethodDef socket_methods[] = {
2858 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002859 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002860 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002861 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002862 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002863 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002864 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002865 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002866 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002867 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002868 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002869 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002870#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002871 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002872 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002873#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002874 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002875 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002876 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002877 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002878 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002879 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002880 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002881 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002882 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002883 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002884 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002885 METH_VARARGS, inet_ntoa_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002886 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002887 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002888 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002889 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00002890 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002891 METH_NOARGS, getdefaulttimeout_doc},
2892 {"setdefaulttimeout", socket_setdefaulttimeout,
2893 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002894 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002895};
2896
Guido van Rossum30a685f1991-06-27 15:51:29 +00002897
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002898#ifdef RISCOS
2899#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00002900
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002901static int
2902os_init(void)
2903{
2904 _kernel_swi_regs r;
2905
2906 r.r[0] = 0;
2907 _kernel_swi(0x43380, &r, &r);
2908 taskwindow = r.r[0];
2909
2910 return 0;
2911}
2912
2913#endif /* RISCOS */
2914
2915
2916#ifdef MS_WINDOWS
2917#define OS_INIT_DEFINED
2918
2919/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002920
2921static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002922os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002923{
2924 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002925}
2926
2927static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002928os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002929{
2930 WSADATA WSAData;
2931 int ret;
2932 char buf[100];
2933 ret = WSAStartup(0x0101, &WSAData);
2934 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002935 case 0: /* No error */
2936 atexit(os_cleanup);
2937 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002938 case WSASYSNOTREADY:
2939 PyErr_SetString(PyExc_ImportError,
2940 "WSAStartup failed: network not ready");
2941 break;
2942 case WSAVERNOTSUPPORTED:
2943 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002944 PyErr_SetString(
2945 PyExc_ImportError,
2946 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00002947 break;
2948 default:
Tim Peters885d4572001-11-28 20:27:42 +00002949 PyOS_snprintf(buf, sizeof(buf),
2950 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002951 PyErr_SetString(PyExc_ImportError, buf);
2952 break;
2953 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002954 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002955}
2956
Guido van Rossum8d665e61996-06-26 18:22:49 +00002957#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002958
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002959
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002960#ifdef PYOS_OS2
2961#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002962
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002963/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002964
2965static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002966os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002967{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002968#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002969 char reason[64];
2970 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002971
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002972 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002973 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002974 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002975
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002976 PyOS_snprintf(reason, sizeof(reason),
2977 "OS/2 TCP/IP Error# %d", sock_errno());
2978 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002979
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002980 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002981#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002982 /* No need to initialise sockets with GCC/EMX */
2983 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002984#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002985}
2986
2987#endif /* PYOS_OS2 */
2988
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002989
2990#ifndef OS_INIT_DEFINED
2991static int
2992os_init(void)
2993{
2994 return 1; /* Success */
2995}
2996#endif
2997
2998
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002999/* C API table - always add new things to the end for binary
3000 compatibility. */
3001static
3002PySocketModule_APIObject PySocketModuleAPI =
3003{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003004 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003005};
3006
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003007
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003008/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003009
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003010 This module is actually called "_socket", and there's a wrapper
3011 "socket.py" which implements some additional functionality. On some
3012 platforms (e.g. Windows and OS/2), socket.py also implements a
3013 wrapper for the socket type that provides missing functionality such
3014 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3015 with an ImportError exception if os-specific initialization fails.
3016 On Windows, this does WINSOCK initialization. When WINSOCK is
3017 initialized succesfully, a call to WSACleanup() is scheduled to be
3018 made at exit time.
3019*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003020
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003021PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003022"Implementation module for socket operations.\n\
3023\n\
3024See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003025
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003026PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003027init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003028{
Fred Drake4baedc12002-04-01 14:53:37 +00003029 PyObject *m;
Fred Drake4baedc12002-04-01 14:53:37 +00003030
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003031 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003032 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003033
3034 sock_type.ob_type = &PyType_Type;
3035 sock_type.tp_getattro = PyObject_GenericGetAttr;
3036 sock_type.tp_alloc = PyType_GenericAlloc;
3037 sock_type.tp_free = PyObject_Del;
3038 m = Py_InitModule3(PySocket_MODULE_NAME,
3039 socket_methods,
3040 socket_doc);
3041
3042 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3043 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003044 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003045 Py_INCREF(socket_error);
3046 PyModule_AddObject(m, "error", socket_error);
3047 socket_herror = PyErr_NewException("socket.herror",
3048 socket_error, NULL);
3049 if (socket_herror == NULL)
3050 return;
3051 Py_INCREF(socket_herror);
3052 PyModule_AddObject(m, "herror", socket_herror);
3053 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003054 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003055 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003056 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003057 Py_INCREF(socket_gaierror);
3058 PyModule_AddObject(m, "gaierror", socket_gaierror);
3059 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003060 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003061 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003062 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003063 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003064 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003065 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003066 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003067
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003068 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003069 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003070 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3071 ) != 0)
3072 return;
3073
Guido van Rossum09be4091999-08-09 14:40:40 +00003074 /* Address families (we only support AF_INET and AF_UNIX) */
3075#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003076 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003077#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003078 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003079#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003080 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003081#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003082#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00003083 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003084#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003085#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003086 /* Amateur Radio AX.25 */
3087 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003088#endif
3089#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003090 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003091#endif
3092#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003093 /* Appletalk DDP */
3094 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003095#endif
3096#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003097 /* Amateur radio NetROM */
3098 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003099#endif
3100#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003101 /* Multiprotocol bridge */
3102 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003103#endif
3104#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003105 /* Reserved for Werner's ATM */
3106 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003107#endif
3108#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003109 /* Reserved for X.25 project */
3110 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003111#endif
3112#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003113 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003114#endif
3115#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003116 /* Amateur Radio X.25 PLP */
3117 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003118#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003119#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003120 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3121 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3122 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3123 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3124 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3125 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3126 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3127 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3128 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003129#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003130
3131 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003132 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3133 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003134#ifndef __BEOS__
3135/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003136 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3137 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3138 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003139#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003140
3141#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003142 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003143#endif
3144#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003145 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003146#endif
3147#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003148 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003149#endif
3150#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003151 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003152#endif
3153#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003154 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003155#endif
3156#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003157 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003158#endif
3159#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003160 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003161#endif
3162#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003163 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003164#endif
3165#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003166 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003167#endif
3168#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003169 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003170#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003171#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003172 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003173#endif
3174#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003175 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003176#endif
3177#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003178 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003179#endif
3180#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003181 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003182#endif
3183#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003184 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003185#endif
3186#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003187 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003188#endif
3189#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003190 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003191#endif
3192#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003193 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003194#endif
3195
3196 /* Maximum number of connections for "listen" */
3197#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003198 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003199#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003200 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003201#endif
3202
3203 /* Flags for send, recv */
3204#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003205 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003206#endif
3207#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003208 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003209#endif
3210#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003211 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003212#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003213#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003214 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003215#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003216#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003217 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003218#endif
3219#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003220 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003221#endif
3222#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003223 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003224#endif
3225#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003226 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003227#endif
3228#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003229 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003230#endif
3231#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003232 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003233#endif
3234
3235 /* Protocol level and numbers, usable for [gs]etsockopt */
3236#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003237 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003238#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003239#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003240 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003241#else
Fred Drake4baedc12002-04-01 14:53:37 +00003242 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003243#endif
3244#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003245 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003246#endif
3247#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003248 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003249#endif
3250#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003251 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003252#endif
3253#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003254 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003255#endif
3256#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003257 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003258#endif
3259#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003260 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003261#else
Fred Drake4baedc12002-04-01 14:53:37 +00003262 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003263#endif
3264#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003265 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003266#else
Fred Drake4baedc12002-04-01 14:53:37 +00003267 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003268#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003269#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003270 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003271#else
Fred Drake4baedc12002-04-01 14:53:37 +00003272 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003273#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003274#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003275 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003276#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003277#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003278 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003279#else
Fred Drake4baedc12002-04-01 14:53:37 +00003280 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003281#endif
3282#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003283 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003284#endif
3285#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003286 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003287#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003288#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003289 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003290#endif
3291#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003292 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003293#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003294#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003295 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003296#else
Fred Drake4baedc12002-04-01 14:53:37 +00003297 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003298#endif
3299#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003300 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003301#endif
3302#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003303 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003304#endif
3305#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003306 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003307#else
Fred Drake4baedc12002-04-01 14:53:37 +00003308 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003309#endif
3310#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003311 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003312#endif
3313#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003314 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003315#endif
3316#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003317 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003318#endif
3319#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003320 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003321#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003322#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003323 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003324#endif
3325#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003326 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003327#endif
3328#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003329 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003330#endif
3331#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003332 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003333#endif
3334#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003335 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003336#endif
3337#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003338 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003339#endif
3340#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003341 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003342#endif
3343#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003344 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003345#endif
3346#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003347 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003348#endif
3349#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003350 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003351#endif
3352#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003353 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003354#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003355#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003356 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003357#endif
3358#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003359 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003360#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003361#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003362 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003363#endif
3364#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003365 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003366#endif
3367#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003368 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003369#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003370#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003371 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003372#endif
3373/**/
3374#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003375 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003376#else
Fred Drake4baedc12002-04-01 14:53:37 +00003377 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003378#endif
3379#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003380 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003381#endif
3382
3383 /* Some port configuration */
3384#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003385 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003386#else
Fred Drake4baedc12002-04-01 14:53:37 +00003387 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003388#endif
3389#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003390 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003391#else
Fred Drake4baedc12002-04-01 14:53:37 +00003392 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003393#endif
3394
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003395 /* Some reserved IP v.4 addresses */
3396#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003397 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003398#else
Fred Drake4baedc12002-04-01 14:53:37 +00003399 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003400#endif
3401#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003402 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003403#else
Fred Drake4baedc12002-04-01 14:53:37 +00003404 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003405#endif
3406#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003407 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003408#else
Fred Drake4baedc12002-04-01 14:53:37 +00003409 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003410#endif
3411#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003412 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003413#else
Fred Drake4baedc12002-04-01 14:53:37 +00003414 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003415#endif
3416#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003417 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3418 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003419#else
Fred Drake4baedc12002-04-01 14:53:37 +00003420 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003421#endif
3422#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3424 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003425#else
Fred Drake4baedc12002-04-01 14:53:37 +00003426 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003427#endif
3428#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003429 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003430#else
Fred Drake4baedc12002-04-01 14:53:37 +00003431 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003432#endif
3433
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003434 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003435#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003436 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003437#endif
3438#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003439 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003440#endif
3441#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003442 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003443#endif
3444#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003445 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003446#endif
3447#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003448 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003449#endif
3450#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003451 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003452#endif
3453#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003454 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003455#endif
3456#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003457 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003458#endif
3459#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003460 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003461#endif
3462#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003463 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003464#endif
3465#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003466 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003467#endif
3468#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003469 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003470#endif
3471#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003472 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003473#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003474#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003475 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3476 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003477#endif
3478#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003479 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3480 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003481#endif
3482#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003483 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003484#endif
3485
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003486 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3487#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003488 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003489#endif
3490#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003491 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003492#endif
3493#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003494 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003495#endif
3496#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003497 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003498#endif
3499#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003500 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003501#endif
3502#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003503 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003504#endif
3505
Guido van Rossum09be4091999-08-09 14:40:40 +00003506 /* TCP options */
3507#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003508 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003509#endif
3510#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003511 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003512#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003513#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003514 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003515#endif
3516#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003517 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003518#endif
3519#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003520 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003521#endif
3522#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003523 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003524#endif
3525#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003526 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003527#endif
3528#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003529 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003530#endif
3531#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003532 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003533#endif
3534#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003535 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003536#endif
3537#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003538 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003539#endif
3540#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003541 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003542#endif
3543
Guido van Rossum09be4091999-08-09 14:40:40 +00003544
3545 /* IPX options */
3546#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003547 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003548#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003549
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003550 /* get{addr,name}info parameters */
3551#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003552 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003553#endif
3554#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003555 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003556#endif
3557#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003558 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003559#endif
3560#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003561 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003562#endif
3563#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003564 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003565#endif
3566#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003567 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003568#endif
3569#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003570 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003571#endif
3572#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003573 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003574#endif
3575#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003576 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003577#endif
3578#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003579 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003580#endif
3581#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003582 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003583#endif
3584#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003585 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003586#endif
3587#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003588 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003589#endif
3590#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003591 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003592#endif
3593#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003594 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003595#endif
3596#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003597 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003598#endif
3599#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003600 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003601#endif
3602#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003603 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003604#endif
3605#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003606 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003607#endif
3608#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003609 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003610#endif
3611#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003612 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003613#endif
3614#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003615 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003616#endif
3617#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003618 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003619#endif
3620#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003621 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003622#endif
3623#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003624 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003625#endif
3626#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003627 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003628#endif
3629#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003630 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003631#endif
3632#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003633 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003634#endif
3635#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003636 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003637#endif
3638#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003639 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003640#endif
3641
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003642 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003643#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003644 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003645#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003646}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003647
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003648
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003649#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003650
3651/* Simplistic emulation code for inet_pton that only works for IPv4 */
3652
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003653int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003654inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003655{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003656 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003657 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003658 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003659 if (packed_addr == INADDR_NONE)
3660 return 0;
3661 memcpy(dst, &packed_addr, 4);
3662 return 1;
3663 }
3664 /* Should set errno to EAFNOSUPPORT */
3665 return -1;
3666}
3667
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003668const char *
3669inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003670{
3671 if (af == AF_INET) {
3672 struct in_addr packed_addr;
3673 if (size < 16)
3674 /* Should set errno to ENOSPC. */
3675 return NULL;
3676 memcpy(&packed_addr, src, sizeof(packed_addr));
3677 return strncpy(dst, inet_ntoa(packed_addr), size);
3678 }
3679 /* Should set errno to EAFNOSUPPORT */
3680 return NULL;
3681}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003682
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003683#endif