blob: ff67c3dac81567a4fe43edecd1414bc9b481a09c [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
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000059/* Socket object documentation */
60static char sock_doc[] =
61"socket([family[, type[, proto]]]) -> socket object\n\
62\n\
63Open a socket of the given type. The family argument specifies the\n\
64address family; it defaults to AF_INET. The type argument specifies\n\
65whether this is a stream (SOCK_STREAM, this is the default)\n\
66or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
67specifying the default protocol. Keyword arguments are accepted.\n\
68\n\
69A socket object represents one endpoint of a network connection.\n\
70\n\
71Methods of socket objects (keyword arguments not allowed):\n\
72\n\
73accept() -- accept a connection, returning new socket and client address\n\
74bind(addr) -- bind the socket to a local address\n\
75close() -- close the socket\n\
76connect(addr) -- connect the socket to a remote address\n\
77connect_ex(addr) -- connect, return an error code instead of an exception\n\
78dup() -- return a new socket object identical to the current one [*]\n\
79fileno() -- return underlying file descriptor\n\
80getpeername() -- return remote address [*]\n\
81getsockname() -- return local address\n\
82getsockopt(level, optname[, buflen]) -- get socket options\n\
83gettimeout() -- return timeout or None\n\
84listen(n) -- start listening for incoming connections\n\
85makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
86recv(buflen[, flags]) -- receive data\n\
87recvfrom(buflen[, flags]) -- receive data and sender's address\n\
88sendall(data[, flags]) -- send all data\n\
89send(data[, flags]) -- send data, may not send all of it\n\
90sendto(data[, flags], addr) -- send data to a given address\n\
91setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
92setsockopt(level, optname, value) -- set socket options\n\
93settimeout(None | float) -- set or clear the timeout\n\
94shutdown(how) -- shut down traffic in one or both directions\n\
95\n\
96 [*] not available on all platforms!";
97
Guido van Rossum73624e91994-10-10 17:59:00 +000098#include "Python.h"
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 Rossum67f7a382002-06-06 21:08:16 +0000449/* For timeout errors */
450static PyObject *
451timeout_err(void)
452{
453 PyObject *v;
454
455#ifdef MS_WINDOWS
456 v = Py_BuildValue("(is)", WSAETIMEDOUT, "Socket operation timed out");
457#else
458 v = Py_BuildValue("(is)", ETIMEDOUT, "Socket operation timed out");
459#endif
460
461 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000462 PyErr_SetObject(socket_error, v);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000463 Py_DECREF(v);
464 }
465
466 return NULL;
467}
468
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000469/* Function to perform the setting of socket blocking mode
470 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000471static int
472internal_setblocking(PySocketSockObject *s, int block)
473{
474#ifndef RISCOS
475#ifndef MS_WINDOWS
476 int delay_flag;
477#endif
478#endif
479
480 Py_BEGIN_ALLOW_THREADS
481#ifdef __BEOS__
482 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000483 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
484 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000485#else
486#ifndef RISCOS
487#ifndef MS_WINDOWS
488#if defined(PYOS_OS2) && !defined(PYCC_GCC)
489 block = !block;
490 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
491#else /* !PYOS_OS2 */
492 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
493 if (block)
494 delay_flag &= (~O_NDELAY);
495 else
496 delay_flag |= O_NDELAY;
497 fcntl(s->sock_fd, F_SETFL, delay_flag);
498#endif /* !PYOS_OS2 */
499#else /* MS_WINDOWS */
500 block = !block;
501 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
502#endif /* MS_WINDOWS */
503#endif /* __BEOS__ */
504#endif /* RISCOS */
505 Py_END_ALLOW_THREADS
506
507 /* Since these don't return anything */
508 return 1;
509}
510
511/* For access to the select module to poll the socket for timeout
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000512 functionality. writing is 1 for writing, 0 for reading.
513 Return value: -1 if error, 0 if not ready, >= 1 if ready.
514 An exception is set when the return value is <= 0 (!). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000515static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000516internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000517{
518 fd_set fds;
519 struct timeval tv;
520 int count;
521
522 /* Construct the arguments to select */
523 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000524 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000525 FD_ZERO(&fds);
526 FD_SET(s->sock_fd, &fds);
527
528 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000529 if (writing)
530 count = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000531 else
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000532 count = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000533
534 /* Check for errors */
535 if (count < 0) {
536 s->errorhandler();
537 return -1;
538 }
539
540 /* Set the error if the timeout has elapsed, i.e, we were not
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000541 polled. */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000542 if (count == 0)
543 timeout_err();
544
545 return count;
546}
547
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000548/* Initialize a new socket object. */
549
550static void
551init_sockobject(PySocketSockObject *s,
552 SOCKET_T fd, int family, int type, int proto)
553{
554#ifdef RISCOS
555 int block = 1;
556#endif
557 s->sock_fd = fd;
558 s->sock_family = family;
559 s->sock_type = type;
560 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000561 s->sock_blocking = 1; /* Start in blocking mode */
562 s->sock_timeout = -1.0; /* Start without timeout */
563
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000564 s->errorhandler = &set_error;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000565#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000566 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000567 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000568#endif
569}
570
571
Guido van Rossum30a685f1991-06-27 15:51:29 +0000572/* Create a new socket object.
573 This just creates the object and initializes it.
574 If the creation fails, return NULL and set an exception (implicit
575 in NEWOBJ()). */
576
Guido van Rossum73624e91994-10-10 17:59:00 +0000577static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000578new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000579{
Guido van Rossum73624e91994-10-10 17:59:00 +0000580 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000581 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000582 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000583 if (s != NULL)
584 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000585 return s;
586}
587
Guido van Rossum30a685f1991-06-27 15:51:29 +0000588
Guido van Rossum48a680c2001-03-02 06:34:14 +0000589/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000590 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000591#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000592PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000593#endif
594
595
Guido van Rossum30a685f1991-06-27 15:51:29 +0000596/* Convert a string specifying a host name or one of a few symbolic
597 names to a numeric IP address. This usually calls gethostbyname()
598 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000599 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000600 an error occurred; then an exception is raised. */
601
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000602static int
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000603setipaddr(char *name, struct sockaddr *addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000605 struct addrinfo hints, *res;
606 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000607
Guido van Rossuma376cc51996-12-05 23:43:35 +0000608 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000609 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610 int siz;
611 memset(&hints, 0, sizeof(hints));
612 hints.ai_family = af;
613 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
614 hints.ai_flags = AI_PASSIVE;
615 error = getaddrinfo(NULL, "0", &hints, &res);
616 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000617 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618 return -1;
619 }
620 switch (res->ai_family) {
621 case AF_INET:
622 siz = 4;
623 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000624#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000625 case AF_INET6:
626 siz = 16;
627 break;
628#endif
629 default:
630 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000631 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000632 "unsupported address family");
633 return -1;
634 }
635 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000636 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000637 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000638 "wildcard resolved to multiple address");
639 return -1;
640 }
641 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
642 freeaddrinfo(res);
643 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000644 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000645 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000646 struct sockaddr_in *sin;
647 if (af != PF_INET && af != PF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000648 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649 "address family mismatched");
650 return -1;
651 }
652 sin = (struct sockaddr_in *)addr_ret;
653 memset((void *) sin, '\0', sizeof(*sin));
654 sin->sin_family = AF_INET;
655#ifdef HAVE_SOCKADDR_SA_LEN
656 sin->sin_len = sizeof(*sin);
657#endif
658 sin->sin_addr.s_addr = INADDR_BROADCAST;
659 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000660 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000661 memset(&hints, 0, sizeof(hints));
662 hints.ai_family = af;
663 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000664#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000665 if (error == EAI_NONAME && af == AF_UNSPEC) {
666 /* On Tru64 V5.1, numeric-to-addr conversion fails
667 if no address family is given. Assume IPv4 for now.*/
668 hints.ai_family = AF_INET;
669 error = getaddrinfo(name, NULL, &hints, &res);
670 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000671#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000672 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000673 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000674 return -1;
675 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000676 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
677 freeaddrinfo(res);
678 switch (addr_ret->sa_family) {
679 case AF_INET:
680 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000681#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000682 case AF_INET6:
683 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000684#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000685 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000686 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000687 return -1;
688 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689}
690
Guido van Rossum30a685f1991-06-27 15:51:29 +0000691
Guido van Rossum30a685f1991-06-27 15:51:29 +0000692/* Create a string object representing an IP address.
693 This is always a string of the form 'dd.dd.dd.dd' (with variable
694 size numbers). */
695
Guido van Rossum73624e91994-10-10 17:59:00 +0000696static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000697makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000698{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000699 char buf[NI_MAXHOST];
700 int error;
701
702 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
703 NI_NUMERICHOST);
704 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000705 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000706 return NULL;
707 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000708 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000709}
710
711
712/* Create an object representing the given socket address,
713 suitable for passing it back to bind(), connect() etc.
714 The family field of the sockaddr structure is inspected
715 to determine what kind of address it really is. */
716
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000717/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000718static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000719makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000720{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000721 if (addrlen == 0) {
722 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000723 Py_INCREF(Py_None);
724 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000725 }
726
Guido van Rossumbcc20741998-08-04 22:53:56 +0000727#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000728 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000729 addr->sa_family = AF_INET;
730#endif
731
Guido van Rossum30a685f1991-06-27 15:51:29 +0000732 switch (addr->sa_family) {
733
734 case AF_INET:
735 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000736 struct sockaddr_in *a;
737 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000738 PyObject *ret = NULL;
739 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000740 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000741 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
742 Py_DECREF(addrobj);
743 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000744 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000745 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000746
Guido van Rossumb6775db1994-08-01 11:34:53 +0000747#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000748 case AF_UNIX:
749 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000750 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000751 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000752 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000753#endif /* AF_UNIX */
754
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000755#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000756 case AF_INET6:
757 {
758 struct sockaddr_in6 *a;
759 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
760 PyObject *ret = NULL;
761 if (addrobj) {
762 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000763 ret = Py_BuildValue("Oiii",
764 addrobj,
765 ntohs(a->sin6_port),
766 a->sin6_flowinfo,
767 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000768 Py_DECREF(addrobj);
769 }
770 return ret;
771 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000772#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000773
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000774#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000775 case AF_PACKET:
776 {
777 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
778 char *ifname = "";
779 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000780 /* need to look up interface name give index */
781 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000782 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000783 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000784 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000785 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000786 return Py_BuildValue("shbhs#",
787 ifname,
788 ntohs(a->sll_protocol),
789 a->sll_pkttype,
790 a->sll_hatype,
791 a->sll_addr,
792 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000793 }
794#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000795
Guido van Rossum30a685f1991-06-27 15:51:29 +0000796 /* More cases here... */
797
798 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000799 /* If we don't know the address family, don't raise an
800 exception -- return it as a tuple. */
801 return Py_BuildValue("is#",
802 addr->sa_family,
803 addr->sa_data,
804 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000805
Guido van Rossum30a685f1991-06-27 15:51:29 +0000806 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807}
808
Guido van Rossum30a685f1991-06-27 15:51:29 +0000809
810/* Parse a socket address argument according to the socket object's
811 address family. Return 1 if the address was in the proper format,
812 0 of not. The address is returned through addr_ret, its length
813 through len_ret. */
814
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000815static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000816getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000817 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000818{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000819 switch (s->sock_family) {
820
Guido van Rossumb6775db1994-08-01 11:34:53 +0000821#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000822 case AF_UNIX:
823 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000824 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000825 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000827 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000828 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000830 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000831 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000832 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833 return 0;
834 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000835 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000836 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000837 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000838 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000839 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000840 return 1;
841 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000842#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000843
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844 case AF_INET:
845 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000846 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000847 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000848 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000849 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000850 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000851 PyErr_Format(
852 PyExc_TypeError,
853 "getsockaddrarg: "
854 "AF_INET address must be tuple, not %.500s",
855 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000856 return 0;
857 }
858 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000860 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000861 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000862 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000863 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000864 *addr_ret = (struct sockaddr *) addr;
865 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000866 return 1;
867 }
868
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000869#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000870 case AF_INET6:
871 {
872 struct sockaddr_in6* addr;
873 char *host;
874 int port, flowinfo, scope_id;
875 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
876 flowinfo = scope_id = 0;
877 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000878 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000879 return 0;
880 }
881 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
882 return 0;
883 addr->sin6_family = s->sock_family;
884 addr->sin6_port = htons((short)port);
885 addr->sin6_flowinfo = flowinfo;
886 addr->sin6_scope_id = scope_id;
887 *addr_ret = (struct sockaddr *) addr;
888 *len_ret = sizeof *addr;
889 return 1;
890 }
891#endif
892
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000893#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000894 case AF_PACKET:
895 {
896 struct sockaddr_ll* addr;
897 struct ifreq ifr;
898 char *interfaceName;
899 int protoNumber;
900 int hatype = 0;
901 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000902 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000903
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000904 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
905 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000906 return 0;
907 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
908 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000909 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000910 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000911 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000912 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000913 addr = &(s->sock_addr.ll);
914 addr->sll_family = AF_PACKET;
915 addr->sll_protocol = htons((short)protoNumber);
916 addr->sll_ifindex = ifr.ifr_ifindex;
917 addr->sll_pkttype = pkttype;
918 addr->sll_hatype = hatype;
919 *addr_ret = (struct sockaddr *) addr;
920 *len_ret = sizeof *addr;
921 return 1;
922 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000923#endif
924
Guido van Rossum30a685f1991-06-27 15:51:29 +0000925 /* More cases here... */
926
927 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000928 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000929 return 0;
930
931 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000932}
933
Guido van Rossum30a685f1991-06-27 15:51:29 +0000934
Guido van Rossum48a680c2001-03-02 06:34:14 +0000935/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000936 Return 1 if the family is known, 0 otherwise. The length is returned
937 through len_ret. */
938
939static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000940getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000941{
942 switch (s->sock_family) {
943
Guido van Rossumb6775db1994-08-01 11:34:53 +0000944#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000945 case AF_UNIX:
946 {
947 *len_ret = sizeof (struct sockaddr_un);
948 return 1;
949 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000950#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000951
952 case AF_INET:
953 {
954 *len_ret = sizeof (struct sockaddr_in);
955 return 1;
956 }
957
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000958#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000959 case AF_INET6:
960 {
961 *len_ret = sizeof (struct sockaddr_in6);
962 return 1;
963 }
964#endif
965
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000966#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000967 case AF_PACKET:
968 {
969 *len_ret = sizeof (struct sockaddr_ll);
970 return 1;
971 }
972#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000973
Guido van Rossum710e1df1992-06-12 10:39:36 +0000974 /* More cases here... */
975
976 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000977 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000978 return 0;
979
980 }
981}
982
983
Guido van Rossum30a685f1991-06-27 15:51:29 +0000984/* s.accept() method */
985
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000987sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000988{
989 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000990 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000991 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000992 PyObject *sock = NULL;
993 PyObject *addr = NULL;
994 PyObject *res = NULL;
995
Guido van Rossum710e1df1992-06-12 10:39:36 +0000996 if (!getsockaddrlen(s, &addrlen))
997 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000998 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000999
1000 errno = 0; /* Reset indicator for use with timeout behavior */
1001
Guido van Rossum73624e91994-10-10 17:59:00 +00001002 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001003 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001004 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001005
1006 if (s->sock_timeout >= 0.0) {
1007#ifdef MS_WINDOWS
1008 if (newfd == INVALID_SOCKET)
1009 if (!s->sock_blocking)
1010 return s->errorhandler();
1011 /* Check if we have a true failure
1012 for a blocking socket */
1013 if (errno != WSAEWOULDBLOCK)
1014 return s->errorhandler();
1015#else
1016 if (newfd < 0) {
1017 if (!s->sock_blocking)
1018 return s->errorhandler();
1019 /* Check if we have a true failure
1020 for a blocking socket */
1021 if (errno != EAGAIN && errno != EWOULDBLOCK)
1022 return s->errorhandler();
1023 }
1024#endif
1025
1026 /* try waiting the timeout period */
1027 if (internal_select(s, 0) <= 0)
1028 return NULL;
1029
1030 Py_BEGIN_ALLOW_THREADS
1031 newfd = accept(s->sock_fd,
1032 (struct sockaddr *)addrbuf,
1033 &addrlen);
1034 Py_END_ALLOW_THREADS
1035 }
1036
1037 /* At this point, we really have an error, whether using timeout
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001038 behavior or regular socket behavior */
Fred Drakea04eaad2000-06-30 02:46:07 +00001039#ifdef MS_WINDOWS
1040 if (newfd == INVALID_SOCKET)
1041#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001042 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001043#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001044 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001045
Guido van Rossum30a685f1991-06-27 15:51:29 +00001046 /* Create the new object with unspecified family,
1047 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001048 sock = (PyObject *) new_sockobject(newfd,
1049 s->sock_family,
1050 s->sock_type,
1051 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001052
Barry Warsaw752300b1997-01-03 17:18:10 +00001053 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001054 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001055 goto finally;
1056 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001057 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001058 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001059 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001060 goto finally;
1061
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001062 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001063
Guido van Rossum67f7a382002-06-06 21:08:16 +00001064finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001065 Py_XDECREF(sock);
1066 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001067 return res;
1068}
1069
Guido van Rossum82a5c661998-07-07 20:45:43 +00001070static char accept_doc[] =
1071"accept() -> (socket object, address info)\n\
1072\n\
1073Wait for an incoming connection. Return a new socket representing the\n\
1074connection, and the address of the client. For IP sockets, the address\n\
1075info is a pair (hostaddr, port).";
1076
Guido van Rossume4485b01994-09-07 14:32:49 +00001077/* s.setblocking(1 | 0) method */
1078
Guido van Rossum73624e91994-10-10 17:59:00 +00001079static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001080sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001081{
1082 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001083
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001084 block = PyInt_AsLong(arg);
1085 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001086 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001087
1088 s->sock_blocking = block;
Guido van Rossume8008f02002-06-07 03:36:20 +00001089 s->sock_timeout = -1.0; /* Always clear the timeout */
1090 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001091
Guido van Rossum73624e91994-10-10 17:59:00 +00001092 Py_INCREF(Py_None);
1093 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001094}
Guido van Rossume4485b01994-09-07 14:32:49 +00001095
Guido van Rossum82a5c661998-07-07 20:45:43 +00001096static char setblocking_doc[] =
1097"setblocking(flag)\n\
1098\n\
1099Set the socket to blocking (flag is true) or non-blocking (false).\n\
1100This uses the FIONBIO ioctl with the O_NDELAY flag.";
1101
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001102/* s.settimeout(None | float) method.
1103 Causes an exception to be raised when the given time has
1104 elapsed when performing a blocking socket operation. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001105static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001106sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001107{
1108 double value;
1109
1110 if (arg == Py_None)
1111 value = -1.0;
1112 else {
1113 value = PyFloat_AsDouble(arg);
1114 if (value < 0.0) {
1115 if (!PyErr_Occurred())
1116 PyErr_SetString(PyExc_ValueError,
1117 "Invalid timeout value");
1118 return NULL;
1119 }
1120 }
1121
1122 s->sock_timeout = value;
1123
1124 /* The semantics of setting socket timeouts are:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001125 If you settimeout(!=None):
1126 The actual socket gets put in non-blocking mode and the select
1127 is used to control timeouts.
1128 Else if you settimeout(None) [then value is -1.0]:
1129 The old behavior is used AND automatically, the socket is set
1130 to blocking mode. That means that someone who was doing
1131 non-blocking stuff before, sets a timeout, and then unsets
1132 one, will have to call setblocking(0) again if he wants
1133 non-blocking stuff. This makes sense because timeout stuff is
1134 blocking by nature. */
Guido van Rossumb9e916a2002-06-07 01:42:47 +00001135 internal_setblocking(s, value < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001136
1137 s->sock_blocking = 1; /* Always negate setblocking() */
1138
1139 Py_INCREF(Py_None);
1140 return Py_None;
1141}
1142
1143static char settimeout_doc[] =
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001144"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001145\n\
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001146Set a timeout on blocking socket operations. 'timeout' can be a float,\n\
1147giving seconds, or None. Setting a timeout of None disables timeout.";
Guido van Rossum67f7a382002-06-06 21:08:16 +00001148
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001149/* s.gettimeout() method.
1150 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001151static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001152sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001153{
1154 if (s->sock_timeout < 0.0) {
1155 Py_INCREF(Py_None);
1156 return Py_None;
1157 }
1158 else
1159 return PyFloat_FromDouble(s->sock_timeout);
1160}
1161
1162static char gettimeout_doc[] =
1163"gettimeout()\n\
1164\n\
1165Returns the timeout in floating seconds associated with socket \n\
1166operations. A timeout of None indicates that timeouts on socket \n\
1167operations are disabled.";
Guido van Rossume4485b01994-09-07 14:32:49 +00001168
Guido van Rossum48a680c2001-03-02 06:34:14 +00001169#ifdef RISCOS
1170/* s.sleeptaskw(1 | 0) method */
1171
1172static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001173sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001174{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001175 int block;
1176 int delay_flag;
1177 if (!PyArg_Parse(args, "i", &block))
1178 return NULL;
1179 Py_BEGIN_ALLOW_THREADS
1180 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1181 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001182
Guido van Rossum67f7a382002-06-06 21:08:16 +00001183 Py_INCREF(Py_None);
1184 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001185}
1186static char sleeptaskw_doc[] =
1187"sleeptaskw(flag)\n\
1188\n\
1189Allow sleeps in taskwindows.";
1190#endif
1191
1192
Guido van Rossumaee08791992-09-08 09:05:33 +00001193/* s.setsockopt() method.
1194 With an integer third argument, sets an integer option.
1195 With a string third argument, sets an option from a buffer;
1196 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001197
Guido van Rossum73624e91994-10-10 17:59:00 +00001198static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001199sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001200{
1201 int level;
1202 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001203 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001204 char *buf;
1205 int buflen;
1206 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001207
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001208 if (PyArg_ParseTuple(args, "iii:setsockopt",
1209 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001210 buf = (char *) &flag;
1211 buflen = sizeof flag;
1212 }
1213 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001214 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001215 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1216 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001217 return NULL;
1218 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001219 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001220 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001221 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001222 Py_INCREF(Py_None);
1223 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001224}
1225
Guido van Rossum82a5c661998-07-07 20:45:43 +00001226static char setsockopt_doc[] =
1227"setsockopt(level, option, value)\n\
1228\n\
1229Set a socket option. See the Unix manual for level and option.\n\
1230The value argument can either be an integer or a string.";
1231
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001232
Guido van Rossumaee08791992-09-08 09:05:33 +00001233/* s.getsockopt() method.
1234 With two arguments, retrieves an integer option.
1235 With a third integer argument, retrieves a string buffer of that size;
1236 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001237
Guido van Rossum73624e91994-10-10 17:59:00 +00001238static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001239sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001240{
1241 int level;
1242 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001243 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001244 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001245 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001246
Guido van Rossumbcc20741998-08-04 22:53:56 +00001247#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001248 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001249 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001250 return NULL;
1251#else
1252
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001253 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1254 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001255 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001256
Guido van Rossumbe32c891996-06-20 16:25:29 +00001257 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001258 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001259 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001260 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001261 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001262 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001263 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001264 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001265 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001266 if (buflen <= 0 || buflen > 1024) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001267 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001268 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001269 return NULL;
1270 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001271 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001272 if (buf == NULL)
1273 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001274 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001275 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001276 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001277 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001278 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001279 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001280 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001281 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001282#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001283}
1284
Guido van Rossum82a5c661998-07-07 20:45:43 +00001285static char getsockopt_doc[] =
1286"getsockopt(level, option[, buffersize]) -> value\n\
1287\n\
1288Get a socket option. See the Unix manual for level and option.\n\
1289If a nonzero buffersize argument is given, the return value is a\n\
1290string of that length; otherwise it is an integer.";
1291
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001292
Fred Drake728819a2000-07-01 03:40:12 +00001293/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001294
Guido van Rossum73624e91994-10-10 17:59:00 +00001295static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001296sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001297{
1298 struct sockaddr *addr;
1299 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001300 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001301
Fred Drake728819a2000-07-01 03:40:12 +00001302 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001304 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001305 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001306 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001307 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001308 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001309 Py_INCREF(Py_None);
1310 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001311}
1312
Guido van Rossum82a5c661998-07-07 20:45:43 +00001313static char bind_doc[] =
1314"bind(address)\n\
1315\n\
1316Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001317pair (host, port); the host must refer to the local host. For raw packet\n\
1318sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001319
Guido van Rossum30a685f1991-06-27 15:51:29 +00001320
1321/* s.close() method.
1322 Set the file descriptor to -1 so operations tried subsequently
1323 will surely fail. */
1324
Guido van Rossum73624e91994-10-10 17:59:00 +00001325static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001326sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001327{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001328 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001329
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001330 if ((fd = s->sock_fd) != -1) {
1331 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001332 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001333 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001334 Py_END_ALLOW_THREADS
1335 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001336 Py_INCREF(Py_None);
1337 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001338}
1339
Guido van Rossum82a5c661998-07-07 20:45:43 +00001340static char close_doc[] =
1341"close()\n\
1342\n\
1343Close the socket. It cannot be used after this call.";
1344
Guido van Rossum30a685f1991-06-27 15:51:29 +00001345
Fred Drake728819a2000-07-01 03:40:12 +00001346/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001347
Guido van Rossum73624e91994-10-10 17:59:00 +00001348static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001349sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001350{
1351 struct sockaddr *addr;
1352 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001353 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001354
Fred Drake728819a2000-07-01 03:40:12 +00001355 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001356 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001357
1358 errno = 0; /* Reset the err indicator for use with timeouts */
1359
Guido van Rossum73624e91994-10-10 17:59:00 +00001360 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001361 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001362 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001363
1364 if (s->sock_timeout >= 0.0) {
1365 if (res < 0) {
1366 /* Return if we're already connected */
1367#ifdef MS_WINDOWS
1368 if (errno == WSAEINVAL || errno == WSAEISCONN)
1369#else
1370 if (errno == EISCONN)
1371#endif
1372 goto connected;
1373
1374 /* Check if we have an error */
1375 if (!s->sock_blocking)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001376 return s->errorhandler();
1377 /* Check if we have a true failure
1378 for a blocking socket */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001379#ifdef MS_WINDOWS
1380 if (errno != WSAEWOULDBLOCK)
1381#else
1382 if (errno != EINPROGRESS && errno != EALREADY &&
1383 errno != EWOULDBLOCK)
1384#endif
1385 return s->errorhandler();
1386 }
1387
1388 /* Check if we're ready for the connect via select */
1389 if (internal_select(s, 1) <= 0)
1390 return NULL;
1391
1392 /* Complete the connection now */
1393 Py_BEGIN_ALLOW_THREADS
1394 res = connect(s->sock_fd, addr, addrlen);
1395 Py_END_ALLOW_THREADS
1396 }
1397
Guido van Rossumff4949e1992-08-05 19:58:53 +00001398 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001399 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001400
1401connected:
Guido van Rossum73624e91994-10-10 17:59:00 +00001402 Py_INCREF(Py_None);
1403 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001404}
1405
Guido van Rossum82a5c661998-07-07 20:45:43 +00001406static char connect_doc[] =
1407"connect(address)\n\
1408\n\
1409Connect the socket to a remote address. For IP sockets, the address\n\
1410is a pair (host, port).";
1411
Guido van Rossum30a685f1991-06-27 15:51:29 +00001412
Fred Drake728819a2000-07-01 03:40:12 +00001413/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001414
1415static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001416sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001417{
1418 struct sockaddr *addr;
1419 int addrlen;
1420 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001421
Fred Drake728819a2000-07-01 03:40:12 +00001422 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001423 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001424
1425 errno = 0; /* Reset the err indicator for use with timeouts */
1426
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001427 Py_BEGIN_ALLOW_THREADS
1428 res = connect(s->sock_fd, addr, addrlen);
1429 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001430
1431 if (s->sock_timeout >= 0.0) {
1432 if (res < 0) {
1433 /* Return if we're already connected */
1434#ifdef MS_WINDOWS
1435 if (errno == WSAEINVAL || errno == WSAEISCONN)
1436#else
1437 if (errno == EISCONN)
1438#endif
1439 goto conex_finally;
1440
1441 /* Check if we have an error */
1442 if (!s->sock_blocking)
1443 goto conex_finally;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001444 /* Check if we have a true failure
1445 for a blocking socket */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001446#ifdef MS_WINDOWS
1447 if (errno != WSAEWOULDBLOCK)
1448#else
1449 if (errno != EINPROGRESS && errno != EALREADY &&
1450 errno != EWOULDBLOCK)
1451#endif
1452 goto conex_finally;
1453 }
1454
1455 /* Check if we're ready for the connect via select */
1456 if (internal_select(s, 1) <= 0)
1457 return NULL;
1458
1459 /* Complete the connection now */
1460 Py_BEGIN_ALLOW_THREADS
1461 res = connect(s->sock_fd, addr, addrlen);
1462 Py_END_ALLOW_THREADS
1463 }
1464
Guido van Rossum1790e652002-06-07 19:55:29 +00001465conex_finally:
Tim Petersc32410a2001-10-30 01:26:49 +00001466 if (res != 0) {
1467#ifdef MS_WINDOWS
1468 res = WSAGetLastError();
1469#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001470 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001471#endif
1472 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001473
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001474 return PyInt_FromLong((long) res);
1475}
1476
Guido van Rossum82a5c661998-07-07 20:45:43 +00001477static char connect_ex_doc[] =
1478"connect_ex(address)\n\
1479\n\
1480This is like connect(address), but returns an error code (the errno value)\n\
1481instead of raising an exception when an error occurs.";
1482
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001483
Guido van Rossumed233a51992-06-23 09:07:03 +00001484/* s.fileno() method */
1485
Guido van Rossum73624e91994-10-10 17:59:00 +00001486static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001487sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001488{
Fred Drakea04eaad2000-06-30 02:46:07 +00001489#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001490 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001491#else
1492 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1493#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001494}
1495
Guido van Rossum82a5c661998-07-07 20:45:43 +00001496static char fileno_doc[] =
1497"fileno() -> integer\n\
1498\n\
1499Return the integer file descriptor of the socket.";
1500
Guido van Rossumed233a51992-06-23 09:07:03 +00001501
Guido van Rossumbe32c891996-06-20 16:25:29 +00001502#ifndef NO_DUP
1503/* s.dup() method */
1504
1505static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001506sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001507{
Fred Drakea04eaad2000-06-30 02:46:07 +00001508 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001509 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001510
Guido van Rossumbe32c891996-06-20 16:25:29 +00001511 newfd = dup(s->sock_fd);
1512 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001513 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001514 sock = (PyObject *) new_sockobject(newfd,
1515 s->sock_family,
1516 s->sock_type,
1517 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001518 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001519 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001520 return sock;
1521}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001522
1523static char dup_doc[] =
1524"dup() -> socket object\n\
1525\n\
1526Return a new socket object connected to the same system resource.";
1527
Guido van Rossumbe32c891996-06-20 16:25:29 +00001528#endif
1529
1530
Guido van Rossumc89705d1992-11-26 08:54:07 +00001531/* s.getsockname() method */
1532
Guido van Rossum73624e91994-10-10 17:59:00 +00001533static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001534sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001535{
1536 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001537 int res;
1538 socklen_t addrlen;
1539
Guido van Rossumc89705d1992-11-26 08:54:07 +00001540 if (!getsockaddrlen(s, &addrlen))
1541 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001542 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001543 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001544 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001545 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001546 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001547 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001548 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001549}
1550
Guido van Rossum82a5c661998-07-07 20:45:43 +00001551static char getsockname_doc[] =
1552"getsockname() -> address info\n\
1553\n\
1554Return the address of the local endpoint. For IP sockets, the address\n\
1555info is a pair (hostaddr, port).";
1556
Guido van Rossumc89705d1992-11-26 08:54:07 +00001557
Guido van Rossumb6775db1994-08-01 11:34:53 +00001558#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001559/* s.getpeername() method */
1560
Guido van Rossum73624e91994-10-10 17:59:00 +00001561static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001562sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001563{
1564 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001565 int res;
1566 socklen_t addrlen;
1567
Guido van Rossumc89705d1992-11-26 08:54:07 +00001568 if (!getsockaddrlen(s, &addrlen))
1569 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001570 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001571 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001572 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001573 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001574 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001575 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001576 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001577}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001578
1579static char getpeername_doc[] =
1580"getpeername() -> address info\n\
1581\n\
1582Return the address of the remote endpoint. For IP sockets, the address\n\
1583info is a pair (hostaddr, port).";
1584
Guido van Rossumb6775db1994-08-01 11:34:53 +00001585#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001586
1587
Guido van Rossum30a685f1991-06-27 15:51:29 +00001588/* s.listen(n) method */
1589
Guido van Rossum73624e91994-10-10 17:59:00 +00001590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001591sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001592{
1593 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001594 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001595
1596 backlog = PyInt_AsLong(arg);
1597 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001598 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001599 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001600 if (backlog < 1)
1601 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001602 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001603 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001604 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001605 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001606 Py_INCREF(Py_None);
1607 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001608}
1609
Guido van Rossum82a5c661998-07-07 20:45:43 +00001610static char listen_doc[] =
1611"listen(backlog)\n\
1612\n\
1613Enable a server to accept connections. The backlog argument must be at\n\
1614least 1; it specifies the number of unaccepted connection that the system\n\
1615will allow before refusing new connections.";
1616
1617
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001618#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001619/* s.makefile(mode) method.
1620 Create a new open file object referring to a dupped version of
1621 the socket's file descriptor. (The dup() call is necessary so
1622 that the open file and socket objects may be closed independent
1623 of each other.)
1624 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1625
Guido van Rossum73624e91994-10-10 17:59:00 +00001626static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001627sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001628{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001629 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001630 char *mode = "r";
1631 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001632#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001633 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001634#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001635 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001636#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001637 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001638 PyObject *f;
1639
Guido van Rossum43713e52000-02-29 13:59:29 +00001640 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001641 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001642#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001643 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1644 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001645#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001646 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001647#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001648 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001649 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001650 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001651 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001652 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001653#ifdef USE_GUSI2
1654 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001655 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001656 bufsize = 0;
1657#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001658 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1659 if (f != NULL)
1660 PyFile_SetBufSize(f, bufsize);
1661 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001662}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001663
1664static char makefile_doc[] =
1665"makefile([mode[, buffersize]]) -> file object\n\
1666\n\
1667Return a regular file object corresponding to the socket.\n\
1668The mode and buffersize arguments are as for the built-in open() function.";
1669
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001670#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001671
Guido van Rossum48a680c2001-03-02 06:34:14 +00001672
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001673/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001674
Guido van Rossum73624e91994-10-10 17:59:00 +00001675static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001676sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001677{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001678 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001679 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001680
Guido van Rossum43713e52000-02-29 13:59:29 +00001681 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001682 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001683
1684 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001685 PyErr_SetString(PyExc_ValueError,
1686 "negative buffersize in connect");
1687 return NULL;
1688 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001689
Guido van Rossum73624e91994-10-10 17:59:00 +00001690 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001691 if (buf == NULL)
1692 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001693
1694 if (s->sock_timeout >= 0.0) {
1695 if (s->sock_blocking) {
1696 if (internal_select(s, 0) <= 0)
1697 return NULL;
1698 }
1699 }
1700
Guido van Rossum73624e91994-10-10 17:59:00 +00001701 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001702 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001703 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001704
Guido van Rossum7c53b771995-09-13 18:39:47 +00001705 if (n < 0) {
1706 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001707 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001708 }
Tim Peters5de98422002-04-27 18:44:32 +00001709 if (n != len)
1710 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001711 return buf;
1712}
1713
Guido van Rossum82a5c661998-07-07 20:45:43 +00001714static char recv_doc[] =
1715"recv(buffersize[, flags]) -> data\n\
1716\n\
1717Receive up to buffersize bytes from the socket. For the optional flags\n\
1718argument, see the Unix manual. When no data is available, block until\n\
1719at least one byte is available or until the remote end is closed. When\n\
1720the remote end is closed and all data is read, return the empty string.";
1721
Guido van Rossum30a685f1991-06-27 15:51:29 +00001722
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001723/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001724
Guido van Rossum73624e91994-10-10 17:59:00 +00001725static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001726sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001727{
1728 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001729 PyObject *buf = NULL;
1730 PyObject *addr = NULL;
1731 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001732 int len, n, flags = 0;
1733 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001734
Guido van Rossum43713e52000-02-29 13:59:29 +00001735 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001736 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001737
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001738 if (!getsockaddrlen(s, &addrlen))
1739 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001740 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001741 if (buf == NULL)
1742 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001743
1744 if (s->sock_timeout >= 0.0) {
1745 if (s->sock_blocking) {
1746 if (internal_select(s, 0) <= 0)
1747 return NULL;
1748 }
1749 }
1750
Guido van Rossum73624e91994-10-10 17:59:00 +00001751 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001752 memset(addrbuf, 0, addrlen);
1753 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001754#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001755#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001756 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001757#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001758 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001759#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001760#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001761 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001762#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001763 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001764 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001765
Guido van Rossum7c53b771995-09-13 18:39:47 +00001766 if (n < 0) {
1767 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001768 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001769 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001770
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001771 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001772 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001773
Guido van Rossum67f7a382002-06-06 21:08:16 +00001774 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001775 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001776 goto finally;
1777
Guido van Rossum73624e91994-10-10 17:59:00 +00001778 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001779
1780finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001781 Py_XDECREF(addr);
1782 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001783 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001784}
1785
Guido van Rossum82a5c661998-07-07 20:45:43 +00001786static char recvfrom_doc[] =
1787"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1788\n\
1789Like recv(buffersize, flags) but also return the sender's address info.";
1790
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001791/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001792
Guido van Rossum73624e91994-10-10 17:59:00 +00001793static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001794sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001795{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001796 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001797 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001798
Guido van Rossum43713e52000-02-29 13:59:29 +00001799 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001800 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001801
1802 if (s->sock_timeout >= 0.0) {
1803 if (s->sock_blocking) {
1804 if (internal_select(s, 1) <= 0)
1805 return NULL;
1806 }
1807 }
1808
Guido van Rossum73624e91994-10-10 17:59:00 +00001809 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001810 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001811 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001812
Guido van Rossum30a685f1991-06-27 15:51:29 +00001813 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001814 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001815 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001816}
1817
Guido van Rossum82a5c661998-07-07 20:45:43 +00001818static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001819"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001820\n\
1821Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001822argument, see the Unix manual. Return the number of bytes\n\
1823sent; this may be less than len(data) if the network is busy.";
1824
1825
1826/* s.sendall(data [,flags]) method */
1827
1828static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001829sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001830{
1831 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001832 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001833
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001834 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1835 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001836
1837 if (s->sock_timeout >= 0.0) {
1838 if (s->sock_blocking) {
Guido van Rossumb9e916a2002-06-07 01:42:47 +00001839 if (internal_select(s, 1) <= 0)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001840 return NULL;
1841 }
1842 }
1843
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001844 Py_BEGIN_ALLOW_THREADS
1845 do {
1846 n = send(s->sock_fd, buf, len, flags);
1847 if (n < 0)
1848 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001849 buf += n;
1850 len -= n;
1851 } while (len > 0);
1852 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001853
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001854 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001855 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001856
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001857 Py_INCREF(Py_None);
1858 return Py_None;
1859}
1860
1861static char sendall_doc[] =
1862"sendall(data[, flags])\n\
1863\n\
1864Send a data string to the socket. For the optional flags\n\
1865argument, see the Unix manual. This calls send() repeatedly\n\
1866until all data is sent. If an error occurs, it's impossible\n\
1867to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001868
Guido van Rossum30a685f1991-06-27 15:51:29 +00001869
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001870/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001871
Guido van Rossum73624e91994-10-10 17:59:00 +00001872static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001873sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001874{
Guido van Rossum73624e91994-10-10 17:59:00 +00001875 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001876 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001877 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001878 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001879
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001880 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001881 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001882 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001883 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1884 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001885 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001886 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001887
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001888 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001889 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001890
1891 if (s->sock_timeout >= 0.0) {
1892 if (s->sock_blocking) {
1893 if (internal_select(s, 1) <= 0)
1894 return NULL;
1895 }
1896 }
1897
Guido van Rossum73624e91994-10-10 17:59:00 +00001898 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001899 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001900 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001901
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001902 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001903 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001904 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001905}
1906
Guido van Rossum82a5c661998-07-07 20:45:43 +00001907static char sendto_doc[] =
1908"sendto(data[, flags], address)\n\
1909\n\
1910Like send(data, flags) but allows specifying the destination address.\n\
1911For IP sockets, the address is a pair (hostaddr, port).";
1912
Guido van Rossum30a685f1991-06-27 15:51:29 +00001913
1914/* s.shutdown(how) method */
1915
Guido van Rossum73624e91994-10-10 17:59:00 +00001916static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001917sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001918{
1919 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001920 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001921
1922 how = PyInt_AsLong(arg);
1923 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001924 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001925 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001926 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001927 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001928 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001929 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001930 Py_INCREF(Py_None);
1931 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001932}
1933
Guido van Rossum82a5c661998-07-07 20:45:43 +00001934static char shutdown_doc[] =
1935"shutdown(flag)\n\
1936\n\
1937Shut down the reading side of the socket (flag == 0), the writing side\n\
1938of the socket (flag == 1), or both ends (flag == 2).";
1939
Guido van Rossum30a685f1991-06-27 15:51:29 +00001940
1941/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001942
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001943static PyMethodDef sock_methods[] = {
1944 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001945 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001946 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001947 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001948 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001949 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001950 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001951 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001952 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001953 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001954#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001955 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001956 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001957#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001958 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001959 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001960#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001961 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001962 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001963#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001964 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001965 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001966 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001967 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001968 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001969 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001970#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001971 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001972 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001973#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001974 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001975 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001976 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001977 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001978 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001979 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001980 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001981 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001982 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001983 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001984 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001985 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001986 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001987 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001988 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001989 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001990 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001991 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001992 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001993 shutdown_doc},
1994#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001995 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001996 sleeptaskw_doc},
1997#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001998 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001999};
2000
Guido van Rossum30a685f1991-06-27 15:51:29 +00002001
Guido van Rossum73624e91994-10-10 17:59:00 +00002002/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002003 First close the file description. */
2004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002005static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002006sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002007{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002008 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002009 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002010 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002011}
2012
Guido van Rossum30a685f1991-06-27 15:51:29 +00002013
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002014static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002015sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002016{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002017 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002018#if SIZEOF_SOCKET_T > SIZEOF_LONG
2019 if (s->sock_fd > LONG_MAX) {
2020 /* this can occur on Win64, and actually there is a special
2021 ugly printf formatter for decimal pointer length integer
2022 printing, only bother if necessary*/
2023 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002024 "no printf formatter to display "
2025 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002026 return NULL;
2027 }
2028#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002029 PyOS_snprintf(
2030 buf, sizeof(buf),
2031 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2032 (long)s->sock_fd, s->sock_family,
2033 s->sock_type,
2034 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002035 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002036}
2037
2038
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002039/* Create a new, uninitialized socket object. */
2040
2041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002042sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002043{
2044 PyObject *new;
2045
2046 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002047 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002048 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002049 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002050 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002051 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002052 return new;
2053}
2054
2055
2056/* Initialize a new socket object. */
2057
2058/*ARGSUSED*/
2059static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002060sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002061{
2062 PySocketSockObject *s = (PySocketSockObject *)self;
2063 SOCKET_T fd;
2064 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2065 static char *keywords[] = {"family", "type", "proto", 0};
2066
2067 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2068 "|iii:socket", keywords,
2069 &family, &type, &proto))
2070 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002071
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002072 Py_BEGIN_ALLOW_THREADS
2073 fd = socket(family, type, proto);
2074 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002075
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002076#ifdef MS_WINDOWS
2077 if (fd == INVALID_SOCKET)
2078#else
2079 if (fd < 0)
2080#endif
2081 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002082 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002083 return -1;
2084 }
2085 init_sockobject(s, fd, family, type, proto);
2086 /* From now on, ignore SIGPIPE and let the error checking
2087 do the work. */
2088#ifdef SIGPIPE
2089 (void) signal(SIGPIPE, SIG_IGN);
2090#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002091
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002092 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002093
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002094}
2095
2096
Guido van Rossumb6775db1994-08-01 11:34:53 +00002097/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002098
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002099static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002100 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002101 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002102 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002103 sizeof(PySocketSockObject), /* tp_basicsize */
2104 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002105 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002106 0, /* tp_print */
2107 0, /* tp_getattr */
2108 0, /* tp_setattr */
2109 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002110 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002111 0, /* tp_as_number */
2112 0, /* tp_as_sequence */
2113 0, /* tp_as_mapping */
2114 0, /* tp_hash */
2115 0, /* tp_call */
2116 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002117 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002118 0, /* tp_setattro */
2119 0, /* tp_as_buffer */
2120 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002121 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002122 0, /* tp_traverse */
2123 0, /* tp_clear */
2124 0, /* tp_richcompare */
2125 0, /* tp_weaklistoffset */
2126 0, /* tp_iter */
2127 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002128 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002129 0, /* tp_members */
2130 0, /* tp_getset */
2131 0, /* tp_base */
2132 0, /* tp_dict */
2133 0, /* tp_descr_get */
2134 0, /* tp_descr_set */
2135 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002136 sock_initobj, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002137 0, /* set below */ /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002138 sock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002139 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002140};
2141
Guido van Rossum30a685f1991-06-27 15:51:29 +00002142
Guido van Rossum81194471991-07-27 21:42:02 +00002143/* Python interface to gethostname(). */
2144
2145/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002146static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002147socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002148{
2149 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002150 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002151 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002152 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002153 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002154 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002155 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002156 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002157 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002158 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002159 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002160}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002161
Guido van Rossum82a5c661998-07-07 20:45:43 +00002162static char gethostname_doc[] =
2163"gethostname() -> string\n\
2164\n\
2165Return the current host name.";
2166
Guido van Rossumff4949e1992-08-05 19:58:53 +00002167
Guido van Rossum30a685f1991-06-27 15:51:29 +00002168/* Python interface to gethostbyname(name). */
2169
2170/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002171static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002172socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002173{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002174 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002175 struct sockaddr_storage addrbuf;
2176
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002177 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002178 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002179 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002180 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002181 return makeipaddr((struct sockaddr *)&addrbuf,
2182 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002183}
2184
Guido van Rossum82a5c661998-07-07 20:45:43 +00002185static char gethostbyname_doc[] =
2186"gethostbyname(host) -> address\n\
2187\n\
2188Return the IP address (a string of the form '255.255.255.255') for a host.";
2189
2190
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002191/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2192
2193static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002194gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002195{
2196 char **pch;
2197 PyObject *rtn_tuple = (PyObject *)NULL;
2198 PyObject *name_list = (PyObject *)NULL;
2199 PyObject *addr_list = (PyObject *)NULL;
2200 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002201
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002202 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002203 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002204#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002205 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002206#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002207 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002208#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002209 return NULL;
2210 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002211
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002212 if (h->h_addrtype != af) {
2213#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002214 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002215 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002216 (char *)strerror(EAFNOSUPPORT));
2217#else
2218 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002219 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002220 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002221#endif
2222 return NULL;
2223 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002224
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002225 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002226
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002227 case AF_INET:
2228 if (alen < sizeof(struct sockaddr_in))
2229 return NULL;
2230 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002231
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002232#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002233 case AF_INET6:
2234 if (alen < sizeof(struct sockaddr_in6))
2235 return NULL;
2236 break;
2237#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002238
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002239 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002240
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002241 if ((name_list = PyList_New(0)) == NULL)
2242 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002243
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002244 if ((addr_list = PyList_New(0)) == NULL)
2245 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002246
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002247 for (pch = h->h_aliases; *pch != NULL; pch++) {
2248 int status;
2249 tmp = PyString_FromString(*pch);
2250 if (tmp == NULL)
2251 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002252
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002253 status = PyList_Append(name_list, tmp);
2254 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002255
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002256 if (status)
2257 goto err;
2258 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002259
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002260 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2261 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002262
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002263 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002264
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002265 case AF_INET:
2266 {
2267 struct sockaddr_in sin;
2268 memset(&sin, 0, sizeof(sin));
2269 sin.sin_family = af;
2270#ifdef HAVE_SOCKADDR_SA_LEN
2271 sin.sin_len = sizeof(sin);
2272#endif
2273 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2274 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002275
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002276 if (pch == h->h_addr_list && alen >= sizeof(sin))
2277 memcpy((char *) addr, &sin, sizeof(sin));
2278 break;
2279 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002280
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002281#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002282 case AF_INET6:
2283 {
2284 struct sockaddr_in6 sin6;
2285 memset(&sin6, 0, sizeof(sin6));
2286 sin6.sin6_family = af;
2287#ifdef HAVE_SOCKADDR_SA_LEN
2288 sin6.sin6_len = sizeof(sin6);
2289#endif
2290 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2291 tmp = makeipaddr((struct sockaddr *)&sin6,
2292 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002293
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002294 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2295 memcpy((char *) addr, &sin6, sizeof(sin6));
2296 break;
2297 }
2298#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002299
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002300 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002301 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002302 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002303 return NULL;
2304 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002305
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002306 if (tmp == NULL)
2307 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002308
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002309 status = PyList_Append(addr_list, tmp);
2310 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002311
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002312 if (status)
2313 goto err;
2314 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002315
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002316 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002317
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002318 err:
2319 Py_XDECREF(name_list);
2320 Py_XDECREF(addr_list);
2321 return rtn_tuple;
2322}
2323
2324
2325/* Python interface to gethostbyname_ex(name). */
2326
2327/*ARGSUSED*/
2328static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002329socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002330{
2331 char *name;
2332 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002333 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002334 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002335 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002336#ifdef HAVE_GETHOSTBYNAME_R
2337 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002338#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2339 struct hostent_data data;
2340#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002341 char buf[16384];
2342 int buf_len = (sizeof buf) - 1;
2343 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002344#endif
2345#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002346 int result;
2347#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002348#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002349
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002350 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002351 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002352 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002353 return NULL;
2354 Py_BEGIN_ALLOW_THREADS
2355#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002356#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002357 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2358 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002359#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002360 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002361#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002362 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002363 result = gethostbyname_r(name, &hp_allocated, &data);
2364 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002365#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002366#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002367#ifdef USE_GETHOSTBYNAME_LOCK
2368 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002369#endif
2370 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002371#endif /* HAVE_GETHOSTBYNAME_R */
2372 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002373 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002374 addr.ss_family.
2375 Therefore, we cast the sockaddr_storage into sockaddr to
2376 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002377 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002378 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002379 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002380#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002381 PyThread_release_lock(gethostbyname_lock);
2382#endif
2383 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002384}
2385
2386static char ghbn_ex_doc[] =
2387"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2388\n\
2389Return the true host name, a list of aliases, and a list of IP addresses,\n\
2390for a host. The host argument is a string giving a host name or IP number.";
2391
2392
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002393/* Python interface to gethostbyaddr(IP). */
2394
2395/*ARGSUSED*/
2396static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002397socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002398{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002399#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002400 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002401#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002402 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002403#endif
2404 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002405 char *ip_num;
2406 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002407 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002408#ifdef HAVE_GETHOSTBYNAME_R
2409 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002410#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2411 struct hostent_data data;
2412#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002413 char buf[16384];
2414 int buf_len = (sizeof buf) - 1;
2415 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002416#endif
2417#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002418 int result;
2419#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002420#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002421 char *ap;
2422 int al;
2423 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002424
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002425 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002426 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002427 af = PF_UNSPEC;
2428 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002429 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002430 af = sa->sa_family;
2431 ap = NULL;
2432 al = 0;
2433 switch (af) {
2434 case AF_INET:
2435 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2436 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2437 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002438#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002439 case AF_INET6:
2440 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2441 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2442 break;
2443#endif
2444 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002445 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002446 return NULL;
2447 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002448 Py_BEGIN_ALLOW_THREADS
2449#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002450#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002451 result = gethostbyaddr_r(ap, al, af,
2452 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002453 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002454#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002455 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002456 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002457#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002458 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002459 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002460 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002461#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002462#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002463#ifdef USE_GETHOSTBYNAME_LOCK
2464 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002465#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002466 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002467#endif /* HAVE_GETHOSTBYNAME_R */
2468 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002469 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002470#ifdef USE_GETHOSTBYNAME_LOCK
2471 PyThread_release_lock(gethostbyname_lock);
2472#endif
2473 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002474}
2475
Guido van Rossum82a5c661998-07-07 20:45:43 +00002476static char gethostbyaddr_doc[] =
2477"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2478\n\
2479Return the true host name, a list of aliases, and a list of IP addresses,\n\
2480for a host. The host argument is a string giving a host name or IP number.";
2481
Guido van Rossum30a685f1991-06-27 15:51:29 +00002482
2483/* Python interface to getservbyname(name).
2484 This only returns the port number, since the other info is already
2485 known or not useful (like the list of aliases). */
2486
2487/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002488static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002489socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002490{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002491 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002492 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002493 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002494 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002495 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002496 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002497 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002498 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002499 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002500 return NULL;
2501 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002502 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002503}
2504
Guido van Rossum82a5c661998-07-07 20:45:43 +00002505static char getservbyname_doc[] =
2506"getservbyname(servicename, protocolname) -> integer\n\
2507\n\
2508Return a port number from a service name and protocol name.\n\
2509The protocol name should be 'tcp' or 'udp'.";
2510
Guido van Rossum30a685f1991-06-27 15:51:29 +00002511
Guido van Rossum3901d851996-12-19 16:35:04 +00002512/* Python interface to getprotobyname(name).
2513 This only returns the protocol number, since the other info is
2514 already known or not useful (like the list of aliases). */
2515
2516/*ARGSUSED*/
2517static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002518socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002519{
2520 char *name;
2521 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002522#ifdef __BEOS__
2523/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002524 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002525 return NULL;
2526#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002527 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002528 return NULL;
2529 Py_BEGIN_ALLOW_THREADS
2530 sp = getprotobyname(name);
2531 Py_END_ALLOW_THREADS
2532 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002533 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002534 return NULL;
2535 }
2536 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002537#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002538}
2539
Guido van Rossum82a5c661998-07-07 20:45:43 +00002540static char getprotobyname_doc[] =
2541"getprotobyname(name) -> integer\n\
2542\n\
2543Return the protocol number for the named protocol. (Rarely used.)";
2544
Guido van Rossum3901d851996-12-19 16:35:04 +00002545
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002546#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002547/* Create a socket object from a numeric file description.
2548 Useful e.g. if stdin is a socket.
2549 Additional arguments as for socket(). */
2550
2551/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002552static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002553socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002554{
Guido van Rossum73624e91994-10-10 17:59:00 +00002555 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002556 SOCKET_T fd;
2557 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002558 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2559 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002560 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002561 /* Dup the fd so it and the socket can be closed independently */
2562 fd = dup(fd);
2563 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002564 return set_error();
2565 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002566 /* From now on, ignore SIGPIPE and let the error checking
2567 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002568#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002569 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002570#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002571 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002572}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002573
2574static char fromfd_doc[] =
2575"fromfd(fd, family, type[, proto]) -> socket object\n\
2576\n\
2577Create a socket object from the given file descriptor.\n\
2578The remaining arguments are the same as for socket().";
2579
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002580#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002581
Guido van Rossum82a5c661998-07-07 20:45:43 +00002582
Guido van Rossum006bf911996-06-12 04:04:55 +00002583static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002584socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002585{
2586 int x1, x2;
2587
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002588 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002589 return NULL;
2590 }
2591 x2 = (int)ntohs((short)x1);
2592 return PyInt_FromLong(x2);
2593}
2594
Guido van Rossum82a5c661998-07-07 20:45:43 +00002595static char ntohs_doc[] =
2596"ntohs(integer) -> integer\n\
2597\n\
2598Convert a 16-bit integer from network to host byte order.";
2599
2600
Guido van Rossum006bf911996-06-12 04:04:55 +00002601static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002602socket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002603{
2604 int x1, x2;
2605
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002606 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002607 return NULL;
2608 }
2609 x2 = ntohl(x1);
2610 return PyInt_FromLong(x2);
2611}
2612
Guido van Rossum82a5c661998-07-07 20:45:43 +00002613static char ntohl_doc[] =
2614"ntohl(integer) -> integer\n\
2615\n\
2616Convert a 32-bit integer from network to host byte order.";
2617
2618
Guido van Rossum006bf911996-06-12 04:04:55 +00002619static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002620socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002621{
2622 int x1, x2;
2623
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002624 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002625 return NULL;
2626 }
2627 x2 = (int)htons((short)x1);
2628 return PyInt_FromLong(x2);
2629}
2630
Guido van Rossum82a5c661998-07-07 20:45:43 +00002631static char htons_doc[] =
2632"htons(integer) -> integer\n\
2633\n\
2634Convert a 16-bit integer from host to network byte order.";
2635
2636
Guido van Rossum006bf911996-06-12 04:04:55 +00002637static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002638socket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002639{
2640 int x1, x2;
2641
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002642 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002643 return NULL;
2644 }
2645 x2 = htonl(x1);
2646 return PyInt_FromLong(x2);
2647}
2648
Guido van Rossum82a5c661998-07-07 20:45:43 +00002649static char htonl_doc[] =
2650"htonl(integer) -> integer\n\
2651\n\
2652Convert a 32-bit integer from host to network byte order.";
2653
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002654/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002655
Guido van Rossum48a680c2001-03-02 06:34:14 +00002656static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002657"inet_aton(string) -> packed 32-bit IP representation\n\
2658\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002659Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002660binary format used in low-level network functions.";
2661
2662static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002663socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002664{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002665#ifndef INADDR_NONE
2666#define INADDR_NONE (-1)
2667#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002668
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002669 /* Have to use inet_addr() instead */
2670 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002671 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002672
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002673 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002674 return NULL;
2675 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002676 packed_addr = inet_addr(ip_addr);
2677
2678 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002679 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002680 "illegal IP address string passed to inet_aton");
2681 return NULL;
2682 }
2683
2684 return PyString_FromStringAndSize((char *) &packed_addr,
2685 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002686}
2687
Guido van Rossum48a680c2001-03-02 06:34:14 +00002688static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002689"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002690\n\
2691Convert an IP address from 32-bit packed binary format to string format";
2692
2693static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002694socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002695{
2696 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002697 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002698 struct in_addr packed_addr;
2699
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002700 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002701 return NULL;
2702 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002703
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002704 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002705 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002706 "packed IP wrong length for inet_ntoa");
2707 return NULL;
2708 }
2709
2710 memcpy(&packed_addr, packed_str, addr_len);
2711
2712 return PyString_FromString(inet_ntoa(packed_addr));
2713}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002714
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002715/* Python interface to getaddrinfo(host, port). */
2716
2717/*ARGSUSED*/
2718static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002719socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002720{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002721 struct addrinfo hints, *res;
2722 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002723 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002724 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002725 char *hptr, *pptr;
2726 int family, socktype, protocol, flags;
2727 int error;
2728 PyObject *all = (PyObject *)NULL;
2729 PyObject *single = (PyObject *)NULL;
2730
2731 family = socktype = protocol = flags = 0;
2732 family = PF_UNSPEC;
2733 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2734 &hptr, &pobj, &family, &socktype,
2735 &protocol, &flags)) {
2736 return NULL;
2737 }
2738 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002739 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002740 pptr = pbuf;
2741 } else if (PyString_Check(pobj)) {
2742 pptr = PyString_AsString(pobj);
2743 } else if (pobj == Py_None) {
2744 pptr = (char *)NULL;
2745 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002746 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002747 return NULL;
2748 }
2749 memset(&hints, 0, sizeof(hints));
2750 hints.ai_family = family;
2751 hints.ai_socktype = socktype;
2752 hints.ai_protocol = protocol;
2753 hints.ai_flags = flags;
2754 error = getaddrinfo(hptr, pptr, &hints, &res0);
2755 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002756 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002757 return NULL;
2758 }
2759
2760 if ((all = PyList_New(0)) == NULL)
2761 goto err;
2762 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002763 PyObject *addr =
2764 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2765 if (addr == NULL)
2766 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002767 single = Py_BuildValue("iiisO", res->ai_family,
2768 res->ai_socktype, res->ai_protocol,
2769 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002770 addr);
2771 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002772 if (single == NULL)
2773 goto err;
2774
2775 if (PyList_Append(all, single))
2776 goto err;
2777 Py_XDECREF(single);
2778 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002779 return all;
2780 err:
2781 Py_XDECREF(single);
2782 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002783 if (res0)
2784 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002785 return (PyObject *)NULL;
2786}
2787
2788static char getaddrinfo_doc[] =
2789"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2790 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2791\n\
2792Resolve host and port into addrinfo struct.";
2793
2794/* Python interface to getnameinfo(sa, flags). */
2795
2796/*ARGSUSED*/
2797static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002798socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002799{
2800 PyObject *sa = (PyObject *)NULL;
2801 int flags;
2802 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002803 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002804 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2805 struct addrinfo hints, *res = NULL;
2806 int error;
2807 PyObject *ret = (PyObject *)NULL;
2808
2809 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002810 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002811 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002812 if (!PyArg_ParseTuple(sa, "si|ii",
2813 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002814 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002815 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002816 memset(&hints, 0, sizeof(hints));
2817 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002818 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002819 error = getaddrinfo(hostp, pbuf, &hints, &res);
2820 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002821 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002822 goto fail;
2823 }
2824 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002825 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002826 "sockaddr resolved to multiple addresses");
2827 goto fail;
2828 }
2829 switch (res->ai_family) {
2830 case AF_INET:
2831 {
2832 char *t1;
2833 int t2;
2834 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002835 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002836 "IPv4 sockaddr must be 2 tuple");
2837 goto fail;
2838 }
2839 break;
2840 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002841#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002842 case AF_INET6:
2843 {
2844 struct sockaddr_in6 *sin6;
2845 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2846 sin6->sin6_flowinfo = flowinfo;
2847 sin6->sin6_scope_id = scope_id;
2848 break;
2849 }
2850#endif
2851 }
2852 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2853 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2854 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002855 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002856 goto fail;
2857 }
2858 ret = Py_BuildValue("ss", hbuf, pbuf);
2859
2860fail:
2861 if (res)
2862 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002863 return ret;
2864}
2865
2866static char getnameinfo_doc[] =
2867"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2868\n\
2869Get host and port for a sockaddr.";
2870
Guido van Rossum30a685f1991-06-27 15:51:29 +00002871/* List of functions exported by this module. */
2872
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002873static PyMethodDef socket_methods[] = {
2874 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002875 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002876 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002877 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002878 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002879 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002880 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002881 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002882 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002883 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002884 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002885 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002886#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002887 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002888 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002889#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002890 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002891 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002892 {"ntohl", socket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002893 METH_VARARGS, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002894 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002895 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002896 {"htonl", socket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002897 METH_VARARGS, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002898 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002899 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002900 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002901 METH_VARARGS, inet_ntoa_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002902 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002903 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002904 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002905 METH_VARARGS, getnameinfo_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002906 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002907};
2908
Guido van Rossum30a685f1991-06-27 15:51:29 +00002909
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002910#ifdef RISCOS
2911#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00002912
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002913static int
2914os_init(void)
2915{
2916 _kernel_swi_regs r;
2917
2918 r.r[0] = 0;
2919 _kernel_swi(0x43380, &r, &r);
2920 taskwindow = r.r[0];
2921
2922 return 0;
2923}
2924
2925#endif /* RISCOS */
2926
2927
2928#ifdef MS_WINDOWS
2929#define OS_INIT_DEFINED
2930
2931/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002932
2933static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002934os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002935{
2936 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002937}
2938
2939static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002940os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002941{
2942 WSADATA WSAData;
2943 int ret;
2944 char buf[100];
2945 ret = WSAStartup(0x0101, &WSAData);
2946 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002947 case 0: /* No error */
2948 atexit(os_cleanup);
2949 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002950 case WSASYSNOTREADY:
2951 PyErr_SetString(PyExc_ImportError,
2952 "WSAStartup failed: network not ready");
2953 break;
2954 case WSAVERNOTSUPPORTED:
2955 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002956 PyErr_SetString(
2957 PyExc_ImportError,
2958 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00002959 break;
2960 default:
Tim Peters885d4572001-11-28 20:27:42 +00002961 PyOS_snprintf(buf, sizeof(buf),
2962 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002963 PyErr_SetString(PyExc_ImportError, buf);
2964 break;
2965 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002966 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002967}
2968
Guido van Rossum8d665e61996-06-26 18:22:49 +00002969#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002970
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002971
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002972#ifdef PYOS_OS2
2973#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002974
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002975/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002976
2977static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002978os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002979{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002980#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002981 char reason[64];
2982 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002983
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002984 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002985 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002986 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002987
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002988 PyOS_snprintf(reason, sizeof(reason),
2989 "OS/2 TCP/IP Error# %d", sock_errno());
2990 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002991
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002992 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002993#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002994 /* No need to initialise sockets with GCC/EMX */
2995 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002996#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002997}
2998
2999#endif /* PYOS_OS2 */
3000
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003001
3002#ifndef OS_INIT_DEFINED
3003static int
3004os_init(void)
3005{
3006 return 1; /* Success */
3007}
3008#endif
3009
3010
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003011/* C API table - always add new things to the end for binary
3012 compatibility. */
3013static
3014PySocketModule_APIObject PySocketModuleAPI =
3015{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003016 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003017};
3018
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003019
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003020/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003021
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003022 This module is actually called "_socket", and there's a wrapper
3023 "socket.py" which implements some additional functionality. On some
3024 platforms (e.g. Windows and OS/2), socket.py also implements a
3025 wrapper for the socket type that provides missing functionality such
3026 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3027 with an ImportError exception if os-specific initialization fails.
3028 On Windows, this does WINSOCK initialization. When WINSOCK is
3029 initialized succesfully, a call to WSACleanup() is scheduled to be
3030 made at exit time.
3031*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003032
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003033static char socket_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00003034"Implementation module for socket operations. See the socket module\n\
3035for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00003036
Guido van Rossum3886bb61998-12-04 18:50:17 +00003037DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003038init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003039{
Fred Drake4baedc12002-04-01 14:53:37 +00003040 PyObject *m;
Fred Drake4baedc12002-04-01 14:53:37 +00003041
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003042 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003043 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003044
3045 sock_type.ob_type = &PyType_Type;
3046 sock_type.tp_getattro = PyObject_GenericGetAttr;
3047 sock_type.tp_alloc = PyType_GenericAlloc;
3048 sock_type.tp_free = PyObject_Del;
3049 m = Py_InitModule3(PySocket_MODULE_NAME,
3050 socket_methods,
3051 socket_doc);
3052
3053 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3054 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003055 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003056 Py_INCREF(socket_error);
3057 PyModule_AddObject(m, "error", socket_error);
3058 socket_herror = PyErr_NewException("socket.herror",
3059 socket_error, NULL);
3060 if (socket_herror == NULL)
3061 return;
3062 Py_INCREF(socket_herror);
3063 PyModule_AddObject(m, "herror", socket_herror);
3064 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003065 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003066 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003067 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003068 Py_INCREF(socket_gaierror);
3069 PyModule_AddObject(m, "gaierror", socket_gaierror);
3070 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003071 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003072 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003073 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003074 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003075 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003076 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003077 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003078
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003079 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003080 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003081 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3082 ) != 0)
3083 return;
3084
Guido van Rossum09be4091999-08-09 14:40:40 +00003085 /* Address families (we only support AF_INET and AF_UNIX) */
3086#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003087 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003088#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003089 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003090#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003091 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003092#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003093#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00003094 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003095#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003096#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003097 /* Amateur Radio AX.25 */
3098 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003099#endif
3100#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003101 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003102#endif
3103#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003104 /* Appletalk DDP */
3105 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003106#endif
3107#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003108 /* Amateur radio NetROM */
3109 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003110#endif
3111#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003112 /* Multiprotocol bridge */
3113 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003114#endif
3115#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003116 /* Reserved for Werner's ATM */
3117 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003118#endif
3119#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003120 /* Reserved for X.25 project */
3121 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003122#endif
3123#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003124 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003125#endif
3126#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003127 /* Amateur Radio X.25 PLP */
3128 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003129#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003130#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003131 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3132 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3133 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3134 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3135 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3136 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3137 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3138 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3139 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003140#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003141
3142 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003143 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3144 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003145#ifndef __BEOS__
3146/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003147 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3148 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3149 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003150#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003151
3152#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003153 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003154#endif
3155#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003156 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003157#endif
3158#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003159 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003160#endif
3161#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003162 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003163#endif
3164#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003165 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003166#endif
3167#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003168 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003169#endif
3170#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003171 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003172#endif
3173#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003174 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003175#endif
3176#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003177 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003178#endif
3179#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003180 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003181#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003182#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003183 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003184#endif
3185#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003186 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003187#endif
3188#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003189 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003190#endif
3191#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003192 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003193#endif
3194#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003195 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003196#endif
3197#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003198 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003199#endif
3200#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003201 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003202#endif
3203#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003204 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003205#endif
3206
3207 /* Maximum number of connections for "listen" */
3208#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003209 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003210#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003211 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003212#endif
3213
3214 /* Flags for send, recv */
3215#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003216 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003217#endif
3218#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003219 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003220#endif
3221#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003222 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003223#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003224#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003225 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003226#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003227#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003228 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003229#endif
3230#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003231 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003232#endif
3233#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003234 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003235#endif
3236#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003237 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003238#endif
3239#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003240 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003241#endif
3242#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003243 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003244#endif
3245
3246 /* Protocol level and numbers, usable for [gs]etsockopt */
3247#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003248 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003249#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003250#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003251 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003252#else
Fred Drake4baedc12002-04-01 14:53:37 +00003253 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003254#endif
3255#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003256 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003257#endif
3258#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003259 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003260#endif
3261#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003262 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003263#endif
3264#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003265 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003266#endif
3267#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003268 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003269#endif
3270#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003271 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003272#else
Fred Drake4baedc12002-04-01 14:53:37 +00003273 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003274#endif
3275#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003276 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003277#else
Fred Drake4baedc12002-04-01 14:53:37 +00003278 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003279#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003280#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003281 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003282#else
Fred Drake4baedc12002-04-01 14:53:37 +00003283 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003284#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003285#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003286 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003287#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003288#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003289 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003290#else
Fred Drake4baedc12002-04-01 14:53:37 +00003291 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003292#endif
3293#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003294 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003295#endif
3296#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003297 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003298#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003299#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003300 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003301#endif
3302#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003303 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003304#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003305#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003306 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003307#else
Fred Drake4baedc12002-04-01 14:53:37 +00003308 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003309#endif
3310#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003311 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003312#endif
3313#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003314 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003315#endif
3316#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003317 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003318#else
Fred Drake4baedc12002-04-01 14:53:37 +00003319 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003320#endif
3321#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003322 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003323#endif
3324#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003325 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003326#endif
3327#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003328 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003329#endif
3330#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003331 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003332#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003333#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003334 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003335#endif
3336#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003337 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003338#endif
3339#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003340 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003341#endif
3342#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003343 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003344#endif
3345#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003346 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003347#endif
3348#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003349 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003350#endif
3351#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003352 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003353#endif
3354#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003355 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003356#endif
3357#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003358 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003359#endif
3360#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003361 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003362#endif
3363#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003364 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003365#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003366#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003367 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003368#endif
3369#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003370 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003371#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003372#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003373 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003374#endif
3375#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003376 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003377#endif
3378#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003379 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003380#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003381#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003382 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003383#endif
3384/**/
3385#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003386 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003387#else
Fred Drake4baedc12002-04-01 14:53:37 +00003388 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003389#endif
3390#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003391 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003392#endif
3393
3394 /* Some port configuration */
3395#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003396 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003397#else
Fred Drake4baedc12002-04-01 14:53:37 +00003398 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003399#endif
3400#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003401 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003402#else
Fred Drake4baedc12002-04-01 14:53:37 +00003403 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003404#endif
3405
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003406 /* Some reserved IP v.4 addresses */
3407#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003408 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003409#else
Fred Drake4baedc12002-04-01 14:53:37 +00003410 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003411#endif
3412#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003413 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003414#else
Fred Drake4baedc12002-04-01 14:53:37 +00003415 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003416#endif
3417#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003418 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003419#else
Fred Drake4baedc12002-04-01 14:53:37 +00003420 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003421#endif
3422#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003424#else
Fred Drake4baedc12002-04-01 14:53:37 +00003425 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003426#endif
3427#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003428 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3429 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003430#else
Fred Drake4baedc12002-04-01 14:53:37 +00003431 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003432#endif
3433#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003434 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3435 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003436#else
Fred Drake4baedc12002-04-01 14:53:37 +00003437 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003438#endif
3439#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003440 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003441#else
Fred Drake4baedc12002-04-01 14:53:37 +00003442 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003443#endif
3444
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003445 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003446#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003447 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003448#endif
3449#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003450 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003451#endif
3452#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003453 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003454#endif
3455#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003456 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003457#endif
3458#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003459 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003460#endif
3461#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003462 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003463#endif
3464#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003465 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003466#endif
3467#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003468 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003469#endif
3470#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003471 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003472#endif
3473#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003474 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003475#endif
3476#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003477 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003478#endif
3479#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003480 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003481#endif
3482#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003483 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003484#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003485#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003486 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3487 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003488#endif
3489#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003490 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3491 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003492#endif
3493#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003494 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003495#endif
3496
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003497 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3498#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003499 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003500#endif
3501#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003502 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003503#endif
3504#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003505 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003506#endif
3507#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003508 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003509#endif
3510#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003511 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003512#endif
3513#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003514 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003515#endif
3516
Guido van Rossum09be4091999-08-09 14:40:40 +00003517 /* TCP options */
3518#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003519 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003520#endif
3521#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003522 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003523#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003524#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003525 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003526#endif
3527#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003528 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003529#endif
3530#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003531 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003532#endif
3533#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003534 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003535#endif
3536#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003537 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003538#endif
3539#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003540 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003541#endif
3542#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003543 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003544#endif
3545#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003546 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003547#endif
3548#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003549 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003550#endif
3551#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003552 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003553#endif
3554
Guido van Rossum09be4091999-08-09 14:40:40 +00003555
3556 /* IPX options */
3557#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003558 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003559#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003560
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003561 /* get{addr,name}info parameters */
3562#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003563 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003564#endif
3565#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003566 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003567#endif
3568#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003569 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003570#endif
3571#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003572 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003573#endif
3574#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003575 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003576#endif
3577#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003578 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003579#endif
3580#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003581 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003582#endif
3583#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003584 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003585#endif
3586#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003587 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003588#endif
3589#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003590 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003591#endif
3592#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003593 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003594#endif
3595#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003596 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003597#endif
3598#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003599 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003600#endif
3601#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003602 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003603#endif
3604#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003605 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003606#endif
3607#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003608 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003609#endif
3610#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003611 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003612#endif
3613#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003614 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003615#endif
3616#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003617 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003618#endif
3619#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003620 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003621#endif
3622#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003623 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003624#endif
3625#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003626 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003627#endif
3628#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003629 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003630#endif
3631#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003632 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003633#endif
3634#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003635 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003636#endif
3637#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003638 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003639#endif
3640#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003641 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003642#endif
3643#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003644 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003645#endif
3646#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003647 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003648#endif
3649#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003650 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003651#endif
3652
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003653 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003654#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003655 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003656#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003657}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003658
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003659
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003660#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003661
3662/* Simplistic emulation code for inet_pton that only works for IPv4 */
3663
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003664int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003665inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003666{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003667 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003668 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003669 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003670 if (packed_addr == INADDR_NONE)
3671 return 0;
3672 memcpy(dst, &packed_addr, 4);
3673 return 1;
3674 }
3675 /* Should set errno to EAFNOSUPPORT */
3676 return -1;
3677}
3678
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003679const char *
3680inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003681{
3682 if (af == AF_INET) {
3683 struct in_addr packed_addr;
3684 if (size < 16)
3685 /* Should set errno to ENOSPC. */
3686 return NULL;
3687 memcpy(&packed_addr, src, sizeof(packed_addr));
3688 return strncpy(dst, inet_ntoa(packed_addr), size);
3689 }
3690 /* Should set errno to EAFNOSUPPORT */
3691 return NULL;
3692}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003693
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003694#endif