blob: 65187c5ce19af734374c915016aa524fa5986d81 [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;
1089
1090 /* If we're not using timeouts, actually set the blocking to give
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001091 old python behavior. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001092 if (s->sock_timeout < 0.0)
1093 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001094
Guido van Rossum73624e91994-10-10 17:59:00 +00001095 Py_INCREF(Py_None);
1096 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001097}
Guido van Rossume4485b01994-09-07 14:32:49 +00001098
Guido van Rossum82a5c661998-07-07 20:45:43 +00001099static char setblocking_doc[] =
1100"setblocking(flag)\n\
1101\n\
1102Set the socket to blocking (flag is true) or non-blocking (false).\n\
1103This uses the FIONBIO ioctl with the O_NDELAY flag.";
1104
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001105/* s.settimeout(None | float) method.
1106 Causes an exception to be raised when the given time has
1107 elapsed when performing a blocking socket operation. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001108static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001109sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001110{
1111 double value;
1112
1113 if (arg == Py_None)
1114 value = -1.0;
1115 else {
1116 value = PyFloat_AsDouble(arg);
1117 if (value < 0.0) {
1118 if (!PyErr_Occurred())
1119 PyErr_SetString(PyExc_ValueError,
1120 "Invalid timeout value");
1121 return NULL;
1122 }
1123 }
1124
1125 s->sock_timeout = value;
1126
1127 /* The semantics of setting socket timeouts are:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001128 If you settimeout(!=None):
1129 The actual socket gets put in non-blocking mode and the select
1130 is used to control timeouts.
1131 Else if you settimeout(None) [then value is -1.0]:
1132 The old behavior is used AND automatically, the socket is set
1133 to blocking mode. That means that someone who was doing
1134 non-blocking stuff before, sets a timeout, and then unsets
1135 one, will have to call setblocking(0) again if he wants
1136 non-blocking stuff. This makes sense because timeout stuff is
1137 blocking by nature. */
Guido van Rossumb9e916a2002-06-07 01:42:47 +00001138 internal_setblocking(s, value < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001139
1140 s->sock_blocking = 1; /* Always negate setblocking() */
1141
1142 Py_INCREF(Py_None);
1143 return Py_None;
1144}
1145
1146static char settimeout_doc[] =
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001147"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001148\n\
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001149Set a timeout on blocking socket operations. 'timeout' can be a float,\n\
1150giving seconds, or None. Setting a timeout of None disables timeout.";
Guido van Rossum67f7a382002-06-06 21:08:16 +00001151
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001152/* s.gettimeout() method.
1153 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001154static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001155sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001156{
1157 if (s->sock_timeout < 0.0) {
1158 Py_INCREF(Py_None);
1159 return Py_None;
1160 }
1161 else
1162 return PyFloat_FromDouble(s->sock_timeout);
1163}
1164
1165static char gettimeout_doc[] =
1166"gettimeout()\n\
1167\n\
1168Returns the timeout in floating seconds associated with socket \n\
1169operations. A timeout of None indicates that timeouts on socket \n\
1170operations are disabled.";
Guido van Rossume4485b01994-09-07 14:32:49 +00001171
Guido van Rossum48a680c2001-03-02 06:34:14 +00001172#ifdef RISCOS
1173/* s.sleeptaskw(1 | 0) method */
1174
1175static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001176sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001177{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001178 int block;
1179 int delay_flag;
1180 if (!PyArg_Parse(args, "i", &block))
1181 return NULL;
1182 Py_BEGIN_ALLOW_THREADS
1183 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1184 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001185
Guido van Rossum67f7a382002-06-06 21:08:16 +00001186 Py_INCREF(Py_None);
1187 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001188}
1189static char sleeptaskw_doc[] =
1190"sleeptaskw(flag)\n\
1191\n\
1192Allow sleeps in taskwindows.";
1193#endif
1194
1195
Guido van Rossumaee08791992-09-08 09:05:33 +00001196/* s.setsockopt() method.
1197 With an integer third argument, sets an integer option.
1198 With a string third argument, sets an option from a buffer;
1199 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001200
Guido van Rossum73624e91994-10-10 17:59:00 +00001201static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001202sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001203{
1204 int level;
1205 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001206 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001207 char *buf;
1208 int buflen;
1209 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001210
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001211 if (PyArg_ParseTuple(args, "iii:setsockopt",
1212 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001213 buf = (char *) &flag;
1214 buflen = sizeof flag;
1215 }
1216 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001217 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001218 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1219 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001220 return NULL;
1221 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001222 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001223 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001224 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001225 Py_INCREF(Py_None);
1226 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001227}
1228
Guido van Rossum82a5c661998-07-07 20:45:43 +00001229static char setsockopt_doc[] =
1230"setsockopt(level, option, value)\n\
1231\n\
1232Set a socket option. See the Unix manual for level and option.\n\
1233The value argument can either be an integer or a string.";
1234
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001235
Guido van Rossumaee08791992-09-08 09:05:33 +00001236/* s.getsockopt() method.
1237 With two arguments, retrieves an integer option.
1238 With a third integer argument, retrieves a string buffer of that size;
1239 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001240
Guido van Rossum73624e91994-10-10 17:59:00 +00001241static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001242sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001243{
1244 int level;
1245 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001246 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001247 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001248 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001249
Guido van Rossumbcc20741998-08-04 22:53:56 +00001250#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001251 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001252 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001253 return NULL;
1254#else
1255
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001256 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1257 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001258 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001259
Guido van Rossumbe32c891996-06-20 16:25:29 +00001260 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001261 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001262 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001263 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001264 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001265 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001266 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001267 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001268 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001269 if (buflen <= 0 || buflen > 1024) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001270 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001271 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001272 return NULL;
1273 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001274 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001275 if (buf == NULL)
1276 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001277 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001278 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001279 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001280 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001281 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001282 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001283 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001284 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001285#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001286}
1287
Guido van Rossum82a5c661998-07-07 20:45:43 +00001288static char getsockopt_doc[] =
1289"getsockopt(level, option[, buffersize]) -> value\n\
1290\n\
1291Get a socket option. See the Unix manual for level and option.\n\
1292If a nonzero buffersize argument is given, the return value is a\n\
1293string of that length; otherwise it is an integer.";
1294
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001295
Fred Drake728819a2000-07-01 03:40:12 +00001296/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001297
Guido van Rossum73624e91994-10-10 17:59:00 +00001298static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001299sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001300{
1301 struct sockaddr *addr;
1302 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001303 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001304
Fred Drake728819a2000-07-01 03:40:12 +00001305 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001306 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001307 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001308 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001309 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001310 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001311 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001312 Py_INCREF(Py_None);
1313 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001314}
1315
Guido van Rossum82a5c661998-07-07 20:45:43 +00001316static char bind_doc[] =
1317"bind(address)\n\
1318\n\
1319Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001320pair (host, port); the host must refer to the local host. For raw packet\n\
1321sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001322
Guido van Rossum30a685f1991-06-27 15:51:29 +00001323
1324/* s.close() method.
1325 Set the file descriptor to -1 so operations tried subsequently
1326 will surely fail. */
1327
Guido van Rossum73624e91994-10-10 17:59:00 +00001328static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001329sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001330{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001331 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001332
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001333 if ((fd = s->sock_fd) != -1) {
1334 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001335 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001336 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001337 Py_END_ALLOW_THREADS
1338 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001339 Py_INCREF(Py_None);
1340 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001341}
1342
Guido van Rossum82a5c661998-07-07 20:45:43 +00001343static char close_doc[] =
1344"close()\n\
1345\n\
1346Close the socket. It cannot be used after this call.";
1347
Guido van Rossum30a685f1991-06-27 15:51:29 +00001348
Fred Drake728819a2000-07-01 03:40:12 +00001349/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001350
Guido van Rossum73624e91994-10-10 17:59:00 +00001351static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001352sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001353{
1354 struct sockaddr *addr;
1355 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001356 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001357
Fred Drake728819a2000-07-01 03:40:12 +00001358 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001359 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001360
1361 errno = 0; /* Reset the err indicator for use with timeouts */
1362
Guido van Rossum73624e91994-10-10 17:59:00 +00001363 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001364 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001365 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001366
1367 if (s->sock_timeout >= 0.0) {
1368 if (res < 0) {
1369 /* Return if we're already connected */
1370#ifdef MS_WINDOWS
1371 if (errno == WSAEINVAL || errno == WSAEISCONN)
1372#else
1373 if (errno == EISCONN)
1374#endif
1375 goto connected;
1376
1377 /* Check if we have an error */
1378 if (!s->sock_blocking)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001379 return s->errorhandler();
1380 /* Check if we have a true failure
1381 for a blocking socket */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001382#ifdef MS_WINDOWS
1383 if (errno != WSAEWOULDBLOCK)
1384#else
1385 if (errno != EINPROGRESS && errno != EALREADY &&
1386 errno != EWOULDBLOCK)
1387#endif
1388 return s->errorhandler();
1389 }
1390
1391 /* Check if we're ready for the connect via select */
1392 if (internal_select(s, 1) <= 0)
1393 return NULL;
1394
1395 /* Complete the connection now */
1396 Py_BEGIN_ALLOW_THREADS
1397 res = connect(s->sock_fd, addr, addrlen);
1398 Py_END_ALLOW_THREADS
1399 }
1400
Guido van Rossumff4949e1992-08-05 19:58:53 +00001401 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001402 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001403
1404connected:
Guido van Rossum73624e91994-10-10 17:59:00 +00001405 Py_INCREF(Py_None);
1406 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001407}
1408
Guido van Rossum82a5c661998-07-07 20:45:43 +00001409static char connect_doc[] =
1410"connect(address)\n\
1411\n\
1412Connect the socket to a remote address. For IP sockets, the address\n\
1413is a pair (host, port).";
1414
Guido van Rossum30a685f1991-06-27 15:51:29 +00001415
Fred Drake728819a2000-07-01 03:40:12 +00001416/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001417
1418static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001419sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001420{
1421 struct sockaddr *addr;
1422 int addrlen;
1423 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001424
Fred Drake728819a2000-07-01 03:40:12 +00001425 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001426 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001427
1428 errno = 0; /* Reset the err indicator for use with timeouts */
1429
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001430 Py_BEGIN_ALLOW_THREADS
1431 res = connect(s->sock_fd, addr, addrlen);
1432 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001433
1434 if (s->sock_timeout >= 0.0) {
1435 if (res < 0) {
1436 /* Return if we're already connected */
1437#ifdef MS_WINDOWS
1438 if (errno == WSAEINVAL || errno == WSAEISCONN)
1439#else
1440 if (errno == EISCONN)
1441#endif
1442 goto conex_finally;
1443
1444 /* Check if we have an error */
1445 if (!s->sock_blocking)
1446 goto conex_finally;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001447 /* Check if we have a true failure
1448 for a blocking socket */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001449#ifdef MS_WINDOWS
1450 if (errno != WSAEWOULDBLOCK)
1451#else
1452 if (errno != EINPROGRESS && errno != EALREADY &&
1453 errno != EWOULDBLOCK)
1454#endif
1455 goto conex_finally;
1456 }
1457
1458 /* Check if we're ready for the connect via select */
1459 if (internal_select(s, 1) <= 0)
1460 return NULL;
1461
1462 /* Complete the connection now */
1463 Py_BEGIN_ALLOW_THREADS
1464 res = connect(s->sock_fd, addr, addrlen);
1465 Py_END_ALLOW_THREADS
1466 }
1467
Tim Petersc32410a2001-10-30 01:26:49 +00001468 if (res != 0) {
1469#ifdef MS_WINDOWS
1470 res = WSAGetLastError();
1471#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001472 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001473#endif
1474 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001475
1476conex_finally:
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001477 return PyInt_FromLong((long) res);
1478}
1479
Guido van Rossum82a5c661998-07-07 20:45:43 +00001480static char connect_ex_doc[] =
1481"connect_ex(address)\n\
1482\n\
1483This is like connect(address), but returns an error code (the errno value)\n\
1484instead of raising an exception when an error occurs.";
1485
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001486
Guido van Rossumed233a51992-06-23 09:07:03 +00001487/* s.fileno() method */
1488
Guido van Rossum73624e91994-10-10 17:59:00 +00001489static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001490sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001491{
Fred Drakea04eaad2000-06-30 02:46:07 +00001492#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001493 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001494#else
1495 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1496#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001497}
1498
Guido van Rossum82a5c661998-07-07 20:45:43 +00001499static char fileno_doc[] =
1500"fileno() -> integer\n\
1501\n\
1502Return the integer file descriptor of the socket.";
1503
Guido van Rossumed233a51992-06-23 09:07:03 +00001504
Guido van Rossumbe32c891996-06-20 16:25:29 +00001505#ifndef NO_DUP
1506/* s.dup() method */
1507
1508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001509sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001510{
Fred Drakea04eaad2000-06-30 02:46:07 +00001511 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001512 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001513
Guido van Rossumbe32c891996-06-20 16:25:29 +00001514 newfd = dup(s->sock_fd);
1515 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001516 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001517 sock = (PyObject *) new_sockobject(newfd,
1518 s->sock_family,
1519 s->sock_type,
1520 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001521 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001522 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001523 return sock;
1524}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001525
1526static char dup_doc[] =
1527"dup() -> socket object\n\
1528\n\
1529Return a new socket object connected to the same system resource.";
1530
Guido van Rossumbe32c891996-06-20 16:25:29 +00001531#endif
1532
1533
Guido van Rossumc89705d1992-11-26 08:54:07 +00001534/* s.getsockname() method */
1535
Guido van Rossum73624e91994-10-10 17:59:00 +00001536static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001537sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001538{
1539 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001540 int res;
1541 socklen_t addrlen;
1542
Guido van Rossumc89705d1992-11-26 08:54:07 +00001543 if (!getsockaddrlen(s, &addrlen))
1544 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001545 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001546 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001547 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001548 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001549 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001550 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001551 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001552}
1553
Guido van Rossum82a5c661998-07-07 20:45:43 +00001554static char getsockname_doc[] =
1555"getsockname() -> address info\n\
1556\n\
1557Return the address of the local endpoint. For IP sockets, the address\n\
1558info is a pair (hostaddr, port).";
1559
Guido van Rossumc89705d1992-11-26 08:54:07 +00001560
Guido van Rossumb6775db1994-08-01 11:34:53 +00001561#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001562/* s.getpeername() method */
1563
Guido van Rossum73624e91994-10-10 17:59:00 +00001564static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001565sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001566{
1567 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001568 int res;
1569 socklen_t addrlen;
1570
Guido van Rossumc89705d1992-11-26 08:54:07 +00001571 if (!getsockaddrlen(s, &addrlen))
1572 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001573 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001574 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001575 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001576 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001577 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001578 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001579 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001580}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001581
1582static char getpeername_doc[] =
1583"getpeername() -> address info\n\
1584\n\
1585Return the address of the remote endpoint. For IP sockets, the address\n\
1586info is a pair (hostaddr, port).";
1587
Guido van Rossumb6775db1994-08-01 11:34:53 +00001588#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001589
1590
Guido van Rossum30a685f1991-06-27 15:51:29 +00001591/* s.listen(n) method */
1592
Guido van Rossum73624e91994-10-10 17:59:00 +00001593static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001594sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001595{
1596 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001597 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001598
1599 backlog = PyInt_AsLong(arg);
1600 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001601 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001602 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001603 if (backlog < 1)
1604 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001605 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001606 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001607 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001608 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001609 Py_INCREF(Py_None);
1610 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001611}
1612
Guido van Rossum82a5c661998-07-07 20:45:43 +00001613static char listen_doc[] =
1614"listen(backlog)\n\
1615\n\
1616Enable a server to accept connections. The backlog argument must be at\n\
1617least 1; it specifies the number of unaccepted connection that the system\n\
1618will allow before refusing new connections.";
1619
1620
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001621#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001622/* s.makefile(mode) method.
1623 Create a new open file object referring to a dupped version of
1624 the socket's file descriptor. (The dup() call is necessary so
1625 that the open file and socket objects may be closed independent
1626 of each other.)
1627 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1628
Guido van Rossum73624e91994-10-10 17:59:00 +00001629static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001630sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001631{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001632 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001633 char *mode = "r";
1634 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001635#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001636 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001637#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001638 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001639#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001640 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001641 PyObject *f;
1642
Guido van Rossum43713e52000-02-29 13:59:29 +00001643 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001644 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001645#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001646 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1647 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001648#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001649 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001650#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001651 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001652 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001653 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001654 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001655 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001656#ifdef USE_GUSI2
1657 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001658 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001659 bufsize = 0;
1660#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001661 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1662 if (f != NULL)
1663 PyFile_SetBufSize(f, bufsize);
1664 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001665}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001666
1667static char makefile_doc[] =
1668"makefile([mode[, buffersize]]) -> file object\n\
1669\n\
1670Return a regular file object corresponding to the socket.\n\
1671The mode and buffersize arguments are as for the built-in open() function.";
1672
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001673#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001674
Guido van Rossum48a680c2001-03-02 06:34:14 +00001675
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001676/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001677
Guido van Rossum73624e91994-10-10 17:59:00 +00001678static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001679sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001680{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001681 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001682 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001683
Guido van Rossum43713e52000-02-29 13:59:29 +00001684 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001685 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001686
1687 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001688 PyErr_SetString(PyExc_ValueError,
1689 "negative buffersize in connect");
1690 return NULL;
1691 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001692
Guido van Rossum73624e91994-10-10 17:59:00 +00001693 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001694 if (buf == NULL)
1695 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001696
1697 if (s->sock_timeout >= 0.0) {
1698 if (s->sock_blocking) {
1699 if (internal_select(s, 0) <= 0)
1700 return NULL;
1701 }
1702 }
1703
Guido van Rossum73624e91994-10-10 17:59:00 +00001704 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001705 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001706 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001707
Guido van Rossum7c53b771995-09-13 18:39:47 +00001708 if (n < 0) {
1709 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001710 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001711 }
Tim Peters5de98422002-04-27 18:44:32 +00001712 if (n != len)
1713 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001714 return buf;
1715}
1716
Guido van Rossum82a5c661998-07-07 20:45:43 +00001717static char recv_doc[] =
1718"recv(buffersize[, flags]) -> data\n\
1719\n\
1720Receive up to buffersize bytes from the socket. For the optional flags\n\
1721argument, see the Unix manual. When no data is available, block until\n\
1722at least one byte is available or until the remote end is closed. When\n\
1723the remote end is closed and all data is read, return the empty string.";
1724
Guido van Rossum30a685f1991-06-27 15:51:29 +00001725
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001726/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001727
Guido van Rossum73624e91994-10-10 17:59:00 +00001728static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001729sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001730{
1731 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001732 PyObject *buf = NULL;
1733 PyObject *addr = NULL;
1734 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001735 int len, n, flags = 0;
1736 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001737
Guido van Rossum43713e52000-02-29 13:59:29 +00001738 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001739 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001740
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001741 if (!getsockaddrlen(s, &addrlen))
1742 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001743 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001744 if (buf == NULL)
1745 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001746
1747 if (s->sock_timeout >= 0.0) {
1748 if (s->sock_blocking) {
1749 if (internal_select(s, 0) <= 0)
1750 return NULL;
1751 }
1752 }
1753
Guido van Rossum73624e91994-10-10 17:59:00 +00001754 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001755 memset(addrbuf, 0, addrlen);
1756 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001757#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001758#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001759 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001760#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001761 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001762#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001763#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001764 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001765#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001766 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001767 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001768
Guido van Rossum7c53b771995-09-13 18:39:47 +00001769 if (n < 0) {
1770 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001771 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001772 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001773
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001774 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001775 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001776
Guido van Rossum67f7a382002-06-06 21:08:16 +00001777 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001778 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001779 goto finally;
1780
Guido van Rossum73624e91994-10-10 17:59:00 +00001781 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001782
1783finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001784 Py_XDECREF(addr);
1785 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001786 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001787}
1788
Guido van Rossum82a5c661998-07-07 20:45:43 +00001789static char recvfrom_doc[] =
1790"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1791\n\
1792Like recv(buffersize, flags) but also return the sender's address info.";
1793
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001794/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001795
Guido van Rossum73624e91994-10-10 17:59:00 +00001796static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001797sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001798{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001799 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001800 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001801
Guido van Rossum43713e52000-02-29 13:59:29 +00001802 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001803 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001804
1805 if (s->sock_timeout >= 0.0) {
1806 if (s->sock_blocking) {
1807 if (internal_select(s, 1) <= 0)
1808 return NULL;
1809 }
1810 }
1811
Guido van Rossum73624e91994-10-10 17:59:00 +00001812 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001813 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001814 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001815
Guido van Rossum30a685f1991-06-27 15:51:29 +00001816 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001817 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001818 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001819}
1820
Guido van Rossum82a5c661998-07-07 20:45:43 +00001821static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001822"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001823\n\
1824Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001825argument, see the Unix manual. Return the number of bytes\n\
1826sent; this may be less than len(data) if the network is busy.";
1827
1828
1829/* s.sendall(data [,flags]) method */
1830
1831static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001832sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001833{
1834 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001835 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001836
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001837 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1838 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001839
1840 if (s->sock_timeout >= 0.0) {
1841 if (s->sock_blocking) {
Guido van Rossumb9e916a2002-06-07 01:42:47 +00001842 if (internal_select(s, 1) <= 0)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001843 return NULL;
1844 }
1845 }
1846
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001847 Py_BEGIN_ALLOW_THREADS
1848 do {
1849 n = send(s->sock_fd, buf, len, flags);
1850 if (n < 0)
1851 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001852 buf += n;
1853 len -= n;
1854 } while (len > 0);
1855 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001856
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001857 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001858 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001859
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001860 Py_INCREF(Py_None);
1861 return Py_None;
1862}
1863
1864static char sendall_doc[] =
1865"sendall(data[, flags])\n\
1866\n\
1867Send a data string to the socket. For the optional flags\n\
1868argument, see the Unix manual. This calls send() repeatedly\n\
1869until all data is sent. If an error occurs, it's impossible\n\
1870to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001871
Guido van Rossum30a685f1991-06-27 15:51:29 +00001872
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001873/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001874
Guido van Rossum73624e91994-10-10 17:59:00 +00001875static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001876sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001877{
Guido van Rossum73624e91994-10-10 17:59:00 +00001878 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001879 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001880 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001881 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001882
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001883 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001884 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001885 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001886 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1887 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001888 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001889 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001890
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001891 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001892 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001893
1894 if (s->sock_timeout >= 0.0) {
1895 if (s->sock_blocking) {
1896 if (internal_select(s, 1) <= 0)
1897 return NULL;
1898 }
1899 }
1900
Guido van Rossum73624e91994-10-10 17:59:00 +00001901 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001902 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001903 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001904
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001905 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001906 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001907 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001908}
1909
Guido van Rossum82a5c661998-07-07 20:45:43 +00001910static char sendto_doc[] =
1911"sendto(data[, flags], address)\n\
1912\n\
1913Like send(data, flags) but allows specifying the destination address.\n\
1914For IP sockets, the address is a pair (hostaddr, port).";
1915
Guido van Rossum30a685f1991-06-27 15:51:29 +00001916
1917/* s.shutdown(how) method */
1918
Guido van Rossum73624e91994-10-10 17:59:00 +00001919static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001920sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001921{
1922 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001923 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001924
1925 how = PyInt_AsLong(arg);
1926 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001927 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001928 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001929 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001930 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001931 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001932 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001933 Py_INCREF(Py_None);
1934 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001935}
1936
Guido van Rossum82a5c661998-07-07 20:45:43 +00001937static char shutdown_doc[] =
1938"shutdown(flag)\n\
1939\n\
1940Shut down the reading side of the socket (flag == 0), the writing side\n\
1941of the socket (flag == 1), or both ends (flag == 2).";
1942
Guido van Rossum30a685f1991-06-27 15:51:29 +00001943
1944/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001945
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001946static PyMethodDef sock_methods[] = {
1947 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001948 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001949 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001950 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001951 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001952 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001953 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001954 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001955 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001956 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001957#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001958 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001959 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001960#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001961 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001962 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001963#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001964 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001965 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001966#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001967 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001968 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001969 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001970 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001971 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001972 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001973#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001974 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001975 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001976#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001977 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001978 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001979 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001980 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001981 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001982 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001983 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001984 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001985 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001986 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001987 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001988 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001989 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001990 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001991 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001992 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001993 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001994 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001995 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001996 shutdown_doc},
1997#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001998 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001999 sleeptaskw_doc},
2000#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002001 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002002};
2003
Guido van Rossum30a685f1991-06-27 15:51:29 +00002004
Guido van Rossum73624e91994-10-10 17:59:00 +00002005/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002006 First close the file description. */
2007
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002008static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002009sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002010{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002011 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002012 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002013 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002014}
2015
Guido van Rossum30a685f1991-06-27 15:51:29 +00002016
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002017static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002018sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002019{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002020 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002021#if SIZEOF_SOCKET_T > SIZEOF_LONG
2022 if (s->sock_fd > LONG_MAX) {
2023 /* this can occur on Win64, and actually there is a special
2024 ugly printf formatter for decimal pointer length integer
2025 printing, only bother if necessary*/
2026 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002027 "no printf formatter to display "
2028 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002029 return NULL;
2030 }
2031#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002032 PyOS_snprintf(
2033 buf, sizeof(buf),
2034 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2035 (long)s->sock_fd, s->sock_family,
2036 s->sock_type,
2037 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002038 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002039}
2040
2041
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002042/* Create a new, uninitialized socket object. */
2043
2044static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002045sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002046{
2047 PyObject *new;
2048
2049 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002050 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002051 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002052 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002053 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002054 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002055 return new;
2056}
2057
2058
2059/* Initialize a new socket object. */
2060
2061/*ARGSUSED*/
2062static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002063sock_init(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002064{
2065 PySocketSockObject *s = (PySocketSockObject *)self;
2066 SOCKET_T fd;
2067 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2068 static char *keywords[] = {"family", "type", "proto", 0};
2069
2070 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2071 "|iii:socket", keywords,
2072 &family, &type, &proto))
2073 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002074
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002075 Py_BEGIN_ALLOW_THREADS
2076 fd = socket(family, type, proto);
2077 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002078
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002079#ifdef MS_WINDOWS
2080 if (fd == INVALID_SOCKET)
2081#else
2082 if (fd < 0)
2083#endif
2084 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002085 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002086 return -1;
2087 }
2088 init_sockobject(s, fd, family, type, proto);
2089 /* From now on, ignore SIGPIPE and let the error checking
2090 do the work. */
2091#ifdef SIGPIPE
2092 (void) signal(SIGPIPE, SIG_IGN);
2093#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002094
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002095 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002096
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002097}
2098
2099
Guido van Rossumb6775db1994-08-01 11:34:53 +00002100/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002101
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002102static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002103 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002104 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002105 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002106 sizeof(PySocketSockObject), /* tp_basicsize */
2107 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002108 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002109 0, /* tp_print */
2110 0, /* tp_getattr */
2111 0, /* tp_setattr */
2112 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002113 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002114 0, /* tp_as_number */
2115 0, /* tp_as_sequence */
2116 0, /* tp_as_mapping */
2117 0, /* tp_hash */
2118 0, /* tp_call */
2119 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002120 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002121 0, /* tp_setattro */
2122 0, /* tp_as_buffer */
2123 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002124 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002125 0, /* tp_traverse */
2126 0, /* tp_clear */
2127 0, /* tp_richcompare */
2128 0, /* tp_weaklistoffset */
2129 0, /* tp_iter */
2130 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002131 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002132 0, /* tp_members */
2133 0, /* tp_getset */
2134 0, /* tp_base */
2135 0, /* tp_dict */
2136 0, /* tp_descr_get */
2137 0, /* tp_descr_set */
2138 0, /* tp_dictoffset */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002139 sock_init, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002140 0, /* set below */ /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002141 sock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002142 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002143};
2144
Guido van Rossum30a685f1991-06-27 15:51:29 +00002145
Guido van Rossum81194471991-07-27 21:42:02 +00002146/* Python interface to gethostname(). */
2147
2148/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002149static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002150socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002151{
2152 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002153 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002154 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002155 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002156 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002157 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002158 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002159 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002160 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002161 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002162 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002163}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002164
Guido van Rossum82a5c661998-07-07 20:45:43 +00002165static char gethostname_doc[] =
2166"gethostname() -> string\n\
2167\n\
2168Return the current host name.";
2169
Guido van Rossumff4949e1992-08-05 19:58:53 +00002170
Guido van Rossum30a685f1991-06-27 15:51:29 +00002171/* Python interface to gethostbyname(name). */
2172
2173/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002174static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002175socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002176{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002177 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002178 struct sockaddr_storage addrbuf;
2179
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002180 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002181 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002182 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002183 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002184 return makeipaddr((struct sockaddr *)&addrbuf,
2185 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002186}
2187
Guido van Rossum82a5c661998-07-07 20:45:43 +00002188static char gethostbyname_doc[] =
2189"gethostbyname(host) -> address\n\
2190\n\
2191Return the IP address (a string of the form '255.255.255.255') for a host.";
2192
2193
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002194/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2195
2196static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002197gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002198{
2199 char **pch;
2200 PyObject *rtn_tuple = (PyObject *)NULL;
2201 PyObject *name_list = (PyObject *)NULL;
2202 PyObject *addr_list = (PyObject *)NULL;
2203 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002204
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002205 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002206 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002207#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002208 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002209#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002210 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002211#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002212 return NULL;
2213 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002214
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002215 if (h->h_addrtype != af) {
2216#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002217 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002218 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002219 (char *)strerror(EAFNOSUPPORT));
2220#else
2221 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002222 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002223 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002224#endif
2225 return NULL;
2226 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002227
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002228 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002229
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002230 case AF_INET:
2231 if (alen < sizeof(struct sockaddr_in))
2232 return NULL;
2233 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002234
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002235#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002236 case AF_INET6:
2237 if (alen < sizeof(struct sockaddr_in6))
2238 return NULL;
2239 break;
2240#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002241
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002242 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002243
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002244 if ((name_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 if ((addr_list = PyList_New(0)) == NULL)
2248 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002249
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002250 for (pch = h->h_aliases; *pch != NULL; pch++) {
2251 int status;
2252 tmp = PyString_FromString(*pch);
2253 if (tmp == NULL)
2254 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002255
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002256 status = PyList_Append(name_list, tmp);
2257 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002258
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002259 if (status)
2260 goto err;
2261 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002262
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002263 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2264 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002265
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002266 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002267
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002268 case AF_INET:
2269 {
2270 struct sockaddr_in sin;
2271 memset(&sin, 0, sizeof(sin));
2272 sin.sin_family = af;
2273#ifdef HAVE_SOCKADDR_SA_LEN
2274 sin.sin_len = sizeof(sin);
2275#endif
2276 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2277 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002278
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002279 if (pch == h->h_addr_list && alen >= sizeof(sin))
2280 memcpy((char *) addr, &sin, sizeof(sin));
2281 break;
2282 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002283
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002284#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002285 case AF_INET6:
2286 {
2287 struct sockaddr_in6 sin6;
2288 memset(&sin6, 0, sizeof(sin6));
2289 sin6.sin6_family = af;
2290#ifdef HAVE_SOCKADDR_SA_LEN
2291 sin6.sin6_len = sizeof(sin6);
2292#endif
2293 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2294 tmp = makeipaddr((struct sockaddr *)&sin6,
2295 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002296
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002297 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2298 memcpy((char *) addr, &sin6, sizeof(sin6));
2299 break;
2300 }
2301#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002302
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002303 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002304 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002305 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002306 return NULL;
2307 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002308
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002309 if (tmp == NULL)
2310 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002311
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002312 status = PyList_Append(addr_list, tmp);
2313 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002314
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002315 if (status)
2316 goto err;
2317 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002318
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002319 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002320
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002321 err:
2322 Py_XDECREF(name_list);
2323 Py_XDECREF(addr_list);
2324 return rtn_tuple;
2325}
2326
2327
2328/* Python interface to gethostbyname_ex(name). */
2329
2330/*ARGSUSED*/
2331static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002332socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002333{
2334 char *name;
2335 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002336 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002337 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002338 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002339#ifdef HAVE_GETHOSTBYNAME_R
2340 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002341#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2342 struct hostent_data data;
2343#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002344 char buf[16384];
2345 int buf_len = (sizeof buf) - 1;
2346 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002347#endif
2348#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002349 int result;
2350#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002351#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002352
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002353 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002354 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002355 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002356 return NULL;
2357 Py_BEGIN_ALLOW_THREADS
2358#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002359#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002360 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2361 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002362#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002363 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002364#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002365 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002366 result = gethostbyname_r(name, &hp_allocated, &data);
2367 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002368#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002369#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002370#ifdef USE_GETHOSTBYNAME_LOCK
2371 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002372#endif
2373 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002374#endif /* HAVE_GETHOSTBYNAME_R */
2375 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002376 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002377 addr.ss_family.
2378 Therefore, we cast the sockaddr_storage into sockaddr to
2379 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002380 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002381 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002382 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002383#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002384 PyThread_release_lock(gethostbyname_lock);
2385#endif
2386 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002387}
2388
2389static char ghbn_ex_doc[] =
2390"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2391\n\
2392Return the true host name, a list of aliases, and a list of IP addresses,\n\
2393for a host. The host argument is a string giving a host name or IP number.";
2394
2395
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002396/* Python interface to gethostbyaddr(IP). */
2397
2398/*ARGSUSED*/
2399static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002400socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002401{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002402#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002403 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002404#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002405 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002406#endif
2407 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002408 char *ip_num;
2409 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002410 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002411#ifdef HAVE_GETHOSTBYNAME_R
2412 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002413#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2414 struct hostent_data data;
2415#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002416 char buf[16384];
2417 int buf_len = (sizeof buf) - 1;
2418 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002419#endif
2420#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002421 int result;
2422#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002423#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002424 char *ap;
2425 int al;
2426 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002427
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002428 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002429 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002430 af = PF_UNSPEC;
2431 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002432 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002433 af = sa->sa_family;
2434 ap = NULL;
2435 al = 0;
2436 switch (af) {
2437 case AF_INET:
2438 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2439 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2440 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002441#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002442 case AF_INET6:
2443 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2444 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2445 break;
2446#endif
2447 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002448 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002449 return NULL;
2450 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002451 Py_BEGIN_ALLOW_THREADS
2452#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002453#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002454 result = gethostbyaddr_r(ap, al, af,
2455 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002456 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002457#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002458 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002459 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002460#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002461 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002462 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002463 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002464#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002465#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002466#ifdef USE_GETHOSTBYNAME_LOCK
2467 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002468#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002469 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002470#endif /* HAVE_GETHOSTBYNAME_R */
2471 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002472 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002473#ifdef USE_GETHOSTBYNAME_LOCK
2474 PyThread_release_lock(gethostbyname_lock);
2475#endif
2476 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002477}
2478
Guido van Rossum82a5c661998-07-07 20:45:43 +00002479static char gethostbyaddr_doc[] =
2480"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2481\n\
2482Return the true host name, a list of aliases, and a list of IP addresses,\n\
2483for a host. The host argument is a string giving a host name or IP number.";
2484
Guido van Rossum30a685f1991-06-27 15:51:29 +00002485
2486/* Python interface to getservbyname(name).
2487 This only returns the port number, since the other info is already
2488 known or not useful (like the list of aliases). */
2489
2490/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002491static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002492socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002493{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002494 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002495 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002496 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002497 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002498 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002499 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002500 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002501 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002502 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002503 return NULL;
2504 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002505 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002506}
2507
Guido van Rossum82a5c661998-07-07 20:45:43 +00002508static char getservbyname_doc[] =
2509"getservbyname(servicename, protocolname) -> integer\n\
2510\n\
2511Return a port number from a service name and protocol name.\n\
2512The protocol name should be 'tcp' or 'udp'.";
2513
Guido van Rossum30a685f1991-06-27 15:51:29 +00002514
Guido van Rossum3901d851996-12-19 16:35:04 +00002515/* Python interface to getprotobyname(name).
2516 This only returns the protocol number, since the other info is
2517 already known or not useful (like the list of aliases). */
2518
2519/*ARGSUSED*/
2520static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002521socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002522{
2523 char *name;
2524 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002525#ifdef __BEOS__
2526/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002527 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002528 return NULL;
2529#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002530 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002531 return NULL;
2532 Py_BEGIN_ALLOW_THREADS
2533 sp = getprotobyname(name);
2534 Py_END_ALLOW_THREADS
2535 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002536 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002537 return NULL;
2538 }
2539 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002540#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002541}
2542
Guido van Rossum82a5c661998-07-07 20:45:43 +00002543static char getprotobyname_doc[] =
2544"getprotobyname(name) -> integer\n\
2545\n\
2546Return the protocol number for the named protocol. (Rarely used.)";
2547
Guido van Rossum3901d851996-12-19 16:35:04 +00002548
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002549#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002550/* Create a socket object from a numeric file description.
2551 Useful e.g. if stdin is a socket.
2552 Additional arguments as for socket(). */
2553
2554/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002555static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002556socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002557{
Guido van Rossum73624e91994-10-10 17:59:00 +00002558 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002559 SOCKET_T fd;
2560 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002561 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2562 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002563 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002564 /* Dup the fd so it and the socket can be closed independently */
2565 fd = dup(fd);
2566 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002567 return set_error();
2568 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002569 /* From now on, ignore SIGPIPE and let the error checking
2570 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002571#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002572 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002573#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002574 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002575}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002576
2577static char fromfd_doc[] =
2578"fromfd(fd, family, type[, proto]) -> socket object\n\
2579\n\
2580Create a socket object from the given file descriptor.\n\
2581The remaining arguments are the same as for socket().";
2582
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002583#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002584
Guido van Rossum82a5c661998-07-07 20:45:43 +00002585
Guido van Rossum006bf911996-06-12 04:04:55 +00002586static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002587socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002588{
2589 int x1, x2;
2590
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002591 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002592 return NULL;
2593 }
2594 x2 = (int)ntohs((short)x1);
2595 return PyInt_FromLong(x2);
2596}
2597
Guido van Rossum82a5c661998-07-07 20:45:43 +00002598static char ntohs_doc[] =
2599"ntohs(integer) -> integer\n\
2600\n\
2601Convert a 16-bit integer from network to host byte order.";
2602
2603
Guido van Rossum006bf911996-06-12 04:04:55 +00002604static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002605socket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002606{
2607 int x1, x2;
2608
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002609 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002610 return NULL;
2611 }
2612 x2 = ntohl(x1);
2613 return PyInt_FromLong(x2);
2614}
2615
Guido van Rossum82a5c661998-07-07 20:45:43 +00002616static char ntohl_doc[] =
2617"ntohl(integer) -> integer\n\
2618\n\
2619Convert a 32-bit integer from network to host byte order.";
2620
2621
Guido van Rossum006bf911996-06-12 04:04:55 +00002622static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002623socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002624{
2625 int x1, x2;
2626
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002627 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002628 return NULL;
2629 }
2630 x2 = (int)htons((short)x1);
2631 return PyInt_FromLong(x2);
2632}
2633
Guido van Rossum82a5c661998-07-07 20:45:43 +00002634static char htons_doc[] =
2635"htons(integer) -> integer\n\
2636\n\
2637Convert a 16-bit integer from host to network byte order.";
2638
2639
Guido van Rossum006bf911996-06-12 04:04:55 +00002640static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002641socket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002642{
2643 int x1, x2;
2644
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002645 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002646 return NULL;
2647 }
2648 x2 = htonl(x1);
2649 return PyInt_FromLong(x2);
2650}
2651
Guido van Rossum82a5c661998-07-07 20:45:43 +00002652static char htonl_doc[] =
2653"htonl(integer) -> integer\n\
2654\n\
2655Convert a 32-bit integer from host to network byte order.";
2656
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002657/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002658
Guido van Rossum48a680c2001-03-02 06:34:14 +00002659static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002660"inet_aton(string) -> packed 32-bit IP representation\n\
2661\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002662Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002663binary format used in low-level network functions.";
2664
2665static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002666socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002667{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002668#ifndef INADDR_NONE
2669#define INADDR_NONE (-1)
2670#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002671
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002672 /* Have to use inet_addr() instead */
2673 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002674 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002675
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002676 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002677 return NULL;
2678 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002679 packed_addr = inet_addr(ip_addr);
2680
2681 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002682 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002683 "illegal IP address string passed to inet_aton");
2684 return NULL;
2685 }
2686
2687 return PyString_FromStringAndSize((char *) &packed_addr,
2688 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002689}
2690
Guido van Rossum48a680c2001-03-02 06:34:14 +00002691static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002692"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002693\n\
2694Convert an IP address from 32-bit packed binary format to string format";
2695
2696static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002697socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002698{
2699 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002700 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002701 struct in_addr packed_addr;
2702
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002703 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002704 return NULL;
2705 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002706
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002707 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002708 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002709 "packed IP wrong length for inet_ntoa");
2710 return NULL;
2711 }
2712
2713 memcpy(&packed_addr, packed_str, addr_len);
2714
2715 return PyString_FromString(inet_ntoa(packed_addr));
2716}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002717
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002718/* Python interface to getaddrinfo(host, port). */
2719
2720/*ARGSUSED*/
2721static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002722socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002723{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002724 struct addrinfo hints, *res;
2725 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002726 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002727 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002728 char *hptr, *pptr;
2729 int family, socktype, protocol, flags;
2730 int error;
2731 PyObject *all = (PyObject *)NULL;
2732 PyObject *single = (PyObject *)NULL;
2733
2734 family = socktype = protocol = flags = 0;
2735 family = PF_UNSPEC;
2736 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2737 &hptr, &pobj, &family, &socktype,
2738 &protocol, &flags)) {
2739 return NULL;
2740 }
2741 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002742 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002743 pptr = pbuf;
2744 } else if (PyString_Check(pobj)) {
2745 pptr = PyString_AsString(pobj);
2746 } else if (pobj == Py_None) {
2747 pptr = (char *)NULL;
2748 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002749 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002750 return NULL;
2751 }
2752 memset(&hints, 0, sizeof(hints));
2753 hints.ai_family = family;
2754 hints.ai_socktype = socktype;
2755 hints.ai_protocol = protocol;
2756 hints.ai_flags = flags;
2757 error = getaddrinfo(hptr, pptr, &hints, &res0);
2758 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002759 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002760 return NULL;
2761 }
2762
2763 if ((all = PyList_New(0)) == NULL)
2764 goto err;
2765 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002766 PyObject *addr =
2767 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2768 if (addr == NULL)
2769 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002770 single = Py_BuildValue("iiisO", res->ai_family,
2771 res->ai_socktype, res->ai_protocol,
2772 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002773 addr);
2774 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002775 if (single == NULL)
2776 goto err;
2777
2778 if (PyList_Append(all, single))
2779 goto err;
2780 Py_XDECREF(single);
2781 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002782 return all;
2783 err:
2784 Py_XDECREF(single);
2785 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002786 if (res0)
2787 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002788 return (PyObject *)NULL;
2789}
2790
2791static char getaddrinfo_doc[] =
2792"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2793 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2794\n\
2795Resolve host and port into addrinfo struct.";
2796
2797/* Python interface to getnameinfo(sa, flags). */
2798
2799/*ARGSUSED*/
2800static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002801socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002802{
2803 PyObject *sa = (PyObject *)NULL;
2804 int flags;
2805 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002806 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002807 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2808 struct addrinfo hints, *res = NULL;
2809 int error;
2810 PyObject *ret = (PyObject *)NULL;
2811
2812 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002813 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002814 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002815 if (!PyArg_ParseTuple(sa, "si|ii",
2816 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002817 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002818 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002819 memset(&hints, 0, sizeof(hints));
2820 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002821 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002822 error = getaddrinfo(hostp, pbuf, &hints, &res);
2823 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002824 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002825 goto fail;
2826 }
2827 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002828 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002829 "sockaddr resolved to multiple addresses");
2830 goto fail;
2831 }
2832 switch (res->ai_family) {
2833 case AF_INET:
2834 {
2835 char *t1;
2836 int t2;
2837 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002838 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002839 "IPv4 sockaddr must be 2 tuple");
2840 goto fail;
2841 }
2842 break;
2843 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002844#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002845 case AF_INET6:
2846 {
2847 struct sockaddr_in6 *sin6;
2848 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2849 sin6->sin6_flowinfo = flowinfo;
2850 sin6->sin6_scope_id = scope_id;
2851 break;
2852 }
2853#endif
2854 }
2855 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2856 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2857 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002858 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002859 goto fail;
2860 }
2861 ret = Py_BuildValue("ss", hbuf, pbuf);
2862
2863fail:
2864 if (res)
2865 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002866 return ret;
2867}
2868
2869static char getnameinfo_doc[] =
2870"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2871\n\
2872Get host and port for a sockaddr.";
2873
Guido van Rossum30a685f1991-06-27 15:51:29 +00002874/* List of functions exported by this module. */
2875
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002876static PyMethodDef socket_methods[] = {
2877 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002878 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002879 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002880 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002881 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002882 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002883 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002884 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002885 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002886 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002887 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002888 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002889#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002890 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002891 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002892#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002893 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002894 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002895 {"ntohl", socket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002896 METH_VARARGS, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002897 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002898 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002899 {"htonl", socket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002900 METH_VARARGS, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002901 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002902 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002903 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002904 METH_VARARGS, inet_ntoa_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002905 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002906 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002907 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002908 METH_VARARGS, getnameinfo_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002909 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002910};
2911
Guido van Rossum30a685f1991-06-27 15:51:29 +00002912
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002913#ifdef RISCOS
2914#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00002915
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002916static int
2917os_init(void)
2918{
2919 _kernel_swi_regs r;
2920
2921 r.r[0] = 0;
2922 _kernel_swi(0x43380, &r, &r);
2923 taskwindow = r.r[0];
2924
2925 return 0;
2926}
2927
2928#endif /* RISCOS */
2929
2930
2931#ifdef MS_WINDOWS
2932#define OS_INIT_DEFINED
2933
2934/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002935
2936static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002937os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002938{
2939 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002940}
2941
2942static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002943os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002944{
2945 WSADATA WSAData;
2946 int ret;
2947 char buf[100];
2948 ret = WSAStartup(0x0101, &WSAData);
2949 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002950 case 0: /* No error */
2951 atexit(os_cleanup);
2952 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002953 case WSASYSNOTREADY:
2954 PyErr_SetString(PyExc_ImportError,
2955 "WSAStartup failed: network not ready");
2956 break;
2957 case WSAVERNOTSUPPORTED:
2958 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002959 PyErr_SetString(
2960 PyExc_ImportError,
2961 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00002962 break;
2963 default:
Tim Peters885d4572001-11-28 20:27:42 +00002964 PyOS_snprintf(buf, sizeof(buf),
2965 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002966 PyErr_SetString(PyExc_ImportError, buf);
2967 break;
2968 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002969 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002970}
2971
Guido van Rossum8d665e61996-06-26 18:22:49 +00002972#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002973
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002974
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002975#ifdef PYOS_OS2
2976#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002977
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002978/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002979
2980static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002981os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002982{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002983#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002984 char reason[64];
2985 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002986
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002987 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002988 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002989 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002990
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002991 PyOS_snprintf(reason, sizeof(reason),
2992 "OS/2 TCP/IP Error# %d", sock_errno());
2993 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002994
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002995 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002996#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002997 /* No need to initialise sockets with GCC/EMX */
2998 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002999#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003000}
3001
3002#endif /* PYOS_OS2 */
3003
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003004
3005#ifndef OS_INIT_DEFINED
3006static int
3007os_init(void)
3008{
3009 return 1; /* Success */
3010}
3011#endif
3012
3013
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003014/* C API table - always add new things to the end for binary
3015 compatibility. */
3016static
3017PySocketModule_APIObject PySocketModuleAPI =
3018{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003019 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003020};
3021
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003022
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003023/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003024
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003025 This module is actually called "_socket", and there's a wrapper
3026 "socket.py" which implements some additional functionality. On some
3027 platforms (e.g. Windows and OS/2), socket.py also implements a
3028 wrapper for the socket type that provides missing functionality such
3029 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3030 with an ImportError exception if os-specific initialization fails.
3031 On Windows, this does WINSOCK initialization. When WINSOCK is
3032 initialized succesfully, a call to WSACleanup() is scheduled to be
3033 made at exit time.
3034*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003035
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003036static char socket_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00003037"Implementation module for socket operations. See the socket module\n\
3038for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00003039
Guido van Rossum3886bb61998-12-04 18:50:17 +00003040DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003041init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003042{
Fred Drake4baedc12002-04-01 14:53:37 +00003043 PyObject *m;
Fred Drake4baedc12002-04-01 14:53:37 +00003044
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003045 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003046 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003047
3048 sock_type.ob_type = &PyType_Type;
3049 sock_type.tp_getattro = PyObject_GenericGetAttr;
3050 sock_type.tp_alloc = PyType_GenericAlloc;
3051 sock_type.tp_free = PyObject_Del;
3052 m = Py_InitModule3(PySocket_MODULE_NAME,
3053 socket_methods,
3054 socket_doc);
3055
3056 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3057 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003058 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003059 Py_INCREF(socket_error);
3060 PyModule_AddObject(m, "error", socket_error);
3061 socket_herror = PyErr_NewException("socket.herror",
3062 socket_error, NULL);
3063 if (socket_herror == NULL)
3064 return;
3065 Py_INCREF(socket_herror);
3066 PyModule_AddObject(m, "herror", socket_herror);
3067 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003068 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003069 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003070 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003071 Py_INCREF(socket_gaierror);
3072 PyModule_AddObject(m, "gaierror", socket_gaierror);
3073 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003074 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003075 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003076 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003077 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003078 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003079 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003080 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003081
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003082 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003083 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003084 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3085 ) != 0)
3086 return;
3087
Guido van Rossum09be4091999-08-09 14:40:40 +00003088 /* Address families (we only support AF_INET and AF_UNIX) */
3089#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003090 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003091#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003092 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003093#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003094 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003095#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003096#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00003097 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003098#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003099#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003100 /* Amateur Radio AX.25 */
3101 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003102#endif
3103#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003104 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003105#endif
3106#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003107 /* Appletalk DDP */
3108 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003109#endif
3110#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003111 /* Amateur radio NetROM */
3112 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003113#endif
3114#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003115 /* Multiprotocol bridge */
3116 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003117#endif
3118#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003119 /* Reserved for Werner's ATM */
3120 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003121#endif
3122#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003123 /* Reserved for X.25 project */
3124 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003125#endif
3126#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003127 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003128#endif
3129#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003130 /* Amateur Radio X.25 PLP */
3131 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003132#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003133#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003134 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3135 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3136 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3137 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3138 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3139 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3140 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3141 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3142 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003143#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003144
3145 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003146 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3147 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003148#ifndef __BEOS__
3149/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003150 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3151 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3152 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003153#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003154
3155#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003156 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003157#endif
3158#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003159 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003160#endif
3161#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003162 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003163#endif
3164#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003165 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003166#endif
3167#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003168 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003169#endif
3170#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003171 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003172#endif
3173#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003174 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003175#endif
3176#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003177 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003178#endif
3179#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003180 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003181#endif
3182#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003183 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003184#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003185#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003186 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003187#endif
3188#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003189 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003190#endif
3191#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003192 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003193#endif
3194#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003195 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003196#endif
3197#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003198 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003199#endif
3200#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003201 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003202#endif
3203#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003204 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003205#endif
3206#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003207 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003208#endif
3209
3210 /* Maximum number of connections for "listen" */
3211#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003212 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003213#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003214 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003215#endif
3216
3217 /* Flags for send, recv */
3218#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003219 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003220#endif
3221#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003222 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003223#endif
3224#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003225 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003226#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003227#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003228 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003229#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003230#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003231 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003232#endif
3233#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003234 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003235#endif
3236#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003237 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003238#endif
3239#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003240 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003241#endif
3242#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003243 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003244#endif
3245#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003246 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003247#endif
3248
3249 /* Protocol level and numbers, usable for [gs]etsockopt */
3250#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003251 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003252#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003253#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003254 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003255#else
Fred Drake4baedc12002-04-01 14:53:37 +00003256 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003257#endif
3258#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003259 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003260#endif
3261#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003262 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003263#endif
3264#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003265 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003266#endif
3267#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003268 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003269#endif
3270#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003271 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003272#endif
3273#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003274 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003275#else
Fred Drake4baedc12002-04-01 14:53:37 +00003276 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003277#endif
3278#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003279 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003280#else
Fred Drake4baedc12002-04-01 14:53:37 +00003281 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003282#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003283#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003284 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003285#else
Fred Drake4baedc12002-04-01 14:53:37 +00003286 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003287#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003288#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003289 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003290#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003291#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003292 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003293#else
Fred Drake4baedc12002-04-01 14:53:37 +00003294 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003295#endif
3296#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003297 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003298#endif
3299#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003300 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003301#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003302#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003303 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003304#endif
3305#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003306 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003307#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003308#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003309 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003310#else
Fred Drake4baedc12002-04-01 14:53:37 +00003311 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003312#endif
3313#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003314 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003315#endif
3316#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003317 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003318#endif
3319#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003320 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003321#else
Fred Drake4baedc12002-04-01 14:53:37 +00003322 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003323#endif
3324#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003325 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003326#endif
3327#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003328 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003329#endif
3330#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003331 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003332#endif
3333#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003334 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003335#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003336#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003337 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003338#endif
3339#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003340 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003341#endif
3342#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003343 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003344#endif
3345#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003346 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003347#endif
3348#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003349 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003350#endif
3351#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003352 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003353#endif
3354#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003355 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003356#endif
3357#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003358 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003359#endif
3360#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003361 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003362#endif
3363#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003364 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003365#endif
3366#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003367 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003368#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003369#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003370 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003371#endif
3372#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003373 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003374#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003375#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003376 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003377#endif
3378#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003379 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003380#endif
3381#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003382 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003383#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003384#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003385 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003386#endif
3387/**/
3388#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003389 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003390#else
Fred Drake4baedc12002-04-01 14:53:37 +00003391 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003392#endif
3393#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003394 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003395#endif
3396
3397 /* Some port configuration */
3398#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003399 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003400#else
Fred Drake4baedc12002-04-01 14:53:37 +00003401 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003402#endif
3403#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003404 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003405#else
Fred Drake4baedc12002-04-01 14:53:37 +00003406 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003407#endif
3408
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003409 /* Some reserved IP v.4 addresses */
3410#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003411 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003412#else
Fred Drake4baedc12002-04-01 14:53:37 +00003413 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003414#endif
3415#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003416 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003417#else
Fred Drake4baedc12002-04-01 14:53:37 +00003418 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003419#endif
3420#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003421 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003422#else
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003424#endif
3425#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003426 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003427#else
Fred Drake4baedc12002-04-01 14:53:37 +00003428 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003429#endif
3430#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003431 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3432 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003433#else
Fred Drake4baedc12002-04-01 14:53:37 +00003434 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003435#endif
3436#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003437 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3438 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003439#else
Fred Drake4baedc12002-04-01 14:53:37 +00003440 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003441#endif
3442#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003443 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003444#else
Fred Drake4baedc12002-04-01 14:53:37 +00003445 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003446#endif
3447
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003448 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003449#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003450 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003451#endif
3452#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003453 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003454#endif
3455#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003456 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003457#endif
3458#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003459 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003460#endif
3461#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003462 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003463#endif
3464#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003465 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003466#endif
3467#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003468 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003469#endif
3470#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003471 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003472#endif
3473#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003474 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003475#endif
3476#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003477 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003478#endif
3479#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003480 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003481#endif
3482#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003483 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003484#endif
3485#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003486 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003487#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003488#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003489 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3490 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003491#endif
3492#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003493 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3494 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003495#endif
3496#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003497 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003498#endif
3499
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003500 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3501#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003502 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003503#endif
3504#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003505 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003506#endif
3507#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003508 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003509#endif
3510#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003511 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003512#endif
3513#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003514 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003515#endif
3516#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003517 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003518#endif
3519
Guido van Rossum09be4091999-08-09 14:40:40 +00003520 /* TCP options */
3521#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003522 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003523#endif
3524#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003525 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003526#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003527#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003528 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003529#endif
3530#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003531 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003532#endif
3533#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003534 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003535#endif
3536#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003537 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003538#endif
3539#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003540 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003541#endif
3542#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003543 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003544#endif
3545#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003546 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003547#endif
3548#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003549 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003550#endif
3551#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003552 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003553#endif
3554#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003555 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003556#endif
3557
Guido van Rossum09be4091999-08-09 14:40:40 +00003558
3559 /* IPX options */
3560#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003561 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003562#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003563
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003564 /* get{addr,name}info parameters */
3565#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003566 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003567#endif
3568#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003569 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003570#endif
3571#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003572 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003573#endif
3574#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003575 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003576#endif
3577#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003578 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003579#endif
3580#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003581 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003582#endif
3583#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003584 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003585#endif
3586#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003587 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003588#endif
3589#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003590 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003591#endif
3592#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003593 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003594#endif
3595#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003596 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003597#endif
3598#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003599 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003600#endif
3601#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003602 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003603#endif
3604#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003605 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003606#endif
3607#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003608 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003609#endif
3610#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003611 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003612#endif
3613#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003614 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003615#endif
3616#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003617 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003618#endif
3619#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003620 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003621#endif
3622#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003623 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003624#endif
3625#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003626 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003627#endif
3628#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003629 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003630#endif
3631#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003632 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003633#endif
3634#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003635 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003636#endif
3637#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003638 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003639#endif
3640#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003641 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003642#endif
3643#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003644 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003645#endif
3646#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003647 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003648#endif
3649#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003650 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003651#endif
3652#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003653 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003654#endif
3655
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003656 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003657#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003658 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003659#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003660}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003661
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003662
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003663#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003664
3665/* Simplistic emulation code for inet_pton that only works for IPv4 */
3666
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003667int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003668inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003669{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003670 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003671 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003672 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003673 if (packed_addr == INADDR_NONE)
3674 return 0;
3675 memcpy(dst, &packed_addr, 4);
3676 return 1;
3677 }
3678 /* Should set errno to EAFNOSUPPORT */
3679 return -1;
3680}
3681
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003682const char *
3683inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003684{
3685 if (af == AF_INET) {
3686 struct in_addr packed_addr;
3687 if (size < 16)
3688 /* Should set errno to ENOSPC. */
3689 return NULL;
3690 memcpy(&packed_addr, src, sizeof(packed_addr));
3691 return strncpy(dst, inet_ntoa(packed_addr), size);
3692 }
3693 /* Should set errno to EAFNOSUPPORT */
3694 return NULL;
3695}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003696
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003697#endif