blob: 477dc31677880c4cdba34bfa8dcce5830c11efcb [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Jeremy Hylton22308652001-02-02 03:23:09 +000010 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000011- No read/write operations (use sendall/recv or makefile instead).
12- Additional restrictions apply on some non-Unix platforms (compensated
13 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000018- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
19 a subclass of socket.error
20- socket.herror: exception raised for gethostby* errors,
21 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000022- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000023- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000024- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000025- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000027- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000028- socket.ntohs(16 bit value) --> new int object
29- socket.ntohl(32 bit value) --> new int object
30- socket.htons(16 bit value) --> new int object
31- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000032- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
33 --> List of (family, socktype, proto, canonname, sockaddr)
34- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000035- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000036- socket.inet_aton(IP address) -> 32-bit packed IP representation
37- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum6574b3e1991-06-25 21:36:08 +000038- an Internet socket address is a pair (hostname, port)
39 where hostname can be anything recognized by gethostbyname()
40 (including the dd.dd.dd.dd notation) and port is in host byte order
41- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000042- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000043- an AF_PACKET socket address is a tuple containing a string
44 specifying the ethernet interface and an integer specifying
45 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000046 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
47 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000048 networking code, but accepted since they are returned by the
49 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000050
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000051Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000052
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000053- names starting with sock_ are socket object methods
54- names starting with socket_ are module-level functions
55- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000056
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057*/
58
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000059#include "Python.h"
60
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000061/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000062PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000063"socket([family[, type[, proto]]]) -> socket object\n\
64\n\
65Open a socket of the given type. The family argument specifies the\n\
66address family; it defaults to AF_INET. The type argument specifies\n\
67whether this is a stream (SOCK_STREAM, this is the default)\n\
68or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
69specifying the default protocol. Keyword arguments are accepted.\n\
70\n\
71A socket object represents one endpoint of a network connection.\n\
72\n\
73Methods of socket objects (keyword arguments not allowed):\n\
74\n\
75accept() -- accept a connection, returning new socket and client address\n\
76bind(addr) -- bind the socket to a local address\n\
77close() -- close the socket\n\
78connect(addr) -- connect the socket to a remote address\n\
79connect_ex(addr) -- connect, return an error code instead of an exception\n\
80dup() -- return a new socket object identical to the current one [*]\n\
81fileno() -- return underlying file descriptor\n\
82getpeername() -- return remote address [*]\n\
83getsockname() -- return local address\n\
84getsockopt(level, optname[, buflen]) -- get socket options\n\
85gettimeout() -- return timeout or None\n\
86listen(n) -- start listening for incoming connections\n\
87makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
88recv(buflen[, flags]) -- receive data\n\
89recvfrom(buflen[, flags]) -- receive data and sender's address\n\
90sendall(data[, flags]) -- send all data\n\
91send(data[, flags]) -- send data, may not send all of it\n\
92sendto(data[, flags], addr) -- send data to a given address\n\
93setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
94setsockopt(level, optname, value) -- set socket options\n\
95settimeout(None | float) -- set or clear the timeout\n\
96shutdown(how) -- shut down traffic in one or both directions\n\
97\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000098 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +000099
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000100/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
101 I hope some day someone can clean this up please... */
102
Guido van Rossum9376b741999-09-15 22:01:40 +0000103/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
104 script doesn't get this right, so we hardcode some platform checks below.
105 On the other hand, not all Linux versions agree, so there the settings
106 computed by the configure script are needed! */
107
108#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000109# undef HAVE_GETHOSTBYNAME_R_3_ARG
110# undef HAVE_GETHOSTBYNAME_R_5_ARG
111# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000112#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000113
Guido van Rossum7a122991999-04-13 04:07:32 +0000114#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000115# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000116#endif
117
Guido van Rossume7de2061999-03-24 17:24:33 +0000118#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000119# if defined(_AIX) || defined(__osf__)
120# define HAVE_GETHOSTBYNAME_R_3_ARG
121# elif defined(__sun) || defined(__sgi)
122# define HAVE_GETHOSTBYNAME_R_5_ARG
123# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000124/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000125# else
126# undef HAVE_GETHOSTBYNAME_R
127# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000128#endif
129
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000130#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
131 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000132# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000133#endif
134
135#ifdef USE_GETHOSTBYNAME_LOCK
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000136# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000137#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000138
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000139#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# include <types.h>
141# include <io.h>
142# include <sys/ioctl.h>
143# include <utils.h>
144# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000145#endif
146
147#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000148# define INCL_DOS
149# define INCL_DOSERRORS
150# define INCL_NOPMAPI
151# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000152#endif
153
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000154/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000155#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000156#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000158/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000160#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161
162/* Addressing includes */
163
Guido van Rossum6f489d91996-06-28 20:15:15 +0000164#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000165
166/* Non-MS WINDOWS includes */
167# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000168
Guido van Rossum9376b741999-09-15 22:01:40 +0000169/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000170# ifdef __BEOS__
171# include <net/netdb.h>
172# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
173# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000174typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000175# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000178
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# ifndef RISCOS
180# include <fcntl.h>
181# else
182# include <sys/fcntl.h>
183# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000184int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000185# endif
186
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000187#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000188
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000189/* MS_WINDOWS includes */
190# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000191
Jeremy Hylton22308652001-02-02 03:23:09 +0000192#endif
193
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000194#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000195# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000196#endif
197
198#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000199# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000200#endif
201
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000202#ifndef O_NDELAY
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000203# define O_NDELAY O_NONBLOCK /* For QNX only? */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000204#endif
205
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000206#include "addrinfo.h"
207
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000208#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000209int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000210const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000211#endif
212
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000213#ifdef __APPLE__
214/* On OS X, getaddrinfo returns no error indication of lookup
215 failure, so we must use the emulation instead of the libinfo
216 implementation. Unfortunately, performing an autoconf test
217 for this bug would require DNS access for the machine performing
218 the configuration, which is not acceptable. Therefore, we
219 determine the bug just by checking for __APPLE__. If this bug
220 gets ever fixed, perhaps checking for sys/version.h would be
221 appropriate, which is 10/0 on the system with the bug. */
222#undef HAVE_GETADDRINFO
223/* avoid clashes with the C library definition of the symbol. */
224#define getaddrinfo fake_getaddrinfo
225#endif
226
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000227/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000228#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000229#include "getaddrinfo.c"
230#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000231#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000232#include "getnameinfo.c"
233#endif
234
Guido van Rossumbcc20741998-08-04 22:53:56 +0000235#if defined(MS_WINDOWS) || defined(__BEOS__)
236/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000237/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000238#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000239#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000240#endif
241
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000242#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000243#define EAFNOSUPPORT WSAEAFNOSUPPORT
244#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000245#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000246
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000247#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000248#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000249#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000250#endif
251
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000252#ifndef SOCKETCLOSE
253#define SOCKETCLOSE close
254#endif
255
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000256/* XXX There's a problem here: *static* functions are not supposed to have
257 a Py prefix (or use CapitalizedWords). Later... */
258
Guido van Rossum30a685f1991-06-27 15:51:29 +0000259/* Global variable holding the exception type for errors detected
260 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000261static PyObject *socket_error;
262static PyObject *socket_herror;
263static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000264
Guido van Rossum48a680c2001-03-02 06:34:14 +0000265#ifdef RISCOS
266/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
267static int taskwindow;
268#endif
269
Tim Peters643a7fc2002-02-17 04:13:21 +0000270/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000271 The sock_type variable contains pointers to various functions,
272 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000273 there has to be a circular reference. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000274staticforward PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000275
Guido van Rossum30a685f1991-06-27 15:51:29 +0000276/* Convenience function to raise an error according to errno
277 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000278
Guido van Rossum73624e91994-10-10 17:59:00 +0000279static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000280set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000281{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000282#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000283 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000284 static struct {
285 int no;
286 const char *msg;
287 } *msgp, msgs[] = {
288 {WSAEINTR, "Interrupted system call"},
289 {WSAEBADF, "Bad file descriptor"},
290 {WSAEACCES, "Permission denied"},
291 {WSAEFAULT, "Bad address"},
292 {WSAEINVAL, "Invalid argument"},
293 {WSAEMFILE, "Too many open files"},
294 {WSAEWOULDBLOCK,
295 "The socket operation could not complete "
296 "without blocking"},
297 {WSAEINPROGRESS, "Operation now in progress"},
298 {WSAEALREADY, "Operation already in progress"},
299 {WSAENOTSOCK, "Socket operation on non-socket"},
300 {WSAEDESTADDRREQ, "Destination address required"},
301 {WSAEMSGSIZE, "Message too long"},
302 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
303 {WSAENOPROTOOPT, "Protocol not available"},
304 {WSAEPROTONOSUPPORT, "Protocol not supported"},
305 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
306 {WSAEOPNOTSUPP, "Operation not supported"},
307 {WSAEPFNOSUPPORT, "Protocol family not supported"},
308 {WSAEAFNOSUPPORT, "Address family not supported"},
309 {WSAEADDRINUSE, "Address already in use"},
310 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
311 {WSAENETDOWN, "Network is down"},
312 {WSAENETUNREACH, "Network is unreachable"},
313 {WSAENETRESET, "Network dropped connection on reset"},
314 {WSAECONNABORTED, "Software caused connection abort"},
315 {WSAECONNRESET, "Connection reset by peer"},
316 {WSAENOBUFS, "No buffer space available"},
317 {WSAEISCONN, "Socket is already connected"},
318 {WSAENOTCONN, "Socket is not connected"},
319 {WSAESHUTDOWN, "Can't send after socket shutdown"},
320 {WSAETOOMANYREFS, "Too many references: can't splice"},
321 {WSAETIMEDOUT, "Operation timed out"},
322 {WSAECONNREFUSED, "Connection refused"},
323 {WSAELOOP, "Too many levels of symbolic links"},
324 {WSAENAMETOOLONG, "File name too long"},
325 {WSAEHOSTDOWN, "Host is down"},
326 {WSAEHOSTUNREACH, "No route to host"},
327 {WSAENOTEMPTY, "Directory not empty"},
328 {WSAEPROCLIM, "Too many processes"},
329 {WSAEUSERS, "Too many users"},
330 {WSAEDQUOT, "Disc quota exceeded"},
331 {WSAESTALE, "Stale NFS file handle"},
332 {WSAEREMOTE, "Too many levels of remote in path"},
333 {WSASYSNOTREADY, "Network subsystem is unvailable"},
334 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
335 {WSANOTINITIALISED,
336 "Successful WSAStartup() not yet performed"},
337 {WSAEDISCON, "Graceful shutdown in progress"},
338 /* Resolver errors */
339 {WSAHOST_NOT_FOUND, "No such host is known"},
340 {WSATRY_AGAIN, "Host not found, or server failed"},
341 {WSANO_RECOVERY, "Unexpected server error encountered"},
342 {WSANO_DATA, "Valid name without requested data"},
343 {WSANO_ADDRESS, "No address, look for MX record"},
344 {0, NULL}
345 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000346 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000347 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000348 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000349
Mark Hammond46a733d2000-07-24 01:45:11 +0000350 for (msgp = msgs; msgp->msg; msgp++) {
351 if (err_no == msgp->no) {
352 msg = msgp->msg;
353 break;
354 }
355 }
356
357 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000358 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000359 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000360 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000361 }
362 return NULL;
363 }
364 else
365#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000366
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000367#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000368 if (sock_errno() != NO_ERROR) {
369 APIRET rc;
370 ULONG msglen;
371 char outbuf[100];
372 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000373
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000374 /* Retrieve socket-related error message from MPTN.MSG file */
375 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
376 myerrorcode - SOCBASEERR + 26,
377 "mptn.msg",
378 &msglen);
379 if (rc == NO_ERROR) {
380 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000381
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000382 /* OS/2 doesn't guarantee a terminator */
383 outbuf[msglen] = '\0';
384 if (strlen(outbuf) > 0) {
385 /* If non-empty msg, trim CRLF */
386 char *lastc = &outbuf[ strlen(outbuf)-1 ];
387 while (lastc > outbuf && isspace(*lastc)) {
388 /* Trim trailing whitespace (CRLF) */
389 *lastc-- = '\0';
390 }
391 }
392 v = Py_BuildValue("(is)", myerrorcode, outbuf);
393 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000394 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000395 Py_DECREF(v);
396 }
397 return NULL;
398 }
399 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000400#endif
401
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000402 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000403}
404
Guido van Rossum30a685f1991-06-27 15:51:29 +0000405
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000406static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000407set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000408{
409 PyObject *v;
410
411#ifdef HAVE_HSTRERROR
412 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
413#else
414 v = Py_BuildValue("(is)", h_error, "host not found");
415#endif
416 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000417 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000418 Py_DECREF(v);
419 }
420
421 return NULL;
422}
423
424
425static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000426set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000427{
428 PyObject *v;
429
Martin v. Löwis272cb402002-03-01 08:31:07 +0000430#ifdef EAI_SYSTEM
431 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000432 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000433 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000434#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000435
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000436#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000437 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000438#else
439 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
440#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000441 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000442 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000443 Py_DECREF(v);
444 }
445
446 return NULL;
447}
448
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000449/* Function to perform the setting of socket blocking mode
450 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000451static int
452internal_setblocking(PySocketSockObject *s, int block)
453{
454#ifndef RISCOS
455#ifndef MS_WINDOWS
456 int delay_flag;
457#endif
458#endif
459
460 Py_BEGIN_ALLOW_THREADS
461#ifdef __BEOS__
462 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000463 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
464 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000465#else
466#ifndef RISCOS
467#ifndef MS_WINDOWS
468#if defined(PYOS_OS2) && !defined(PYCC_GCC)
469 block = !block;
470 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
471#else /* !PYOS_OS2 */
472 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
473 if (block)
474 delay_flag &= (~O_NDELAY);
475 else
476 delay_flag |= O_NDELAY;
477 fcntl(s->sock_fd, F_SETFL, delay_flag);
478#endif /* !PYOS_OS2 */
479#else /* MS_WINDOWS */
480 block = !block;
481 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
482#endif /* MS_WINDOWS */
483#endif /* __BEOS__ */
484#endif /* RISCOS */
485 Py_END_ALLOW_THREADS
486
487 /* Since these don't return anything */
488 return 1;
489}
490
Guido van Rossum11ba0942002-06-13 15:07:44 +0000491/* Do a select() on the socket, if necessary (sock_timeout > 0).
492 The argument writing indicates the direction.
493 This does not raise an exception or return a success indicator;
494 we'll let the actual socket call do that. */
495static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000496internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000497{
498 fd_set fds;
499 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000500
501 if (s->sock_timeout <= 0.0)
502 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000503
504 /* Construct the arguments to select */
505 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000506 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000507 FD_ZERO(&fds);
508 FD_SET(s->sock_fd, &fds);
509
510 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000511 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000512 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000513 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000514 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000515}
516
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000517/* Initialize a new socket object. */
518
519static void
520init_sockobject(PySocketSockObject *s,
521 SOCKET_T fd, int family, int type, int proto)
522{
523#ifdef RISCOS
524 int block = 1;
525#endif
526 s->sock_fd = fd;
527 s->sock_family = family;
528 s->sock_type = type;
529 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000530 s->sock_timeout = -1.0; /* Start without timeout */
531
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000532 s->errorhandler = &set_error;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000533#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000534 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000535 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000536#endif
537}
538
539
Guido van Rossum30a685f1991-06-27 15:51:29 +0000540/* Create a new socket object.
541 This just creates the object and initializes it.
542 If the creation fails, return NULL and set an exception (implicit
543 in NEWOBJ()). */
544
Guido van Rossum73624e91994-10-10 17:59:00 +0000545static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000546new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000547{
Guido van Rossum73624e91994-10-10 17:59:00 +0000548 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000549 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000550 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000551 if (s != NULL)
552 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000553 return s;
554}
555
Guido van Rossum30a685f1991-06-27 15:51:29 +0000556
Guido van Rossum48a680c2001-03-02 06:34:14 +0000557/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000558 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000559#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000560PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000561#endif
562
563
Guido van Rossum30a685f1991-06-27 15:51:29 +0000564/* Convert a string specifying a host name or one of a few symbolic
565 names to a numeric IP address. This usually calls gethostbyname()
566 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000567 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568 an error occurred; then an exception is raised. */
569
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000570static int
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000571setipaddr(char *name, struct sockaddr *addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000572{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573 struct addrinfo hints, *res;
574 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000575
Guido van Rossuma376cc51996-12-05 23:43:35 +0000576 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000577 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578 int siz;
579 memset(&hints, 0, sizeof(hints));
580 hints.ai_family = af;
581 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
582 hints.ai_flags = AI_PASSIVE;
583 error = getaddrinfo(NULL, "0", &hints, &res);
584 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000585 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586 return -1;
587 }
588 switch (res->ai_family) {
589 case AF_INET:
590 siz = 4;
591 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000592#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000593 case AF_INET6:
594 siz = 16;
595 break;
596#endif
597 default:
598 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000599 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000600 "unsupported address family");
601 return -1;
602 }
603 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000604 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000605 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606 "wildcard resolved to multiple address");
607 return -1;
608 }
609 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
610 freeaddrinfo(res);
611 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000612 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000614 struct sockaddr_in *sin;
615 if (af != PF_INET && af != PF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000616 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000617 "address family mismatched");
618 return -1;
619 }
620 sin = (struct sockaddr_in *)addr_ret;
621 memset((void *) sin, '\0', sizeof(*sin));
622 sin->sin_family = AF_INET;
623#ifdef HAVE_SOCKADDR_SA_LEN
624 sin->sin_len = sizeof(*sin);
625#endif
626 sin->sin_addr.s_addr = INADDR_BROADCAST;
627 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000628 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000629 memset(&hints, 0, sizeof(hints));
630 hints.ai_family = af;
631 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000632#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000633 if (error == EAI_NONAME && af == AF_UNSPEC) {
634 /* On Tru64 V5.1, numeric-to-addr conversion fails
635 if no address family is given. Assume IPv4 for now.*/
636 hints.ai_family = AF_INET;
637 error = getaddrinfo(name, NULL, &hints, &res);
638 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000639#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000640 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000641 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000642 return -1;
643 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000644 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
645 freeaddrinfo(res);
646 switch (addr_ret->sa_family) {
647 case AF_INET:
648 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000649#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000650 case AF_INET6:
651 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000652#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000653 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000654 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000655 return -1;
656 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000657}
658
Guido van Rossum30a685f1991-06-27 15:51:29 +0000659
Guido van Rossum30a685f1991-06-27 15:51:29 +0000660/* Create a string object representing an IP address.
661 This is always a string of the form 'dd.dd.dd.dd' (with variable
662 size numbers). */
663
Guido van Rossum73624e91994-10-10 17:59:00 +0000664static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000665makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000666{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000667 char buf[NI_MAXHOST];
668 int error;
669
670 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
671 NI_NUMERICHOST);
672 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000673 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000674 return NULL;
675 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000677}
678
679
680/* Create an object representing the given socket address,
681 suitable for passing it back to bind(), connect() etc.
682 The family field of the sockaddr structure is inspected
683 to determine what kind of address it really is. */
684
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000685/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000686static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000687makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000688{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000689 if (addrlen == 0) {
690 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000691 Py_INCREF(Py_None);
692 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000693 }
694
Guido van Rossumbcc20741998-08-04 22:53:56 +0000695#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000696 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000697 addr->sa_family = AF_INET;
698#endif
699
Guido van Rossum30a685f1991-06-27 15:51:29 +0000700 switch (addr->sa_family) {
701
702 case AF_INET:
703 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000704 struct sockaddr_in *a;
705 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000706 PyObject *ret = NULL;
707 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000708 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000709 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
710 Py_DECREF(addrobj);
711 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000712 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000713 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000714
Guido van Rossumb6775db1994-08-01 11:34:53 +0000715#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000716 case AF_UNIX:
717 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000718 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000719 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000720 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000721#endif /* AF_UNIX */
722
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000723#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000724 case AF_INET6:
725 {
726 struct sockaddr_in6 *a;
727 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
728 PyObject *ret = NULL;
729 if (addrobj) {
730 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000731 ret = Py_BuildValue("Oiii",
732 addrobj,
733 ntohs(a->sin6_port),
734 a->sin6_flowinfo,
735 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000736 Py_DECREF(addrobj);
737 }
738 return ret;
739 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000740#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000741
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000742#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000743 case AF_PACKET:
744 {
745 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
746 char *ifname = "";
747 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000748 /* need to look up interface name give index */
749 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000750 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000751 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000752 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000753 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000754 return Py_BuildValue("shbhs#",
755 ifname,
756 ntohs(a->sll_protocol),
757 a->sll_pkttype,
758 a->sll_hatype,
759 a->sll_addr,
760 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000761 }
762#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000763
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764 /* More cases here... */
765
766 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000767 /* If we don't know the address family, don't raise an
768 exception -- return it as a tuple. */
769 return Py_BuildValue("is#",
770 addr->sa_family,
771 addr->sa_data,
772 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000773
Guido van Rossum30a685f1991-06-27 15:51:29 +0000774 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775}
776
Guido van Rossum30a685f1991-06-27 15:51:29 +0000777
778/* Parse a socket address argument according to the socket object's
779 address family. Return 1 if the address was in the proper format,
780 0 of not. The address is returned through addr_ret, its length
781 through len_ret. */
782
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000783static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000784getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000785 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787 switch (s->sock_family) {
788
Guido van Rossumb6775db1994-08-01 11:34:53 +0000789#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000790 case AF_UNIX:
791 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000792 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000793 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000795 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000796 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000797 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000798 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000799 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000800 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000801 return 0;
802 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000803 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000804 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000805 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000806 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000807 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000808 return 1;
809 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000810#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000811
Guido van Rossum30a685f1991-06-27 15:51:29 +0000812 case AF_INET:
813 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000814 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000815 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000816 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000817 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000818 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000819 PyErr_Format(
820 PyExc_TypeError,
821 "getsockaddrarg: "
822 "AF_INET address must be tuple, not %.500s",
823 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000824 return 0;
825 }
826 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000827 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000828 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000830 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000831 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000832 *addr_ret = (struct sockaddr *) addr;
833 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834 return 1;
835 }
836
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000837#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000838 case AF_INET6:
839 {
840 struct sockaddr_in6* addr;
841 char *host;
842 int port, flowinfo, scope_id;
843 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
844 flowinfo = scope_id = 0;
845 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000846 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000847 return 0;
848 }
849 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
850 return 0;
851 addr->sin6_family = s->sock_family;
852 addr->sin6_port = htons((short)port);
853 addr->sin6_flowinfo = flowinfo;
854 addr->sin6_scope_id = scope_id;
855 *addr_ret = (struct sockaddr *) addr;
856 *len_ret = sizeof *addr;
857 return 1;
858 }
859#endif
860
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000861#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000862 case AF_PACKET:
863 {
864 struct sockaddr_ll* addr;
865 struct ifreq ifr;
866 char *interfaceName;
867 int protoNumber;
868 int hatype = 0;
869 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000870 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000871
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000872 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
873 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000874 return 0;
875 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
876 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000877 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000878 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000879 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000880 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000881 addr = &(s->sock_addr.ll);
882 addr->sll_family = AF_PACKET;
883 addr->sll_protocol = htons((short)protoNumber);
884 addr->sll_ifindex = ifr.ifr_ifindex;
885 addr->sll_pkttype = pkttype;
886 addr->sll_hatype = hatype;
887 *addr_ret = (struct sockaddr *) addr;
888 *len_ret = sizeof *addr;
889 return 1;
890 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000891#endif
892
Guido van Rossum30a685f1991-06-27 15:51:29 +0000893 /* More cases here... */
894
895 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000896 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000897 return 0;
898
899 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000900}
901
Guido van Rossum30a685f1991-06-27 15:51:29 +0000902
Guido van Rossum48a680c2001-03-02 06:34:14 +0000903/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000904 Return 1 if the family is known, 0 otherwise. The length is returned
905 through len_ret. */
906
907static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000908getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000909{
910 switch (s->sock_family) {
911
Guido van Rossumb6775db1994-08-01 11:34:53 +0000912#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000913 case AF_UNIX:
914 {
915 *len_ret = sizeof (struct sockaddr_un);
916 return 1;
917 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000918#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000919
920 case AF_INET:
921 {
922 *len_ret = sizeof (struct sockaddr_in);
923 return 1;
924 }
925
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000926#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000927 case AF_INET6:
928 {
929 *len_ret = sizeof (struct sockaddr_in6);
930 return 1;
931 }
932#endif
933
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000934#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000935 case AF_PACKET:
936 {
937 *len_ret = sizeof (struct sockaddr_ll);
938 return 1;
939 }
940#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000941
Guido van Rossum710e1df1992-06-12 10:39:36 +0000942 /* More cases here... */
943
944 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000945 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000946 return 0;
947
948 }
949}
950
951
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952/* s.accept() method */
953
Guido van Rossum73624e91994-10-10 17:59:00 +0000954static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000955sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000956{
957 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000958 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000959 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000960 PyObject *sock = NULL;
961 PyObject *addr = NULL;
962 PyObject *res = NULL;
963
Guido van Rossum710e1df1992-06-12 10:39:36 +0000964 if (!getsockaddrlen(s, &addrlen))
965 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000966 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000967
Guido van Rossum73624e91994-10-10 17:59:00 +0000968 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +0000969 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000972
Fred Drakea04eaad2000-06-30 02:46:07 +0000973#ifdef MS_WINDOWS
974 if (newfd == INVALID_SOCKET)
975#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000976 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000977#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000978 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +0000979
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980 /* Create the new object with unspecified family,
981 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000982 sock = (PyObject *) new_sockobject(newfd,
983 s->sock_family,
984 s->sock_type,
985 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000986
Barry Warsaw752300b1997-01-03 17:18:10 +0000987 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000988 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000989 goto finally;
990 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000991 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000992 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000993 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000994 goto finally;
995
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000996 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000997
Guido van Rossum67f7a382002-06-06 21:08:16 +0000998finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000999 Py_XDECREF(sock);
1000 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001001 return res;
1002}
1003
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001004PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001005"accept() -> (socket object, address info)\n\
1006\n\
1007Wait for an incoming connection. Return a new socket representing the\n\
1008connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001009info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001010
Guido van Rossum11ba0942002-06-13 15:07:44 +00001011/* s.setblocking(flag) method. Argument:
1012 False -- non-blocking mode; same as settimeout(0)
1013 True -- blocking mode; same as settimeout(None)
1014*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001015
Guido van Rossum73624e91994-10-10 17:59:00 +00001016static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001017sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001018{
1019 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001020
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001021 block = PyInt_AsLong(arg);
1022 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001023 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001024
Guido van Rossum11ba0942002-06-13 15:07:44 +00001025 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001026 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001027
Guido van Rossum73624e91994-10-10 17:59:00 +00001028 Py_INCREF(Py_None);
1029 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001030}
Guido van Rossume4485b01994-09-07 14:32:49 +00001031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001032PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001033"setblocking(flag)\n\
1034\n\
1035Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001036setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001037setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001038
Guido van Rossum11ba0942002-06-13 15:07:44 +00001039/* s.settimeout(timeout) method. Argument:
1040 None -- no timeout, blocking mode; same as setblocking(True)
1041 0.0 -- non-blocking mode; same as setblocking(False)
1042 > 0 -- timeout mode; operations time out after timeout seconds
1043 < 0 -- illegal; raises an exception
1044*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001045static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001046sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001047{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001048 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001049
1050 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001051 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001052 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001053 timeout = PyFloat_AsDouble(arg);
1054 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001055 if (!PyErr_Occurred())
1056 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001057 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001058 return NULL;
1059 }
1060 }
1061
Guido van Rossum11ba0942002-06-13 15:07:44 +00001062 s->sock_timeout = timeout;
1063 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001064
1065 Py_INCREF(Py_None);
1066 return Py_None;
1067}
1068
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001069PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001070"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001071\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001072Set a timeout on socket operations. 'timeout' can be a float,\n\
1073giving in seconds, or None. Setting a timeout of None disables\n\
1074the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001075Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001076
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001077/* s.gettimeout() method.
1078 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001079static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001080sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001081{
1082 if (s->sock_timeout < 0.0) {
1083 Py_INCREF(Py_None);
1084 return Py_None;
1085 }
1086 else
1087 return PyFloat_FromDouble(s->sock_timeout);
1088}
1089
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001090PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001091"gettimeout()\n\
1092\n\
1093Returns the timeout in floating seconds associated with socket \n\
1094operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001095operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001096
Guido van Rossum48a680c2001-03-02 06:34:14 +00001097#ifdef RISCOS
1098/* s.sleeptaskw(1 | 0) method */
1099
1100static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001101sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001102{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001103 int block;
1104 int delay_flag;
1105 if (!PyArg_Parse(args, "i", &block))
1106 return NULL;
1107 Py_BEGIN_ALLOW_THREADS
1108 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1109 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001110
Guido van Rossum67f7a382002-06-06 21:08:16 +00001111 Py_INCREF(Py_None);
1112 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001113}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001114PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001115"sleeptaskw(flag)\n\
1116\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001117Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001118#endif
1119
1120
Guido van Rossumaee08791992-09-08 09:05:33 +00001121/* s.setsockopt() method.
1122 With an integer third argument, sets an integer option.
1123 With a string third argument, sets an option from a buffer;
1124 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001125
Guido van Rossum73624e91994-10-10 17:59:00 +00001126static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001127sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001128{
1129 int level;
1130 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001131 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001132 char *buf;
1133 int buflen;
1134 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001135
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001136 if (PyArg_ParseTuple(args, "iii:setsockopt",
1137 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001138 buf = (char *) &flag;
1139 buflen = sizeof flag;
1140 }
1141 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001142 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001143 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1144 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001145 return NULL;
1146 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001147 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001148 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001149 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001150 Py_INCREF(Py_None);
1151 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001152}
1153
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001154PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001155"setsockopt(level, option, value)\n\
1156\n\
1157Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001158The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001159
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001160
Guido van Rossumaee08791992-09-08 09:05:33 +00001161/* s.getsockopt() method.
1162 With two arguments, retrieves an integer option.
1163 With a third integer argument, retrieves a string buffer of that size;
1164 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001165
Guido van Rossum73624e91994-10-10 17:59:00 +00001166static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001167sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001168{
1169 int level;
1170 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001171 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001172 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001173 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001174
Guido van Rossumbcc20741998-08-04 22:53:56 +00001175#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001176 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001177 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001178 return NULL;
1179#else
1180
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001181 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1182 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001183 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001184
Guido van Rossumbe32c891996-06-20 16:25:29 +00001185 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001186 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001187 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001188 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001189 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001190 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001191 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001192 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001193 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001194 if (buflen <= 0 || buflen > 1024) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001195 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001196 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001197 return NULL;
1198 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001199 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001200 if (buf == NULL)
1201 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001202 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001203 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001204 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001205 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001206 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001207 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001208 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001209 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001210#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001211}
1212
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001213PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001214"getsockopt(level, option[, buffersize]) -> value\n\
1215\n\
1216Get a socket option. See the Unix manual for level and option.\n\
1217If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001218string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001219
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001220
Fred Drake728819a2000-07-01 03:40:12 +00001221/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001222
Guido van Rossum73624e91994-10-10 17:59:00 +00001223static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001224sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001225{
1226 struct sockaddr *addr;
1227 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001228 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001229
Fred Drake728819a2000-07-01 03:40:12 +00001230 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001231 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001232 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001233 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001234 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001235 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001236 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001237 Py_INCREF(Py_None);
1238 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001239}
1240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001241PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001242"bind(address)\n\
1243\n\
1244Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001245pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001246sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001247
Guido van Rossum30a685f1991-06-27 15:51:29 +00001248
1249/* s.close() method.
1250 Set the file descriptor to -1 so operations tried subsequently
1251 will surely fail. */
1252
Guido van Rossum73624e91994-10-10 17:59:00 +00001253static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001254sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001255{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001256 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001257
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001258 if ((fd = s->sock_fd) != -1) {
1259 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001260 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001261 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001262 Py_END_ALLOW_THREADS
1263 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001264 Py_INCREF(Py_None);
1265 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001266}
1267
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001268PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001269"close()\n\
1270\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001271Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001272
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001273static int
1274internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1275{
1276 int res;
1277
1278 res = connect(s->sock_fd, addr, addrlen);
1279
1280#ifdef MS_WINDOWS
1281
1282 if (s->sock_timeout > 0.0) {
1283 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
1284 internal_select(s, 1);
1285 res = connect(s->sock_fd, addr, addrlen);
1286 if (res < 0 && WSAGetLastError() == WSAEISCONN)
1287 res = 0;
1288 }
1289 }
1290
1291 if (res < 0)
1292 res = WSAGetLastError();
1293
1294#else
1295
1296 if (s->sock_timeout > 0.0) {
1297 if (res < 0 && errno == EINPROGRESS) {
1298 internal_select(s, 1);
1299 res = connect(s->sock_fd, addr, addrlen);
1300 }
1301 }
1302
1303 if (res < 0)
1304 res = errno;
1305
1306#endif
1307
1308 return res;
1309}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001310
Fred Drake728819a2000-07-01 03:40:12 +00001311/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001312
Guido van Rossum73624e91994-10-10 17:59:00 +00001313static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001314sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001315{
1316 struct sockaddr *addr;
1317 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001318 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001319
Fred Drake728819a2000-07-01 03:40:12 +00001320 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001321 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001322
Guido van Rossum73624e91994-10-10 17:59:00 +00001323 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001324 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001325 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001326
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001327 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001328 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001329 Py_INCREF(Py_None);
1330 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001331}
1332
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001333PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001334"connect(address)\n\
1335\n\
1336Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001337is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001338
Guido van Rossum30a685f1991-06-27 15:51:29 +00001339
Fred Drake728819a2000-07-01 03:40:12 +00001340/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001341
1342static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001343sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001344{
1345 struct sockaddr *addr;
1346 int addrlen;
1347 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001348
Fred Drake728819a2000-07-01 03:40:12 +00001349 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001350 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001351
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001352 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001353 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001354 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001355
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001356 return PyInt_FromLong((long) res);
1357}
1358
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001359PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001360"connect_ex(address)\n\
1361\n\
1362This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001363instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001364
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001365
Guido van Rossumed233a51992-06-23 09:07:03 +00001366/* s.fileno() method */
1367
Guido van Rossum73624e91994-10-10 17:59:00 +00001368static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001369sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001370{
Fred Drakea04eaad2000-06-30 02:46:07 +00001371#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001372 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001373#else
1374 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1375#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001376}
1377
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001378PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001379"fileno() -> integer\n\
1380\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001381Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001382
Guido van Rossumed233a51992-06-23 09:07:03 +00001383
Guido van Rossumbe32c891996-06-20 16:25:29 +00001384#ifndef NO_DUP
1385/* s.dup() method */
1386
1387static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001388sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001389{
Fred Drakea04eaad2000-06-30 02:46:07 +00001390 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001391 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001392
Guido van Rossumbe32c891996-06-20 16:25:29 +00001393 newfd = dup(s->sock_fd);
1394 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001395 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001396 sock = (PyObject *) new_sockobject(newfd,
1397 s->sock_family,
1398 s->sock_type,
1399 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001400 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001401 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001402 return sock;
1403}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001404
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001405PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001406"dup() -> socket object\n\
1407\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001408Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001409
Guido van Rossumbe32c891996-06-20 16:25:29 +00001410#endif
1411
1412
Guido van Rossumc89705d1992-11-26 08:54:07 +00001413/* s.getsockname() method */
1414
Guido van Rossum73624e91994-10-10 17:59:00 +00001415static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001416sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001417{
1418 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001419 int res;
1420 socklen_t addrlen;
1421
Guido van Rossumc89705d1992-11-26 08:54:07 +00001422 if (!getsockaddrlen(s, &addrlen))
1423 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001424 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001425 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001426 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001427 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001428 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001429 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001430 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001431}
1432
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001433PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001434"getsockname() -> address info\n\
1435\n\
1436Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001437info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001438
Guido van Rossumc89705d1992-11-26 08:54:07 +00001439
Guido van Rossumb6775db1994-08-01 11:34:53 +00001440#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001441/* s.getpeername() method */
1442
Guido van Rossum73624e91994-10-10 17:59:00 +00001443static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001444sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001445{
1446 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001447 int res;
1448 socklen_t addrlen;
1449
Guido van Rossumc89705d1992-11-26 08:54:07 +00001450 if (!getsockaddrlen(s, &addrlen))
1451 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001452 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001453 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001454 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001455 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001456 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001457 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001458 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001459}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001460
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001461PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001462"getpeername() -> address info\n\
1463\n\
1464Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001465info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001466
Guido van Rossumb6775db1994-08-01 11:34:53 +00001467#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001468
1469
Guido van Rossum30a685f1991-06-27 15:51:29 +00001470/* s.listen(n) method */
1471
Guido van Rossum73624e91994-10-10 17:59:00 +00001472static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001473sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001474{
1475 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001476 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001477
1478 backlog = PyInt_AsLong(arg);
1479 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001480 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001481 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001482 if (backlog < 1)
1483 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001484 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001485 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001486 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001487 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001488 Py_INCREF(Py_None);
1489 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001490}
1491
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001492PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001493"listen(backlog)\n\
1494\n\
1495Enable a server to accept connections. The backlog argument must be at\n\
1496least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001497will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001498
1499
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001500#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001501/* s.makefile(mode) method.
1502 Create a new open file object referring to a dupped version of
1503 the socket's file descriptor. (The dup() call is necessary so
1504 that the open file and socket objects may be closed independent
1505 of each other.)
1506 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1507
Guido van Rossum73624e91994-10-10 17:59:00 +00001508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001509sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001510{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001511 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001512 char *mode = "r";
1513 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001514#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001515 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001516#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001517 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001518#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001519 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001520 PyObject *f;
1521
Guido van Rossum43713e52000-02-29 13:59:29 +00001522 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001523 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001524#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001525 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1526 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001527#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001528 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001529#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001530 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001531 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001532 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001533 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001534 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001535#ifdef USE_GUSI2
1536 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001537 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001538 bufsize = 0;
1539#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001540 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1541 if (f != NULL)
1542 PyFile_SetBufSize(f, bufsize);
1543 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001544}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001545
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001546PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001547"makefile([mode[, buffersize]]) -> file object\n\
1548\n\
1549Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001550The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001551
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001552#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001553
Guido van Rossum48a680c2001-03-02 06:34:14 +00001554
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001555/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001556
Guido van Rossum73624e91994-10-10 17:59:00 +00001557static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001558sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001559{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001560 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001561 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001562
Guido van Rossum43713e52000-02-29 13:59:29 +00001563 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001564 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001565
1566 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001567 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001568 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001569 return NULL;
1570 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001571
Guido van Rossum73624e91994-10-10 17:59:00 +00001572 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001573 if (buf == NULL)
1574 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001575
Guido van Rossum73624e91994-10-10 17:59:00 +00001576 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001577 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001578 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001579 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001580
Guido van Rossum7c53b771995-09-13 18:39:47 +00001581 if (n < 0) {
1582 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001583 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001584 }
Tim Peters5de98422002-04-27 18:44:32 +00001585 if (n != len)
1586 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001587 return buf;
1588}
1589
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001590PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001591"recv(buffersize[, flags]) -> data\n\
1592\n\
1593Receive up to buffersize bytes from the socket. For the optional flags\n\
1594argument, see the Unix manual. When no data is available, block until\n\
1595at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001596the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001597
Guido van Rossum30a685f1991-06-27 15:51:29 +00001598
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001599/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001600
Guido van Rossum73624e91994-10-10 17:59:00 +00001601static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001602sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001603{
1604 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001605 PyObject *buf = NULL;
1606 PyObject *addr = NULL;
1607 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001608 int len, n, flags = 0;
1609 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001610
Guido van Rossum43713e52000-02-29 13:59:29 +00001611 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001612 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001613
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001614 if (!getsockaddrlen(s, &addrlen))
1615 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001616 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001617 if (buf == NULL)
1618 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001619
Guido van Rossum73624e91994-10-10 17:59:00 +00001620 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001621 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001622 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001623 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001624#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001625#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001626 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001627#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001628 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001629#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001630#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001631 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001632#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001633 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001634 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001635
Guido van Rossum7c53b771995-09-13 18:39:47 +00001636 if (n < 0) {
1637 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001638 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001639 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001640
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001641 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001642 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001643
Guido van Rossum67f7a382002-06-06 21:08:16 +00001644 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001645 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001646 goto finally;
1647
Guido van Rossum73624e91994-10-10 17:59:00 +00001648 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001649
1650finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001651 Py_XDECREF(addr);
1652 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001653 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001654}
1655
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001656PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001657"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1658\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001659Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001660
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001661/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001662
Guido van Rossum73624e91994-10-10 17:59:00 +00001663static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001664sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001665{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001666 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001667 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001668
Guido van Rossum43713e52000-02-29 13:59:29 +00001669 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001670 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001671
Guido van Rossum73624e91994-10-10 17:59:00 +00001672 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001673 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001674 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001675 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001676
Guido van Rossum30a685f1991-06-27 15:51:29 +00001677 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001678 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001679 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001680}
1681
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001682PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001683"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001684\n\
1685Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001686argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001687sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001688
1689
1690/* s.sendall(data [,flags]) method */
1691
1692static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001693sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001694{
1695 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001696 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001697
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001698 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1699 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001700
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001701 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001702 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001703 do {
1704 n = send(s->sock_fd, buf, len, flags);
1705 if (n < 0)
1706 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001707 buf += n;
1708 len -= n;
1709 } while (len > 0);
1710 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001711
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001712 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001713 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001714
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001715 Py_INCREF(Py_None);
1716 return Py_None;
1717}
1718
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001719PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001720"sendall(data[, flags])\n\
1721\n\
1722Send a data string to the socket. For the optional flags\n\
1723argument, see the Unix manual. This calls send() repeatedly\n\
1724until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001725to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001726
Guido van Rossum30a685f1991-06-27 15:51:29 +00001727
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001728/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001729
Guido van Rossum73624e91994-10-10 17:59:00 +00001730static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001731sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001732{
Guido van Rossum73624e91994-10-10 17:59:00 +00001733 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001734 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001735 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001736 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001737
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001738 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001739 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001740 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001741 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1742 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001743 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001744 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001745
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001746 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001747 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001748
Guido van Rossum73624e91994-10-10 17:59:00 +00001749 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001750 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001751 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001752 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001753
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001754 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001755 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001756 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001757}
1758
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001759PyDoc_STRVAR(sendto_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001760"sendto(data[, flags], address)\n\
1761\n\
1762Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001763For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001764
Guido van Rossum30a685f1991-06-27 15:51:29 +00001765
1766/* s.shutdown(how) method */
1767
Guido van Rossum73624e91994-10-10 17:59:00 +00001768static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001769sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001770{
1771 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001772 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001773
1774 how = PyInt_AsLong(arg);
1775 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001776 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001777 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001778 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001779 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001780 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001781 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001782 Py_INCREF(Py_None);
1783 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001784}
1785
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001786PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001787"shutdown(flag)\n\
1788\n\
1789Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001790of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001791
Guido van Rossum30a685f1991-06-27 15:51:29 +00001792
1793/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001794
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001795static PyMethodDef sock_methods[] = {
1796 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001797 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001798 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001799 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001800 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001801 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001802 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001803 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001804 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001805 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001806#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001807 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001808 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001809#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001810 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001811 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001812#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001813 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001814 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001815#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001816 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001817 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001818 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001819 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001820 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001821 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001822#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001823 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001824 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001825#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001826 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001827 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001828 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001829 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001830 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001831 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001832 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001833 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001834 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001835 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001836 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001837 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001838 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001839 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001840 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001841 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001842 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001843 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001844 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001845 shutdown_doc},
1846#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001847 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001848 sleeptaskw_doc},
1849#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001850 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001851};
1852
Guido van Rossum30a685f1991-06-27 15:51:29 +00001853
Guido van Rossum73624e91994-10-10 17:59:00 +00001854/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001855 First close the file description. */
1856
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001857static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001858sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001859{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001860 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001861 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001862 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001863}
1864
Guido van Rossum30a685f1991-06-27 15:51:29 +00001865
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001866static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001867sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001868{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001869 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001870#if SIZEOF_SOCKET_T > SIZEOF_LONG
1871 if (s->sock_fd > LONG_MAX) {
1872 /* this can occur on Win64, and actually there is a special
1873 ugly printf formatter for decimal pointer length integer
1874 printing, only bother if necessary*/
1875 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001876 "no printf formatter to display "
1877 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00001878 return NULL;
1879 }
1880#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001881 PyOS_snprintf(
1882 buf, sizeof(buf),
1883 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1884 (long)s->sock_fd, s->sock_family,
1885 s->sock_type,
1886 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001887 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001888}
1889
1890
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001891/* Create a new, uninitialized socket object. */
1892
1893static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001894sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001895{
1896 PyObject *new;
1897
1898 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00001899 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001900 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001901 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001902 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00001903 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001904 return new;
1905}
1906
1907
1908/* Initialize a new socket object. */
1909
1910/*ARGSUSED*/
1911static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00001912sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001913{
1914 PySocketSockObject *s = (PySocketSockObject *)self;
1915 SOCKET_T fd;
1916 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1917 static char *keywords[] = {"family", "type", "proto", 0};
1918
1919 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1920 "|iii:socket", keywords,
1921 &family, &type, &proto))
1922 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001923
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001924 Py_BEGIN_ALLOW_THREADS
1925 fd = socket(family, type, proto);
1926 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001927
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001928#ifdef MS_WINDOWS
1929 if (fd == INVALID_SOCKET)
1930#else
1931 if (fd < 0)
1932#endif
1933 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001934 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001935 return -1;
1936 }
1937 init_sockobject(s, fd, family, type, proto);
1938 /* From now on, ignore SIGPIPE and let the error checking
1939 do the work. */
1940#ifdef SIGPIPE
1941 (void) signal(SIGPIPE, SIG_IGN);
1942#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001943
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001944 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001945
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001946}
1947
1948
Guido van Rossumb6775db1994-08-01 11:34:53 +00001949/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001950
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001951static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001952 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001953 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001954 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001955 sizeof(PySocketSockObject), /* tp_basicsize */
1956 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001957 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001958 0, /* tp_print */
1959 0, /* tp_getattr */
1960 0, /* tp_setattr */
1961 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001962 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001963 0, /* tp_as_number */
1964 0, /* tp_as_sequence */
1965 0, /* tp_as_mapping */
1966 0, /* tp_hash */
1967 0, /* tp_call */
1968 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001969 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001970 0, /* tp_setattro */
1971 0, /* tp_as_buffer */
1972 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001973 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001974 0, /* tp_traverse */
1975 0, /* tp_clear */
1976 0, /* tp_richcompare */
1977 0, /* tp_weaklistoffset */
1978 0, /* tp_iter */
1979 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001980 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001981 0, /* tp_members */
1982 0, /* tp_getset */
1983 0, /* tp_base */
1984 0, /* tp_dict */
1985 0, /* tp_descr_get */
1986 0, /* tp_descr_set */
1987 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00001988 sock_initobj, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001989 0, /* set below */ /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001990 sock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001991 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001992};
1993
Guido van Rossum30a685f1991-06-27 15:51:29 +00001994
Guido van Rossum81194471991-07-27 21:42:02 +00001995/* Python interface to gethostname(). */
1996
1997/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001998static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001999socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002000{
2001 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002002 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002003 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002004 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002005 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002006 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002007 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002008 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002009 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002010 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002011 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002012}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002013
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002014PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002015"gethostname() -> string\n\
2016\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002017Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002018
Guido van Rossumff4949e1992-08-05 19:58:53 +00002019
Guido van Rossum30a685f1991-06-27 15:51:29 +00002020/* Python interface to gethostbyname(name). */
2021
2022/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002023static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002024socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002025{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002026 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002027 struct sockaddr_storage addrbuf;
2028
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002029 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002030 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002031 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002032 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002033 return makeipaddr((struct sockaddr *)&addrbuf,
2034 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002035}
2036
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002037PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002038"gethostbyname(host) -> address\n\
2039\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002040Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002041
2042
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002043/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2044
2045static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002046gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002047{
2048 char **pch;
2049 PyObject *rtn_tuple = (PyObject *)NULL;
2050 PyObject *name_list = (PyObject *)NULL;
2051 PyObject *addr_list = (PyObject *)NULL;
2052 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002053
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002054 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002055 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002056#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002057 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002058#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002059 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002060#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002061 return NULL;
2062 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002063
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002064 if (h->h_addrtype != af) {
2065#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002066 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002067 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002068 (char *)strerror(EAFNOSUPPORT));
2069#else
2070 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002071 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002072 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002073#endif
2074 return NULL;
2075 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002076
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002077 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002078
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002079 case AF_INET:
2080 if (alen < sizeof(struct sockaddr_in))
2081 return NULL;
2082 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002083
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002084#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002085 case AF_INET6:
2086 if (alen < sizeof(struct sockaddr_in6))
2087 return NULL;
2088 break;
2089#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002090
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002091 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002092
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002093 if ((name_list = PyList_New(0)) == NULL)
2094 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002095
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002096 if ((addr_list = PyList_New(0)) == NULL)
2097 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002098
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002099 for (pch = h->h_aliases; *pch != NULL; pch++) {
2100 int status;
2101 tmp = PyString_FromString(*pch);
2102 if (tmp == NULL)
2103 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002104
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002105 status = PyList_Append(name_list, tmp);
2106 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002107
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002108 if (status)
2109 goto err;
2110 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002111
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002112 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2113 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002114
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002115 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002116
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002117 case AF_INET:
2118 {
2119 struct sockaddr_in sin;
2120 memset(&sin, 0, sizeof(sin));
2121 sin.sin_family = af;
2122#ifdef HAVE_SOCKADDR_SA_LEN
2123 sin.sin_len = sizeof(sin);
2124#endif
2125 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2126 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002127
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002128 if (pch == h->h_addr_list && alen >= sizeof(sin))
2129 memcpy((char *) addr, &sin, sizeof(sin));
2130 break;
2131 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002132
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002133#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002134 case AF_INET6:
2135 {
2136 struct sockaddr_in6 sin6;
2137 memset(&sin6, 0, sizeof(sin6));
2138 sin6.sin6_family = af;
2139#ifdef HAVE_SOCKADDR_SA_LEN
2140 sin6.sin6_len = sizeof(sin6);
2141#endif
2142 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2143 tmp = makeipaddr((struct sockaddr *)&sin6,
2144 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002145
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002146 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2147 memcpy((char *) addr, &sin6, sizeof(sin6));
2148 break;
2149 }
2150#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002151
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002152 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002153 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002154 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002155 return NULL;
2156 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002157
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002158 if (tmp == NULL)
2159 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002160
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002161 status = PyList_Append(addr_list, tmp);
2162 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002163
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002164 if (status)
2165 goto err;
2166 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002167
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002168 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002169
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002170 err:
2171 Py_XDECREF(name_list);
2172 Py_XDECREF(addr_list);
2173 return rtn_tuple;
2174}
2175
2176
2177/* Python interface to gethostbyname_ex(name). */
2178
2179/*ARGSUSED*/
2180static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002181socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002182{
2183 char *name;
2184 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002185 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002186 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002187 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002188#ifdef HAVE_GETHOSTBYNAME_R
2189 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002190#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2191 struct hostent_data data;
2192#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002193 char buf[16384];
2194 int buf_len = (sizeof buf) - 1;
2195 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002196#endif
2197#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002198 int result;
2199#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002200#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002201
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002202 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002203 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002204 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002205 return NULL;
2206 Py_BEGIN_ALLOW_THREADS
2207#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002208#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002209 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2210 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002211#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002212 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002213#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002214 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002215 result = gethostbyname_r(name, &hp_allocated, &data);
2216 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002217#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002218#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002219#ifdef USE_GETHOSTBYNAME_LOCK
2220 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002221#endif
2222 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002223#endif /* HAVE_GETHOSTBYNAME_R */
2224 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002225 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002226 addr.ss_family.
2227 Therefore, we cast the sockaddr_storage into sockaddr to
2228 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002229 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002230 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002231 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002232#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002233 PyThread_release_lock(gethostbyname_lock);
2234#endif
2235 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002236}
2237
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002238PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002239"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2240\n\
2241Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002242for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002243
2244
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002245/* Python interface to gethostbyaddr(IP). */
2246
2247/*ARGSUSED*/
2248static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002249socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002250{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002251#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002252 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002253#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002254 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002255#endif
2256 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002257 char *ip_num;
2258 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002259 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002260#ifdef HAVE_GETHOSTBYNAME_R
2261 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002262#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2263 struct hostent_data data;
2264#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002265 char buf[16384];
2266 int buf_len = (sizeof buf) - 1;
2267 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002268#endif
2269#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002270 int result;
2271#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002272#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002273 char *ap;
2274 int al;
2275 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002276
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002277 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002278 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002279 af = PF_UNSPEC;
2280 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002281 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002282 af = sa->sa_family;
2283 ap = NULL;
2284 al = 0;
2285 switch (af) {
2286 case AF_INET:
2287 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2288 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2289 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002290#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002291 case AF_INET6:
2292 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2293 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2294 break;
2295#endif
2296 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002297 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002298 return NULL;
2299 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002300 Py_BEGIN_ALLOW_THREADS
2301#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002302#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002303 result = gethostbyaddr_r(ap, al, af,
2304 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002305 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002306#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002307 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002308 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002309#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002310 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002311 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002312 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002313#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002314#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002315#ifdef USE_GETHOSTBYNAME_LOCK
2316 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002317#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002318 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002319#endif /* HAVE_GETHOSTBYNAME_R */
2320 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002321 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002322#ifdef USE_GETHOSTBYNAME_LOCK
2323 PyThread_release_lock(gethostbyname_lock);
2324#endif
2325 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002326}
2327
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002328PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002329"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2330\n\
2331Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002332for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002333
Guido van Rossum30a685f1991-06-27 15:51:29 +00002334
2335/* Python interface to getservbyname(name).
2336 This only returns the port number, since the other info is already
2337 known or not useful (like the list of aliases). */
2338
2339/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002340static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002341socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002342{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002343 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002344 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002345 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002346 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002347 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002348 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002349 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002350 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002351 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002352 return NULL;
2353 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002354 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002355}
2356
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002357PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002358"getservbyname(servicename, protocolname) -> integer\n\
2359\n\
2360Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002361The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002362
Guido van Rossum30a685f1991-06-27 15:51:29 +00002363
Guido van Rossum3901d851996-12-19 16:35:04 +00002364/* Python interface to getprotobyname(name).
2365 This only returns the protocol number, since the other info is
2366 already known or not useful (like the list of aliases). */
2367
2368/*ARGSUSED*/
2369static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002370socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002371{
2372 char *name;
2373 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002374#ifdef __BEOS__
2375/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002376 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002377 return NULL;
2378#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002379 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002380 return NULL;
2381 Py_BEGIN_ALLOW_THREADS
2382 sp = getprotobyname(name);
2383 Py_END_ALLOW_THREADS
2384 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002385 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002386 return NULL;
2387 }
2388 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002389#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002390}
2391
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002392PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002393"getprotobyname(name) -> integer\n\
2394\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002395Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002396
Guido van Rossum3901d851996-12-19 16:35:04 +00002397
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002398#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002399/* Create a socket object from a numeric file description.
2400 Useful e.g. if stdin is a socket.
2401 Additional arguments as for socket(). */
2402
2403/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002404static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002405socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002406{
Guido van Rossum73624e91994-10-10 17:59:00 +00002407 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002408 SOCKET_T fd;
2409 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002410 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2411 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002412 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002413 /* Dup the fd so it and the socket can be closed independently */
2414 fd = dup(fd);
2415 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002416 return set_error();
2417 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002418 /* From now on, ignore SIGPIPE and let the error checking
2419 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002420#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002421 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002422#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002423 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002424}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002425
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002426PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002427"fromfd(fd, family, type[, proto]) -> socket object\n\
2428\n\
2429Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002430The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002431
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002432#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002433
Guido van Rossum82a5c661998-07-07 20:45:43 +00002434
Guido van Rossum006bf911996-06-12 04:04:55 +00002435static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002436socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002437{
2438 int x1, x2;
2439
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002440 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002441 return NULL;
2442 }
2443 x2 = (int)ntohs((short)x1);
2444 return PyInt_FromLong(x2);
2445}
2446
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002447PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002448"ntohs(integer) -> integer\n\
2449\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002450Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002451
2452
Guido van Rossum006bf911996-06-12 04:04:55 +00002453static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002454socket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002455{
2456 int x1, x2;
2457
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002458 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002459 return NULL;
2460 }
2461 x2 = ntohl(x1);
2462 return PyInt_FromLong(x2);
2463}
2464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002465PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002466"ntohl(integer) -> integer\n\
2467\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002468Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002469
2470
Guido van Rossum006bf911996-06-12 04:04:55 +00002471static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002472socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002473{
2474 int x1, x2;
2475
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002476 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002477 return NULL;
2478 }
2479 x2 = (int)htons((short)x1);
2480 return PyInt_FromLong(x2);
2481}
2482
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002483PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002484"htons(integer) -> integer\n\
2485\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002486Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002487
2488
Guido van Rossum006bf911996-06-12 04:04:55 +00002489static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002490socket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002491{
2492 int x1, x2;
2493
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002494 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002495 return NULL;
2496 }
2497 x2 = htonl(x1);
2498 return PyInt_FromLong(x2);
2499}
2500
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002501PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002502"htonl(integer) -> integer\n\
2503\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002504Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002505
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002506/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002507
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002508PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002509"inet_aton(string) -> packed 32-bit IP representation\n\
2510\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002511Convert 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 +00002512binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002513
2514static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002515socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002516{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002517#ifndef INADDR_NONE
2518#define INADDR_NONE (-1)
2519#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002520
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002521 /* Have to use inet_addr() instead */
2522 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002523 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002524
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002525 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002526 return NULL;
2527 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002528 packed_addr = inet_addr(ip_addr);
2529
2530 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002531 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002532 "illegal IP address string passed to inet_aton");
2533 return NULL;
2534 }
2535
2536 return PyString_FromStringAndSize((char *) &packed_addr,
2537 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002538}
2539
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002540PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002541"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002542\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002543Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002544
2545static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002546socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002547{
2548 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002549 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002550 struct in_addr packed_addr;
2551
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002552 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002553 return NULL;
2554 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002555
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002556 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002557 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002558 "packed IP wrong length for inet_ntoa");
2559 return NULL;
2560 }
2561
2562 memcpy(&packed_addr, packed_str, addr_len);
2563
2564 return PyString_FromString(inet_ntoa(packed_addr));
2565}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002566
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002567/* Python interface to getaddrinfo(host, port). */
2568
2569/*ARGSUSED*/
2570static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002571socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002572{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002573 struct addrinfo hints, *res;
2574 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002575 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002576 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002577 char *hptr, *pptr;
2578 int family, socktype, protocol, flags;
2579 int error;
2580 PyObject *all = (PyObject *)NULL;
2581 PyObject *single = (PyObject *)NULL;
2582
2583 family = socktype = protocol = flags = 0;
2584 family = PF_UNSPEC;
2585 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2586 &hptr, &pobj, &family, &socktype,
2587 &protocol, &flags)) {
2588 return NULL;
2589 }
2590 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002591 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002592 pptr = pbuf;
2593 } else if (PyString_Check(pobj)) {
2594 pptr = PyString_AsString(pobj);
2595 } else if (pobj == Py_None) {
2596 pptr = (char *)NULL;
2597 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002598 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002599 return NULL;
2600 }
2601 memset(&hints, 0, sizeof(hints));
2602 hints.ai_family = family;
2603 hints.ai_socktype = socktype;
2604 hints.ai_protocol = protocol;
2605 hints.ai_flags = flags;
2606 error = getaddrinfo(hptr, pptr, &hints, &res0);
2607 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002608 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002609 return NULL;
2610 }
2611
2612 if ((all = PyList_New(0)) == NULL)
2613 goto err;
2614 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002615 PyObject *addr =
2616 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2617 if (addr == NULL)
2618 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002619 single = Py_BuildValue("iiisO", res->ai_family,
2620 res->ai_socktype, res->ai_protocol,
2621 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002622 addr);
2623 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002624 if (single == NULL)
2625 goto err;
2626
2627 if (PyList_Append(all, single))
2628 goto err;
2629 Py_XDECREF(single);
2630 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002631 return all;
2632 err:
2633 Py_XDECREF(single);
2634 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002635 if (res0)
2636 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002637 return (PyObject *)NULL;
2638}
2639
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002640PyDoc_STRVAR(getaddrinfo_doc,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002641"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2642 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2643\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002644Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002645
2646/* Python interface to getnameinfo(sa, flags). */
2647
2648/*ARGSUSED*/
2649static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002650socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002651{
2652 PyObject *sa = (PyObject *)NULL;
2653 int flags;
2654 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002655 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002656 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2657 struct addrinfo hints, *res = NULL;
2658 int error;
2659 PyObject *ret = (PyObject *)NULL;
2660
2661 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002662 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002663 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002664 if (!PyArg_ParseTuple(sa, "si|ii",
2665 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002666 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002667 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002668 memset(&hints, 0, sizeof(hints));
2669 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002670 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002671 error = getaddrinfo(hostp, pbuf, &hints, &res);
2672 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002673 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002674 goto fail;
2675 }
2676 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002677 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002678 "sockaddr resolved to multiple addresses");
2679 goto fail;
2680 }
2681 switch (res->ai_family) {
2682 case AF_INET:
2683 {
2684 char *t1;
2685 int t2;
2686 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002687 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002688 "IPv4 sockaddr must be 2 tuple");
2689 goto fail;
2690 }
2691 break;
2692 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002693#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002694 case AF_INET6:
2695 {
2696 struct sockaddr_in6 *sin6;
2697 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2698 sin6->sin6_flowinfo = flowinfo;
2699 sin6->sin6_scope_id = scope_id;
2700 break;
2701 }
2702#endif
2703 }
2704 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2705 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2706 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002707 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002708 goto fail;
2709 }
2710 ret = Py_BuildValue("ss", hbuf, pbuf);
2711
2712fail:
2713 if (res)
2714 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002715 return ret;
2716}
2717
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002718PyDoc_STRVAR(getnameinfo_doc,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002719"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2720\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002721Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002722
Guido van Rossum30a685f1991-06-27 15:51:29 +00002723/* List of functions exported by this module. */
2724
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002725static PyMethodDef socket_methods[] = {
2726 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002727 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002728 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002729 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002730 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002731 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002732 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002733 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002734 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002735 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002736 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002737 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002738#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002739 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002740 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002741#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002742 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002743 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002744 {"ntohl", socket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002745 METH_VARARGS, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002746 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002747 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002748 {"htonl", socket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002749 METH_VARARGS, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002750 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002751 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002752 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002753 METH_VARARGS, inet_ntoa_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002754 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002755 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002756 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002757 METH_VARARGS, getnameinfo_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002758 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002759};
2760
Guido van Rossum30a685f1991-06-27 15:51:29 +00002761
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002762#ifdef RISCOS
2763#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00002764
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002765static int
2766os_init(void)
2767{
2768 _kernel_swi_regs r;
2769
2770 r.r[0] = 0;
2771 _kernel_swi(0x43380, &r, &r);
2772 taskwindow = r.r[0];
2773
2774 return 0;
2775}
2776
2777#endif /* RISCOS */
2778
2779
2780#ifdef MS_WINDOWS
2781#define OS_INIT_DEFINED
2782
2783/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002784
2785static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002786os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002787{
2788 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002789}
2790
2791static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002792os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002793{
2794 WSADATA WSAData;
2795 int ret;
2796 char buf[100];
2797 ret = WSAStartup(0x0101, &WSAData);
2798 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002799 case 0: /* No error */
2800 atexit(os_cleanup);
2801 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002802 case WSASYSNOTREADY:
2803 PyErr_SetString(PyExc_ImportError,
2804 "WSAStartup failed: network not ready");
2805 break;
2806 case WSAVERNOTSUPPORTED:
2807 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002808 PyErr_SetString(
2809 PyExc_ImportError,
2810 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00002811 break;
2812 default:
Tim Peters885d4572001-11-28 20:27:42 +00002813 PyOS_snprintf(buf, sizeof(buf),
2814 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002815 PyErr_SetString(PyExc_ImportError, buf);
2816 break;
2817 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002818 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002819}
2820
Guido van Rossum8d665e61996-06-26 18:22:49 +00002821#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002822
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002823
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002824#ifdef PYOS_OS2
2825#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002826
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002827/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002828
2829static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002830os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002831{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002832#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002833 char reason[64];
2834 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002835
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002836 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002837 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002838 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002839
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002840 PyOS_snprintf(reason, sizeof(reason),
2841 "OS/2 TCP/IP Error# %d", sock_errno());
2842 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002843
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002844 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002845#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002846 /* No need to initialise sockets with GCC/EMX */
2847 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002848#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002849}
2850
2851#endif /* PYOS_OS2 */
2852
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002853
2854#ifndef OS_INIT_DEFINED
2855static int
2856os_init(void)
2857{
2858 return 1; /* Success */
2859}
2860#endif
2861
2862
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002863/* C API table - always add new things to the end for binary
2864 compatibility. */
2865static
2866PySocketModule_APIObject PySocketModuleAPI =
2867{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002868 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002869};
2870
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002871
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002872/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002873
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002874 This module is actually called "_socket", and there's a wrapper
2875 "socket.py" which implements some additional functionality. On some
2876 platforms (e.g. Windows and OS/2), socket.py also implements a
2877 wrapper for the socket type that provides missing functionality such
2878 as makefile(), dup() and fromfd(). The import of "_socket" may fail
2879 with an ImportError exception if os-specific initialization fails.
2880 On Windows, this does WINSOCK initialization. When WINSOCK is
2881 initialized succesfully, a call to WSACleanup() is scheduled to be
2882 made at exit time.
2883*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002884
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002885PyDoc_STRVAR(socket_doc,
Fred Drakea136d492000-08-16 14:18:30 +00002886"Implementation module for socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002887for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002888
Guido van Rossum3886bb61998-12-04 18:50:17 +00002889DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002890init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002891{
Fred Drake4baedc12002-04-01 14:53:37 +00002892 PyObject *m;
Fred Drake4baedc12002-04-01 14:53:37 +00002893
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002894 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002895 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002896
2897 sock_type.ob_type = &PyType_Type;
2898 sock_type.tp_getattro = PyObject_GenericGetAttr;
2899 sock_type.tp_alloc = PyType_GenericAlloc;
2900 sock_type.tp_free = PyObject_Del;
2901 m = Py_InitModule3(PySocket_MODULE_NAME,
2902 socket_methods,
2903 socket_doc);
2904
2905 socket_error = PyErr_NewException("socket.error", NULL, NULL);
2906 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002907 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002908 Py_INCREF(socket_error);
2909 PyModule_AddObject(m, "error", socket_error);
2910 socket_herror = PyErr_NewException("socket.herror",
2911 socket_error, NULL);
2912 if (socket_herror == NULL)
2913 return;
2914 Py_INCREF(socket_herror);
2915 PyModule_AddObject(m, "herror", socket_herror);
2916 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002917 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002918 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002919 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002920 Py_INCREF(socket_gaierror);
2921 PyModule_AddObject(m, "gaierror", socket_gaierror);
2922 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00002923 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002924 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002925 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002926 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00002927 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002928 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002929 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002930
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002931 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00002932 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002933 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
2934 ) != 0)
2935 return;
2936
Guido van Rossum09be4091999-08-09 14:40:40 +00002937 /* Address families (we only support AF_INET and AF_UNIX) */
2938#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00002939 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00002940#endif
Fred Drake4baedc12002-04-01 14:53:37 +00002941 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002942#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00002943 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002944#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002945#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00002946 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002947#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002948#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00002949 /* Amateur Radio AX.25 */
2950 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00002951#endif
2952#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00002953 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002954#endif
2955#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00002956 /* Appletalk DDP */
2957 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00002958#endif
2959#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00002960 /* Amateur radio NetROM */
2961 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00002962#endif
2963#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00002964 /* Multiprotocol bridge */
2965 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00002966#endif
2967#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00002968 /* Reserved for Werner's ATM */
2969 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00002970#endif
2971#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00002972 /* Reserved for X.25 project */
2973 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00002974#endif
2975#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00002976 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00002977#endif
2978#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00002979 /* Amateur Radio X.25 PLP */
2980 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00002981#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002982#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00002983 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
2984 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
2985 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
2986 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
2987 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
2988 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2989 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
2990 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2991 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002992#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002993
2994 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00002995 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
2996 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002997#ifndef __BEOS__
2998/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00002999 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3000 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3001 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003002#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003003
3004#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003005 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003006#endif
3007#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003008 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003009#endif
3010#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003011 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003012#endif
3013#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003014 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003015#endif
3016#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003017 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003018#endif
3019#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003020 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003021#endif
3022#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003023 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003024#endif
3025#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003026 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003027#endif
3028#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003029 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003030#endif
3031#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003032 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003033#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003034#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003035 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003036#endif
3037#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003038 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003039#endif
3040#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003041 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003042#endif
3043#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003044 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003045#endif
3046#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003047 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003048#endif
3049#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003050 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003051#endif
3052#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003053 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003054#endif
3055#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003056 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003057#endif
3058
3059 /* Maximum number of connections for "listen" */
3060#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003061 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003062#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003063 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003064#endif
3065
3066 /* Flags for send, recv */
3067#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003068 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003069#endif
3070#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003071 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003072#endif
3073#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003074 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003075#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003076#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003077 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003078#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003079#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003080 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003081#endif
3082#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003083 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003084#endif
3085#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003086 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003087#endif
3088#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003089 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003090#endif
3091#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003092 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003093#endif
3094#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003095 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003096#endif
3097
3098 /* Protocol level and numbers, usable for [gs]etsockopt */
3099#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003100 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003101#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003102#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003103 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003104#else
Fred Drake4baedc12002-04-01 14:53:37 +00003105 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003106#endif
3107#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003108 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003109#endif
3110#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003111 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003112#endif
3113#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003114 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003115#endif
3116#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003117 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003118#endif
3119#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003120 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003121#endif
3122#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003123 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003124#else
Fred Drake4baedc12002-04-01 14:53:37 +00003125 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003126#endif
3127#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003128 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003129#else
Fred Drake4baedc12002-04-01 14:53:37 +00003130 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003131#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003132#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003133 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003134#else
Fred Drake4baedc12002-04-01 14:53:37 +00003135 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003136#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003137#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003138 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003139#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003140#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003141 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003142#else
Fred Drake4baedc12002-04-01 14:53:37 +00003143 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003144#endif
3145#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003146 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003147#endif
3148#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003149 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003150#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003151#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003152 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003153#endif
3154#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003155 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003156#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003157#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003158 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003159#else
Fred Drake4baedc12002-04-01 14:53:37 +00003160 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003161#endif
3162#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003163 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003164#endif
3165#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003166 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003167#endif
3168#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003169 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003170#else
Fred Drake4baedc12002-04-01 14:53:37 +00003171 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003172#endif
3173#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003174 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003175#endif
3176#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003177 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003178#endif
3179#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003180 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003181#endif
3182#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003183 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003184#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003185#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003186 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003187#endif
3188#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003189 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003190#endif
3191#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003192 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003193#endif
3194#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003195 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003196#endif
3197#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003198 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003199#endif
3200#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003201 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003202#endif
3203#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003204 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003205#endif
3206#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003207 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003208#endif
3209#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003210 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003211#endif
3212#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003213 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003214#endif
3215#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003216 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003217#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003218#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003219 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003220#endif
3221#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003222 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003223#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003224#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003225 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003226#endif
3227#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003228 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003229#endif
3230#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003231 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003232#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003233#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003234 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003235#endif
3236/**/
3237#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003238 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003239#else
Fred Drake4baedc12002-04-01 14:53:37 +00003240 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003241#endif
3242#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003243 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003244#endif
3245
3246 /* Some port configuration */
3247#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003248 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003249#else
Fred Drake4baedc12002-04-01 14:53:37 +00003250 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003251#endif
3252#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003253 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003254#else
Fred Drake4baedc12002-04-01 14:53:37 +00003255 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003256#endif
3257
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003258 /* Some reserved IP v.4 addresses */
3259#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003260 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003261#else
Fred Drake4baedc12002-04-01 14:53:37 +00003262 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003263#endif
3264#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003265 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003266#else
Fred Drake4baedc12002-04-01 14:53:37 +00003267 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003268#endif
3269#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003270 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003271#else
Fred Drake4baedc12002-04-01 14:53:37 +00003272 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003273#endif
3274#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003275 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003276#else
Fred Drake4baedc12002-04-01 14:53:37 +00003277 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003278#endif
3279#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003280 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3281 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003282#else
Fred Drake4baedc12002-04-01 14:53:37 +00003283 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003284#endif
3285#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003286 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3287 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003288#else
Fred Drake4baedc12002-04-01 14:53:37 +00003289 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003290#endif
3291#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003292 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003293#else
Fred Drake4baedc12002-04-01 14:53:37 +00003294 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003295#endif
3296
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003297 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003298#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003299 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003300#endif
3301#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003302 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003303#endif
3304#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003305 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003306#endif
3307#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003308 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003309#endif
3310#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003311 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003312#endif
3313#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003314 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003315#endif
3316#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003317 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003318#endif
3319#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003320 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003321#endif
3322#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003323 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003324#endif
3325#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003326 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003327#endif
3328#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003329 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003330#endif
3331#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003332 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003333#endif
3334#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003335 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003336#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003337#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003338 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3339 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003340#endif
3341#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003342 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3343 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003344#endif
3345#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003346 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003347#endif
3348
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003349 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3350#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003351 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003352#endif
3353#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003354 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003355#endif
3356#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003357 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003358#endif
3359#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003360 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003361#endif
3362#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003363 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003364#endif
3365#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003366 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003367#endif
3368
Guido van Rossum09be4091999-08-09 14:40:40 +00003369 /* TCP options */
3370#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003371 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003372#endif
3373#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003374 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003375#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003376#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003377 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003378#endif
3379#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003380 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003381#endif
3382#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003383 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003384#endif
3385#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003386 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003387#endif
3388#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003389 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003390#endif
3391#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003392 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003393#endif
3394#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003395 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003396#endif
3397#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003398 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003399#endif
3400#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003401 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003402#endif
3403#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003404 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003405#endif
3406
Guido van Rossum09be4091999-08-09 14:40:40 +00003407
3408 /* IPX options */
3409#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003410 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003411#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003412
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003413 /* get{addr,name}info parameters */
3414#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003415 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003416#endif
3417#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003418 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003419#endif
3420#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003421 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003422#endif
3423#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003424 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003425#endif
3426#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003427 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003428#endif
3429#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003430 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003431#endif
3432#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003433 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003434#endif
3435#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003436 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003437#endif
3438#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003439 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003440#endif
3441#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003442 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003443#endif
3444#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003445 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003446#endif
3447#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003448 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003449#endif
3450#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003451 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003452#endif
3453#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003454 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003455#endif
3456#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003457 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003458#endif
3459#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003460 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003461#endif
3462#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003463 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003464#endif
3465#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003466 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003467#endif
3468#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003469 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003470#endif
3471#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003472 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003473#endif
3474#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003475 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003476#endif
3477#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003478 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003479#endif
3480#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003481 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003482#endif
3483#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003484 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003485#endif
3486#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003487 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003488#endif
3489#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003490 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003491#endif
3492#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003493 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003494#endif
3495#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003496 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003497#endif
3498#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003499 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003500#endif
3501#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003502 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003503#endif
3504
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003505 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003506#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003507 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003508#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003509}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003510
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003511
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003512#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003513
3514/* Simplistic emulation code for inet_pton that only works for IPv4 */
3515
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003516int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003517inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003518{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003519 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003520 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003521 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003522 if (packed_addr == INADDR_NONE)
3523 return 0;
3524 memcpy(dst, &packed_addr, 4);
3525 return 1;
3526 }
3527 /* Should set errno to EAFNOSUPPORT */
3528 return -1;
3529}
3530
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003531const char *
3532inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003533{
3534 if (af == AF_INET) {
3535 struct in_addr packed_addr;
3536 if (size < 16)
3537 /* Should set errno to ENOSPC. */
3538 return NULL;
3539 memcpy(&packed_addr, src, sizeof(packed_addr));
3540 return strncpy(dst, inet_ntoa(packed_addr), size);
3541 }
3542 /* Should set errno to EAFNOSUPPORT */
3543 return NULL;
3544}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003545
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003546#endif