blob: 5314dcfc213a8e116c0f196df9c36619bc6a9306 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Jeremy Hylton22308652001-02-02 03:23:09 +000010 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000011- No read/write operations (use sendall/recv or makefile instead).
12- Additional restrictions apply on some non-Unix platforms (compensated
13 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000018- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
19 a subclass of socket.error
20- socket.herror: exception raised for gethostby* errors,
21 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000022- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000023- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000024- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000025- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000027- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000028- socket.ntohs(16 bit value) --> new int object
29- socket.ntohl(32 bit value) --> new int object
30- socket.htons(16 bit value) --> new int object
31- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000032- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
33 --> List of (family, socktype, proto, canonname, sockaddr)
34- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000035- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000036- socket.inet_aton(IP address) -> 32-bit packed IP representation
37- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum6574b3e1991-06-25 21:36:08 +000038- an Internet socket address is a pair (hostname, port)
39 where hostname can be anything recognized by gethostbyname()
40 (including the dd.dd.dd.dd notation) and port is in host byte order
41- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000042- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000043- an AF_PACKET socket address is a tuple containing a string
44 specifying the ethernet interface and an integer specifying
45 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000046 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
47 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000048 networking code, but accepted since they are returned by the
49 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000050
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000051Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000052
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000053- names starting with sock_ are socket object methods
54- names starting with socket_ are module-level functions
55- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000056
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057*/
58
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000059#include "Python.h"
60
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000061/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000062PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000063"socket([family[, type[, proto]]]) -> socket object\n\
64\n\
65Open a socket of the given type. The family argument specifies the\n\
66address family; it defaults to AF_INET. The type argument specifies\n\
67whether this is a stream (SOCK_STREAM, this is the default)\n\
68or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
69specifying the default protocol. Keyword arguments are accepted.\n\
70\n\
71A socket object represents one endpoint of a network connection.\n\
72\n\
73Methods of socket objects (keyword arguments not allowed):\n\
74\n\
75accept() -- accept a connection, returning new socket and client address\n\
76bind(addr) -- bind the socket to a local address\n\
77close() -- close the socket\n\
78connect(addr) -- connect the socket to a remote address\n\
79connect_ex(addr) -- connect, return an error code instead of an exception\n\
80dup() -- return a new socket object identical to the current one [*]\n\
81fileno() -- return underlying file descriptor\n\
82getpeername() -- return remote address [*]\n\
83getsockname() -- return local address\n\
84getsockopt(level, optname[, buflen]) -- get socket options\n\
85gettimeout() -- return timeout or None\n\
86listen(n) -- start listening for incoming connections\n\
87makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
88recv(buflen[, flags]) -- receive data\n\
89recvfrom(buflen[, flags]) -- receive data and sender's address\n\
90sendall(data[, flags]) -- send all data\n\
91send(data[, flags]) -- send data, may not send all of it\n\
92sendto(data[, flags], addr) -- send data to a given address\n\
93setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
94setsockopt(level, optname, value) -- set socket options\n\
95settimeout(None | float) -- set or clear the timeout\n\
96shutdown(how) -- shut down traffic in one or both directions\n\
97\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000098 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +000099
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000100/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
101 I hope some day someone can clean this up please... */
102
Guido van Rossum9376b741999-09-15 22:01:40 +0000103/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
104 script doesn't get this right, so we hardcode some platform checks below.
105 On the other hand, not all Linux versions agree, so there the settings
106 computed by the configure script are needed! */
107
108#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000109# undef HAVE_GETHOSTBYNAME_R_3_ARG
110# undef HAVE_GETHOSTBYNAME_R_5_ARG
111# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000112#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000113
Guido van Rossum7a122991999-04-13 04:07:32 +0000114#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000115# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000116#endif
117
Guido van Rossume7de2061999-03-24 17:24:33 +0000118#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000119# if defined(_AIX) || defined(__osf__)
120# define HAVE_GETHOSTBYNAME_R_3_ARG
121# elif defined(__sun) || defined(__sgi)
122# define HAVE_GETHOSTBYNAME_R_5_ARG
123# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000124/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000125# else
126# undef HAVE_GETHOSTBYNAME_R
127# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000128#endif
129
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000130#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
131 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000132# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000133#endif
134
135#ifdef USE_GETHOSTBYNAME_LOCK
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000136# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000137#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000138
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000139#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# include <types.h>
141# include <io.h>
142# include <sys/ioctl.h>
143# include <utils.h>
144# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000145#endif
146
147#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000148# define INCL_DOS
149# define INCL_DOSERRORS
150# define INCL_NOPMAPI
151# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000152#endif
153
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000154/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000155#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000156#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000158/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000160#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161
162/* Addressing includes */
163
Guido van Rossum6f489d91996-06-28 20:15:15 +0000164#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000165
166/* Non-MS WINDOWS includes */
167# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000168
Guido van Rossum9376b741999-09-15 22:01:40 +0000169/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000170# ifdef __BEOS__
171# include <net/netdb.h>
172# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
173# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000174typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000175# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000178
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# ifndef RISCOS
180# include <fcntl.h>
181# else
182# include <sys/fcntl.h>
183# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000184int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000185# endif
186
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000187#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000188
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000189/* MS_WINDOWS includes */
190# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000191
Jeremy Hylton22308652001-02-02 03:23:09 +0000192#endif
193
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000194#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000195# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000196#endif
197
198#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000199# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000200#endif
201
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000202#ifndef O_NDELAY
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000203# define O_NDELAY O_NONBLOCK /* For QNX only? */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000204#endif
205
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000206#include "addrinfo.h"
207
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000208#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000209int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000210const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000211#endif
212
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000213#ifdef __APPLE__
214/* On OS X, getaddrinfo returns no error indication of lookup
215 failure, so we must use the emulation instead of the libinfo
216 implementation. Unfortunately, performing an autoconf test
217 for this bug would require DNS access for the machine performing
218 the configuration, which is not acceptable. Therefore, we
219 determine the bug just by checking for __APPLE__. If this bug
220 gets ever fixed, perhaps checking for sys/version.h would be
221 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000222#ifndef HAVE_GETNAMEINFO
223/* This bug seems to be fixed in Jaguar. Ths easiest way I could
224 Find to check for Jaguar is that it has getnameinfo(), which
225 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000226#undef HAVE_GETADDRINFO
227/* avoid clashes with the C library definition of the symbol. */
228#define getaddrinfo fake_getaddrinfo
229#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000230#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000231
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000232/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000233#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000234#include "getaddrinfo.c"
235#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000236#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000237#include "getnameinfo.c"
238#endif
239
Guido van Rossumbcc20741998-08-04 22:53:56 +0000240#if defined(MS_WINDOWS) || defined(__BEOS__)
241/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000242/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000243#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000244#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000245#endif
246
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000247#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000248#define EAFNOSUPPORT WSAEAFNOSUPPORT
249#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000250#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000251
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000252#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000253#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000254#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000255#endif
256
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000257#ifndef SOCKETCLOSE
258#define SOCKETCLOSE close
259#endif
260
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000261/* XXX There's a problem here: *static* functions are not supposed to have
262 a Py prefix (or use CapitalizedWords). Later... */
263
Guido van Rossum30a685f1991-06-27 15:51:29 +0000264/* Global variable holding the exception type for errors detected
265 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000266static PyObject *socket_error;
267static PyObject *socket_herror;
268static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000269
Guido van Rossum48a680c2001-03-02 06:34:14 +0000270#ifdef RISCOS
271/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
272static int taskwindow;
273#endif
274
Tim Peters643a7fc2002-02-17 04:13:21 +0000275/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000276 The sock_type variable contains pointers to various functions,
277 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000278 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000279static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000280
Guido van Rossum30a685f1991-06-27 15:51:29 +0000281/* Convenience function to raise an error according to errno
282 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000283
Guido van Rossum73624e91994-10-10 17:59:00 +0000284static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000285set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000286{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000287#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000288 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000289 static struct {
290 int no;
291 const char *msg;
292 } *msgp, msgs[] = {
293 {WSAEINTR, "Interrupted system call"},
294 {WSAEBADF, "Bad file descriptor"},
295 {WSAEACCES, "Permission denied"},
296 {WSAEFAULT, "Bad address"},
297 {WSAEINVAL, "Invalid argument"},
298 {WSAEMFILE, "Too many open files"},
299 {WSAEWOULDBLOCK,
300 "The socket operation could not complete "
301 "without blocking"},
302 {WSAEINPROGRESS, "Operation now in progress"},
303 {WSAEALREADY, "Operation already in progress"},
304 {WSAENOTSOCK, "Socket operation on non-socket"},
305 {WSAEDESTADDRREQ, "Destination address required"},
306 {WSAEMSGSIZE, "Message too long"},
307 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
308 {WSAENOPROTOOPT, "Protocol not available"},
309 {WSAEPROTONOSUPPORT, "Protocol not supported"},
310 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
311 {WSAEOPNOTSUPP, "Operation not supported"},
312 {WSAEPFNOSUPPORT, "Protocol family not supported"},
313 {WSAEAFNOSUPPORT, "Address family not supported"},
314 {WSAEADDRINUSE, "Address already in use"},
315 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
316 {WSAENETDOWN, "Network is down"},
317 {WSAENETUNREACH, "Network is unreachable"},
318 {WSAENETRESET, "Network dropped connection on reset"},
319 {WSAECONNABORTED, "Software caused connection abort"},
320 {WSAECONNRESET, "Connection reset by peer"},
321 {WSAENOBUFS, "No buffer space available"},
322 {WSAEISCONN, "Socket is already connected"},
323 {WSAENOTCONN, "Socket is not connected"},
324 {WSAESHUTDOWN, "Can't send after socket shutdown"},
325 {WSAETOOMANYREFS, "Too many references: can't splice"},
326 {WSAETIMEDOUT, "Operation timed out"},
327 {WSAECONNREFUSED, "Connection refused"},
328 {WSAELOOP, "Too many levels of symbolic links"},
329 {WSAENAMETOOLONG, "File name too long"},
330 {WSAEHOSTDOWN, "Host is down"},
331 {WSAEHOSTUNREACH, "No route to host"},
332 {WSAENOTEMPTY, "Directory not empty"},
333 {WSAEPROCLIM, "Too many processes"},
334 {WSAEUSERS, "Too many users"},
335 {WSAEDQUOT, "Disc quota exceeded"},
336 {WSAESTALE, "Stale NFS file handle"},
337 {WSAEREMOTE, "Too many levels of remote in path"},
338 {WSASYSNOTREADY, "Network subsystem is unvailable"},
339 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
340 {WSANOTINITIALISED,
341 "Successful WSAStartup() not yet performed"},
342 {WSAEDISCON, "Graceful shutdown in progress"},
343 /* Resolver errors */
344 {WSAHOST_NOT_FOUND, "No such host is known"},
345 {WSATRY_AGAIN, "Host not found, or server failed"},
346 {WSANO_RECOVERY, "Unexpected server error encountered"},
347 {WSANO_DATA, "Valid name without requested data"},
348 {WSANO_ADDRESS, "No address, look for MX record"},
349 {0, NULL}
350 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000351 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000352 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000353 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000354
Mark Hammond46a733d2000-07-24 01:45:11 +0000355 for (msgp = msgs; msgp->msg; msgp++) {
356 if (err_no == msgp->no) {
357 msg = msgp->msg;
358 break;
359 }
360 }
361
362 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000363 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000364 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000365 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000366 }
367 return NULL;
368 }
369 else
370#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000371
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000372#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000373 if (sock_errno() != NO_ERROR) {
374 APIRET rc;
375 ULONG msglen;
376 char outbuf[100];
377 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000378
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000379 /* Retrieve socket-related error message from MPTN.MSG file */
380 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
381 myerrorcode - SOCBASEERR + 26,
382 "mptn.msg",
383 &msglen);
384 if (rc == NO_ERROR) {
385 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000386
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000387 /* OS/2 doesn't guarantee a terminator */
388 outbuf[msglen] = '\0';
389 if (strlen(outbuf) > 0) {
390 /* If non-empty msg, trim CRLF */
391 char *lastc = &outbuf[ strlen(outbuf)-1 ];
392 while (lastc > outbuf && isspace(*lastc)) {
393 /* Trim trailing whitespace (CRLF) */
394 *lastc-- = '\0';
395 }
396 }
397 v = Py_BuildValue("(is)", myerrorcode, outbuf);
398 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000399 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000400 Py_DECREF(v);
401 }
402 return NULL;
403 }
404 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000405#endif
406
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000407 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000408}
409
Guido van Rossum30a685f1991-06-27 15:51:29 +0000410
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000411static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000412set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000413{
414 PyObject *v;
415
416#ifdef HAVE_HSTRERROR
417 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
418#else
419 v = Py_BuildValue("(is)", h_error, "host not found");
420#endif
421 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000422 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000423 Py_DECREF(v);
424 }
425
426 return NULL;
427}
428
429
430static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000431set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000432{
433 PyObject *v;
434
Martin v. Löwis272cb402002-03-01 08:31:07 +0000435#ifdef EAI_SYSTEM
436 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000437 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000438 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000439#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000440
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000441#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000442 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000443#else
444 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
445#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000446 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000447 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000448 Py_DECREF(v);
449 }
450
451 return NULL;
452}
453
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000454/* Function to perform the setting of socket blocking mode
455 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000456static int
457internal_setblocking(PySocketSockObject *s, int block)
458{
459#ifndef RISCOS
460#ifndef MS_WINDOWS
461 int delay_flag;
462#endif
463#endif
464
465 Py_BEGIN_ALLOW_THREADS
466#ifdef __BEOS__
467 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000468 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
469 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000470#else
471#ifndef RISCOS
472#ifndef MS_WINDOWS
473#if defined(PYOS_OS2) && !defined(PYCC_GCC)
474 block = !block;
475 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
476#else /* !PYOS_OS2 */
477 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
478 if (block)
479 delay_flag &= (~O_NDELAY);
480 else
481 delay_flag |= O_NDELAY;
482 fcntl(s->sock_fd, F_SETFL, delay_flag);
483#endif /* !PYOS_OS2 */
484#else /* MS_WINDOWS */
485 block = !block;
486 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
487#endif /* MS_WINDOWS */
488#endif /* __BEOS__ */
489#endif /* RISCOS */
490 Py_END_ALLOW_THREADS
491
492 /* Since these don't return anything */
493 return 1;
494}
495
Guido van Rossum11ba0942002-06-13 15:07:44 +0000496/* Do a select() on the socket, if necessary (sock_timeout > 0).
497 The argument writing indicates the direction.
498 This does not raise an exception or return a success indicator;
499 we'll let the actual socket call do that. */
500static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000501internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000502{
503 fd_set fds;
504 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000505
506 if (s->sock_timeout <= 0.0)
507 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000508
509 /* Construct the arguments to select */
510 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000511 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000512 FD_ZERO(&fds);
513 FD_SET(s->sock_fd, &fds);
514
515 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000516 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000517 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000518 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000519 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000520}
521
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000522/* Initialize a new socket object. */
523
524static void
525init_sockobject(PySocketSockObject *s,
526 SOCKET_T fd, int family, int type, int proto)
527{
528#ifdef RISCOS
529 int block = 1;
530#endif
531 s->sock_fd = fd;
532 s->sock_family = family;
533 s->sock_type = type;
534 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000535 s->sock_timeout = -1.0; /* Start without timeout */
536
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000537 s->errorhandler = &set_error;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000538#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000539 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000540 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000541#endif
542}
543
544
Guido van Rossum30a685f1991-06-27 15:51:29 +0000545/* Create a new socket object.
546 This just creates the object and initializes it.
547 If the creation fails, return NULL and set an exception (implicit
548 in NEWOBJ()). */
549
Guido van Rossum73624e91994-10-10 17:59:00 +0000550static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000551new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000552{
Guido van Rossum73624e91994-10-10 17:59:00 +0000553 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000554 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000555 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000556 if (s != NULL)
557 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000558 return s;
559}
560
Guido van Rossum30a685f1991-06-27 15:51:29 +0000561
Guido van Rossum48a680c2001-03-02 06:34:14 +0000562/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000563 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000564#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000565PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000566#endif
567
568
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569/* Convert a string specifying a host name or one of a few symbolic
570 names to a numeric IP address. This usually calls gethostbyname()
571 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000573 an error occurred; then an exception is raised. */
574
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000575static int
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000576setipaddr(char *name, struct sockaddr *addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578 struct addrinfo hints, *res;
579 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000580
Guido van Rossuma376cc51996-12-05 23:43:35 +0000581 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000583 int siz;
584 memset(&hints, 0, sizeof(hints));
585 hints.ai_family = af;
586 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
587 hints.ai_flags = AI_PASSIVE;
588 error = getaddrinfo(NULL, "0", &hints, &res);
589 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000590 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591 return -1;
592 }
593 switch (res->ai_family) {
594 case AF_INET:
595 siz = 4;
596 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000597#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000598 case AF_INET6:
599 siz = 16;
600 break;
601#endif
602 default:
603 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000604 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000605 "unsupported address family");
606 return -1;
607 }
608 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000609 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000610 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611 "wildcard resolved to multiple address");
612 return -1;
613 }
614 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
615 freeaddrinfo(res);
616 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000618 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000619 struct sockaddr_in *sin;
620 if (af != PF_INET && af != PF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000621 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000622 "address family mismatched");
623 return -1;
624 }
625 sin = (struct sockaddr_in *)addr_ret;
626 memset((void *) sin, '\0', sizeof(*sin));
627 sin->sin_family = AF_INET;
628#ifdef HAVE_SOCKADDR_SA_LEN
629 sin->sin_len = sizeof(*sin);
630#endif
631 sin->sin_addr.s_addr = INADDR_BROADCAST;
632 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000633 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000634 memset(&hints, 0, sizeof(hints));
635 hints.ai_family = af;
636 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000637#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000638 if (error == EAI_NONAME && af == AF_UNSPEC) {
639 /* On Tru64 V5.1, numeric-to-addr conversion fails
640 if no address family is given. Assume IPv4 for now.*/
641 hints.ai_family = AF_INET;
642 error = getaddrinfo(name, NULL, &hints, &res);
643 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000644#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000645 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000646 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000647 return -1;
648 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
650 freeaddrinfo(res);
651 switch (addr_ret->sa_family) {
652 case AF_INET:
653 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000654#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000655 case AF_INET6:
656 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000657#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000658 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000659 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000660 return -1;
661 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000662}
663
Guido van Rossum30a685f1991-06-27 15:51:29 +0000664
Guido van Rossum30a685f1991-06-27 15:51:29 +0000665/* Create a string object representing an IP address.
666 This is always a string of the form 'dd.dd.dd.dd' (with variable
667 size numbers). */
668
Guido van Rossum73624e91994-10-10 17:59:00 +0000669static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000670makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000671{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000672 char buf[NI_MAXHOST];
673 int error;
674
675 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
676 NI_NUMERICHOST);
677 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000678 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000679 return NULL;
680 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000681 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682}
683
684
685/* Create an object representing the given socket address,
686 suitable for passing it back to bind(), connect() etc.
687 The family field of the sockaddr structure is inspected
688 to determine what kind of address it really is. */
689
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000690/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000691static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000692makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000693{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000694 if (addrlen == 0) {
695 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000696 Py_INCREF(Py_None);
697 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000698 }
699
Guido van Rossumbcc20741998-08-04 22:53:56 +0000700#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000701 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000702 addr->sa_family = AF_INET;
703#endif
704
Guido van Rossum30a685f1991-06-27 15:51:29 +0000705 switch (addr->sa_family) {
706
707 case AF_INET:
708 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000709 struct sockaddr_in *a;
710 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000711 PyObject *ret = NULL;
712 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000713 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000714 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
715 Py_DECREF(addrobj);
716 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000717 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000718 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000719
Guido van Rossumb6775db1994-08-01 11:34:53 +0000720#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000721 case AF_UNIX:
722 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000723 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000724 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000725 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000726#endif /* AF_UNIX */
727
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000728#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000729 case AF_INET6:
730 {
731 struct sockaddr_in6 *a;
732 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
733 PyObject *ret = NULL;
734 if (addrobj) {
735 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000736 ret = Py_BuildValue("Oiii",
737 addrobj,
738 ntohs(a->sin6_port),
739 a->sin6_flowinfo,
740 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000741 Py_DECREF(addrobj);
742 }
743 return ret;
744 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000745#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000746
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000747#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000748 case AF_PACKET:
749 {
750 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
751 char *ifname = "";
752 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000753 /* need to look up interface name give index */
754 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000755 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000756 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000757 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000758 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000759 return Py_BuildValue("shbhs#",
760 ifname,
761 ntohs(a->sll_protocol),
762 a->sll_pkttype,
763 a->sll_hatype,
764 a->sll_addr,
765 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000766 }
767#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000768
Guido van Rossum30a685f1991-06-27 15:51:29 +0000769 /* More cases here... */
770
771 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000772 /* If we don't know the address family, don't raise an
773 exception -- return it as a tuple. */
774 return Py_BuildValue("is#",
775 addr->sa_family,
776 addr->sa_data,
777 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000778
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780}
781
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782
783/* Parse a socket address argument according to the socket object's
784 address family. Return 1 if the address was in the proper format,
785 0 of not. The address is returned through addr_ret, its length
786 through len_ret. */
787
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000789getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000790 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000792 switch (s->sock_family) {
793
Guido van Rossumb6775db1994-08-01 11:34:53 +0000794#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000795 case AF_UNIX:
796 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000797 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000798 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000799 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000800 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000801 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000803 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000804 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000805 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000806 return 0;
807 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000808 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000809 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000810 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000811 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000812 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813 return 1;
814 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000815#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000816
Guido van Rossum30a685f1991-06-27 15:51:29 +0000817 case AF_INET:
818 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000819 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000820 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000821 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000822 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000823 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000824 PyErr_Format(
825 PyExc_TypeError,
826 "getsockaddrarg: "
827 "AF_INET address must be tuple, not %.500s",
828 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000829 return 0;
830 }
831 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000832 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000833 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000835 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000836 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000837 *addr_ret = (struct sockaddr *) addr;
838 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000839 return 1;
840 }
841
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000842#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000843 case AF_INET6:
844 {
845 struct sockaddr_in6* addr;
846 char *host;
847 int port, flowinfo, scope_id;
848 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
849 flowinfo = scope_id = 0;
850 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000851 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000852 return 0;
853 }
854 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
855 return 0;
856 addr->sin6_family = s->sock_family;
857 addr->sin6_port = htons((short)port);
858 addr->sin6_flowinfo = flowinfo;
859 addr->sin6_scope_id = scope_id;
860 *addr_ret = (struct sockaddr *) addr;
861 *len_ret = sizeof *addr;
862 return 1;
863 }
864#endif
865
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000866#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000867 case AF_PACKET:
868 {
869 struct sockaddr_ll* addr;
870 struct ifreq ifr;
871 char *interfaceName;
872 int protoNumber;
873 int hatype = 0;
874 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000875 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000876
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000877 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
878 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000879 return 0;
880 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
881 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000882 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000883 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000884 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000885 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000886 addr = &(s->sock_addr.ll);
887 addr->sll_family = AF_PACKET;
888 addr->sll_protocol = htons((short)protoNumber);
889 addr->sll_ifindex = ifr.ifr_ifindex;
890 addr->sll_pkttype = pkttype;
891 addr->sll_hatype = hatype;
892 *addr_ret = (struct sockaddr *) addr;
893 *len_ret = sizeof *addr;
894 return 1;
895 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000896#endif
897
Guido van Rossum30a685f1991-06-27 15:51:29 +0000898 /* More cases here... */
899
900 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000901 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000902 return 0;
903
904 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000905}
906
Guido van Rossum30a685f1991-06-27 15:51:29 +0000907
Guido van Rossum48a680c2001-03-02 06:34:14 +0000908/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000909 Return 1 if the family is known, 0 otherwise. The length is returned
910 through len_ret. */
911
912static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000913getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000914{
915 switch (s->sock_family) {
916
Guido van Rossumb6775db1994-08-01 11:34:53 +0000917#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000918 case AF_UNIX:
919 {
920 *len_ret = sizeof (struct sockaddr_un);
921 return 1;
922 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000923#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000924
925 case AF_INET:
926 {
927 *len_ret = sizeof (struct sockaddr_in);
928 return 1;
929 }
930
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000931#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000932 case AF_INET6:
933 {
934 *len_ret = sizeof (struct sockaddr_in6);
935 return 1;
936 }
937#endif
938
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000939#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000940 case AF_PACKET:
941 {
942 *len_ret = sizeof (struct sockaddr_ll);
943 return 1;
944 }
945#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000946
Guido van Rossum710e1df1992-06-12 10:39:36 +0000947 /* More cases here... */
948
949 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000950 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000951 return 0;
952
953 }
954}
955
956
Guido van Rossum30a685f1991-06-27 15:51:29 +0000957/* s.accept() method */
958
Guido van Rossum73624e91994-10-10 17:59:00 +0000959static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000960sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000961{
962 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000963 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000964 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000965 PyObject *sock = NULL;
966 PyObject *addr = NULL;
967 PyObject *res = NULL;
968
Guido van Rossum710e1df1992-06-12 10:39:36 +0000969 if (!getsockaddrlen(s, &addrlen))
970 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000971 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000972
Guido van Rossum73624e91994-10-10 17:59:00 +0000973 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +0000974 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000975 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000976 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000977
Fred Drakea04eaad2000-06-30 02:46:07 +0000978#ifdef MS_WINDOWS
979 if (newfd == INVALID_SOCKET)
980#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000981 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000982#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000983 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +0000984
Guido van Rossum30a685f1991-06-27 15:51:29 +0000985 /* Create the new object with unspecified family,
986 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000987 sock = (PyObject *) new_sockobject(newfd,
988 s->sock_family,
989 s->sock_type,
990 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000991
Barry Warsaw752300b1997-01-03 17:18:10 +0000992 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000993 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000994 goto finally;
995 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000996 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000997 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000998 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000999 goto finally;
1000
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001001 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001002
Guido van Rossum67f7a382002-06-06 21:08:16 +00001003finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001004 Py_XDECREF(sock);
1005 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001006 return res;
1007}
1008
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001009PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001010"accept() -> (socket object, address info)\n\
1011\n\
1012Wait for an incoming connection. Return a new socket representing the\n\
1013connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001014info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001015
Guido van Rossum11ba0942002-06-13 15:07:44 +00001016/* s.setblocking(flag) method. Argument:
1017 False -- non-blocking mode; same as settimeout(0)
1018 True -- blocking mode; same as settimeout(None)
1019*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001020
Guido van Rossum73624e91994-10-10 17:59:00 +00001021static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001022sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001023{
1024 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001025
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001026 block = PyInt_AsLong(arg);
1027 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001028 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001029
Guido van Rossum11ba0942002-06-13 15:07:44 +00001030 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001031 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001032
Guido van Rossum73624e91994-10-10 17:59:00 +00001033 Py_INCREF(Py_None);
1034 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001035}
Guido van Rossume4485b01994-09-07 14:32:49 +00001036
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001037PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001038"setblocking(flag)\n\
1039\n\
1040Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001041setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001042setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001043
Guido van Rossum11ba0942002-06-13 15:07:44 +00001044/* s.settimeout(timeout) method. Argument:
1045 None -- no timeout, blocking mode; same as setblocking(True)
1046 0.0 -- non-blocking mode; same as setblocking(False)
1047 > 0 -- timeout mode; operations time out after timeout seconds
1048 < 0 -- illegal; raises an exception
1049*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001050static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001051sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001052{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001053 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001054
1055 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001056 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001057 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001058 timeout = PyFloat_AsDouble(arg);
1059 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001060 if (!PyErr_Occurred())
1061 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001062 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001063 return NULL;
1064 }
1065 }
1066
Guido van Rossum11ba0942002-06-13 15:07:44 +00001067 s->sock_timeout = timeout;
1068 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001069
1070 Py_INCREF(Py_None);
1071 return Py_None;
1072}
1073
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001074PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001075"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001076\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001077Set a timeout on socket operations. 'timeout' can be a float,\n\
1078giving in seconds, or None. Setting a timeout of None disables\n\
1079the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001080Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001081
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001082/* s.gettimeout() method.
1083 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001084static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001085sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001086{
1087 if (s->sock_timeout < 0.0) {
1088 Py_INCREF(Py_None);
1089 return Py_None;
1090 }
1091 else
1092 return PyFloat_FromDouble(s->sock_timeout);
1093}
1094
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001095PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001096"gettimeout()\n\
1097\n\
1098Returns the timeout in floating seconds associated with socket \n\
1099operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001100operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001101
Guido van Rossum48a680c2001-03-02 06:34:14 +00001102#ifdef RISCOS
1103/* s.sleeptaskw(1 | 0) method */
1104
1105static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001106sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001107{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001108 int block;
1109 int delay_flag;
1110 if (!PyArg_Parse(args, "i", &block))
1111 return NULL;
1112 Py_BEGIN_ALLOW_THREADS
1113 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1114 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001115
Guido van Rossum67f7a382002-06-06 21:08:16 +00001116 Py_INCREF(Py_None);
1117 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001118}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001119PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001120"sleeptaskw(flag)\n\
1121\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001122Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001123#endif
1124
1125
Guido van Rossumaee08791992-09-08 09:05:33 +00001126/* s.setsockopt() method.
1127 With an integer third argument, sets an integer option.
1128 With a string third argument, sets an option from a buffer;
1129 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001130
Guido van Rossum73624e91994-10-10 17:59:00 +00001131static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001132sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001133{
1134 int level;
1135 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001136 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001137 char *buf;
1138 int buflen;
1139 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001140
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001141 if (PyArg_ParseTuple(args, "iii:setsockopt",
1142 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001143 buf = (char *) &flag;
1144 buflen = sizeof flag;
1145 }
1146 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001147 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001148 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1149 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001150 return NULL;
1151 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001152 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001153 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001154 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001155 Py_INCREF(Py_None);
1156 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001157}
1158
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001159PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001160"setsockopt(level, option, value)\n\
1161\n\
1162Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001163The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001164
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001165
Guido van Rossumaee08791992-09-08 09:05:33 +00001166/* s.getsockopt() method.
1167 With two arguments, retrieves an integer option.
1168 With a third integer argument, retrieves a string buffer of that size;
1169 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001170
Guido van Rossum73624e91994-10-10 17:59:00 +00001171static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001172sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001173{
1174 int level;
1175 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001176 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001177 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001178 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001179
Guido van Rossumbcc20741998-08-04 22:53:56 +00001180#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001181 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001182 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001183 return NULL;
1184#else
1185
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001186 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1187 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001188 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001189
Guido van Rossumbe32c891996-06-20 16:25:29 +00001190 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001191 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001192 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001193 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001194 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001195 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001196 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001197 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001198 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001199 if (buflen <= 0 || buflen > 1024) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001200 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001201 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001202 return NULL;
1203 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001204 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001205 if (buf == NULL)
1206 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001207 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001208 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001209 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001210 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001211 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001212 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001213 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001214 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001215#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001216}
1217
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001218PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001219"getsockopt(level, option[, buffersize]) -> value\n\
1220\n\
1221Get a socket option. See the Unix manual for level and option.\n\
1222If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001223string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001224
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001225
Fred Drake728819a2000-07-01 03:40:12 +00001226/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001227
Guido van Rossum73624e91994-10-10 17:59:00 +00001228static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001229sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001230{
1231 struct sockaddr *addr;
1232 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001233 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001234
Fred Drake728819a2000-07-01 03:40:12 +00001235 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001236 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001237 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001238 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001239 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001240 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001241 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001242 Py_INCREF(Py_None);
1243 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001244}
1245
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001246PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001247"bind(address)\n\
1248\n\
1249Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001250pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001251sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001252
Guido van Rossum30a685f1991-06-27 15:51:29 +00001253
1254/* s.close() method.
1255 Set the file descriptor to -1 so operations tried subsequently
1256 will surely fail. */
1257
Guido van Rossum73624e91994-10-10 17:59:00 +00001258static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001259sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001260{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001261 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001262
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001263 if ((fd = s->sock_fd) != -1) {
1264 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001265 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001266 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001267 Py_END_ALLOW_THREADS
1268 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001269 Py_INCREF(Py_None);
1270 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001271}
1272
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001273PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001274"close()\n\
1275\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001276Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001277
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001278static int
1279internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1280{
1281 int res;
1282
1283 res = connect(s->sock_fd, addr, addrlen);
1284
1285#ifdef MS_WINDOWS
1286
1287 if (s->sock_timeout > 0.0) {
1288 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
1289 internal_select(s, 1);
1290 res = connect(s->sock_fd, addr, addrlen);
1291 if (res < 0 && WSAGetLastError() == WSAEISCONN)
1292 res = 0;
1293 }
1294 }
1295
1296 if (res < 0)
1297 res = WSAGetLastError();
1298
1299#else
1300
1301 if (s->sock_timeout > 0.0) {
1302 if (res < 0 && errno == EINPROGRESS) {
1303 internal_select(s, 1);
1304 res = connect(s->sock_fd, addr, addrlen);
1305 }
1306 }
1307
1308 if (res < 0)
1309 res = errno;
1310
1311#endif
1312
1313 return res;
1314}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001315
Fred Drake728819a2000-07-01 03:40:12 +00001316/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001317
Guido van Rossum73624e91994-10-10 17:59:00 +00001318static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001319sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001320{
1321 struct sockaddr *addr;
1322 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001323 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001324
Fred Drake728819a2000-07-01 03:40:12 +00001325 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001326 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001327
Guido van Rossum73624e91994-10-10 17:59:00 +00001328 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001329 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001330 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001331
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001332 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001333 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001334 Py_INCREF(Py_None);
1335 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001336}
1337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001338PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001339"connect(address)\n\
1340\n\
1341Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001342is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001343
Guido van Rossum30a685f1991-06-27 15:51:29 +00001344
Fred Drake728819a2000-07-01 03:40:12 +00001345/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001346
1347static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001348sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001349{
1350 struct sockaddr *addr;
1351 int addrlen;
1352 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001353
Fred Drake728819a2000-07-01 03:40:12 +00001354 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001355 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001356
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001357 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001358 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001359 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001360
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001361 return PyInt_FromLong((long) res);
1362}
1363
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001364PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001365"connect_ex(address)\n\
1366\n\
1367This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001368instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001369
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001370
Guido van Rossumed233a51992-06-23 09:07:03 +00001371/* s.fileno() method */
1372
Guido van Rossum73624e91994-10-10 17:59:00 +00001373static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001374sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001375{
Fred Drakea04eaad2000-06-30 02:46:07 +00001376#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001377 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001378#else
1379 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1380#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001381}
1382
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001383PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001384"fileno() -> integer\n\
1385\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001386Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001387
Guido van Rossumed233a51992-06-23 09:07:03 +00001388
Guido van Rossumbe32c891996-06-20 16:25:29 +00001389#ifndef NO_DUP
1390/* s.dup() method */
1391
1392static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001393sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001394{
Fred Drakea04eaad2000-06-30 02:46:07 +00001395 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001396 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001397
Guido van Rossumbe32c891996-06-20 16:25:29 +00001398 newfd = dup(s->sock_fd);
1399 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001400 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001401 sock = (PyObject *) new_sockobject(newfd,
1402 s->sock_family,
1403 s->sock_type,
1404 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001405 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001406 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001407 return sock;
1408}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001409
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001410PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001411"dup() -> socket object\n\
1412\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001413Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001414
Guido van Rossumbe32c891996-06-20 16:25:29 +00001415#endif
1416
1417
Guido van Rossumc89705d1992-11-26 08:54:07 +00001418/* s.getsockname() method */
1419
Guido van Rossum73624e91994-10-10 17:59:00 +00001420static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001421sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001422{
1423 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001424 int res;
1425 socklen_t addrlen;
1426
Guido van Rossumc89705d1992-11-26 08:54:07 +00001427 if (!getsockaddrlen(s, &addrlen))
1428 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001429 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001430 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001431 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001432 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001433 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001434 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001435 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001436}
1437
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001438PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001439"getsockname() -> address info\n\
1440\n\
1441Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001442info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001443
Guido van Rossumc89705d1992-11-26 08:54:07 +00001444
Guido van Rossumb6775db1994-08-01 11:34:53 +00001445#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001446/* s.getpeername() method */
1447
Guido van Rossum73624e91994-10-10 17:59:00 +00001448static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001449sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001450{
1451 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001452 int res;
1453 socklen_t addrlen;
1454
Guido van Rossumc89705d1992-11-26 08:54:07 +00001455 if (!getsockaddrlen(s, &addrlen))
1456 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001457 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001458 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001459 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001460 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001461 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001462 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001463 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001464}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001465
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001466PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001467"getpeername() -> address info\n\
1468\n\
1469Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001470info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001471
Guido van Rossumb6775db1994-08-01 11:34:53 +00001472#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001473
1474
Guido van Rossum30a685f1991-06-27 15:51:29 +00001475/* s.listen(n) method */
1476
Guido van Rossum73624e91994-10-10 17:59:00 +00001477static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001478sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001479{
1480 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001481 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001482
1483 backlog = PyInt_AsLong(arg);
1484 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001485 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001486 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001487 if (backlog < 1)
1488 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001489 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001490 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001491 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001492 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001493 Py_INCREF(Py_None);
1494 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001495}
1496
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001497PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001498"listen(backlog)\n\
1499\n\
1500Enable a server to accept connections. The backlog argument must be at\n\
1501least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001502will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001503
1504
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001505#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001506/* s.makefile(mode) method.
1507 Create a new open file object referring to a dupped version of
1508 the socket's file descriptor. (The dup() call is necessary so
1509 that the open file and socket objects may be closed independent
1510 of each other.)
1511 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1512
Guido van Rossum73624e91994-10-10 17:59:00 +00001513static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001514sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001515{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001516 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001517 char *mode = "r";
1518 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001519#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001520 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001521#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001522 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001523#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001524 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001525 PyObject *f;
1526
Guido van Rossum43713e52000-02-29 13:59:29 +00001527 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001528 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001529#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001530 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1531 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001532#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001533 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001534#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001535 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001536 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001537 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001538 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001539 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001540#ifdef USE_GUSI2
1541 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001542 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001543 bufsize = 0;
1544#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001545 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1546 if (f != NULL)
1547 PyFile_SetBufSize(f, bufsize);
1548 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001549}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001550
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001551PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001552"makefile([mode[, buffersize]]) -> file object\n\
1553\n\
1554Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001555The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001556
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001557#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001558
Guido van Rossum48a680c2001-03-02 06:34:14 +00001559
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001560/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001561
Guido van Rossum73624e91994-10-10 17:59:00 +00001562static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001563sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001564{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001565 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001566 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001567
Guido van Rossum43713e52000-02-29 13:59:29 +00001568 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001569 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001570
1571 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001572 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001573 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001574 return NULL;
1575 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001576
Guido van Rossum73624e91994-10-10 17:59:00 +00001577 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001578 if (buf == NULL)
1579 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001580
Guido van Rossum73624e91994-10-10 17:59:00 +00001581 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001582 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001583 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001584 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001585
Guido van Rossum7c53b771995-09-13 18:39:47 +00001586 if (n < 0) {
1587 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001588 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001589 }
Tim Peters5de98422002-04-27 18:44:32 +00001590 if (n != len)
1591 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001592 return buf;
1593}
1594
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001595PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001596"recv(buffersize[, flags]) -> data\n\
1597\n\
1598Receive up to buffersize bytes from the socket. For the optional flags\n\
1599argument, see the Unix manual. When no data is available, block until\n\
1600at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001601the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001602
Guido van Rossum30a685f1991-06-27 15:51:29 +00001603
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001604/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001605
Guido van Rossum73624e91994-10-10 17:59:00 +00001606static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001607sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001608{
1609 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001610 PyObject *buf = NULL;
1611 PyObject *addr = NULL;
1612 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001613 int len, n, flags = 0;
1614 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001615
Guido van Rossum43713e52000-02-29 13:59:29 +00001616 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001617 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001618
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001619 if (!getsockaddrlen(s, &addrlen))
1620 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001621 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001622 if (buf == NULL)
1623 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001624
Guido van Rossum73624e91994-10-10 17:59:00 +00001625 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001626 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001627 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001628 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001629#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001630#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001631 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001632#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001633 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001634#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001635#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001636 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001637#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001638 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001639 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001640
Guido van Rossum7c53b771995-09-13 18:39:47 +00001641 if (n < 0) {
1642 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001643 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001644 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001645
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001646 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001647 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001648
Guido van Rossum67f7a382002-06-06 21:08:16 +00001649 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001650 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001651 goto finally;
1652
Guido van Rossum73624e91994-10-10 17:59:00 +00001653 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001654
1655finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001656 Py_XDECREF(addr);
1657 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001658 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001659}
1660
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001661PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001662"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1663\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001664Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001665
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001666/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001667
Guido van Rossum73624e91994-10-10 17:59:00 +00001668static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001669sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001670{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001671 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001672 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001673
Guido van Rossum43713e52000-02-29 13:59:29 +00001674 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001675 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001676
Guido van Rossum73624e91994-10-10 17:59:00 +00001677 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001678 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001679 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001680 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001681
Guido van Rossum30a685f1991-06-27 15:51:29 +00001682 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001683 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001684 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001685}
1686
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001687PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001688"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001689\n\
1690Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001691argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001692sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001693
1694
1695/* s.sendall(data [,flags]) method */
1696
1697static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001698sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001699{
1700 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001701 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001702
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001703 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1704 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001705
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001706 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001707 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001708 do {
1709 n = send(s->sock_fd, buf, len, flags);
1710 if (n < 0)
1711 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001712 buf += n;
1713 len -= n;
1714 } while (len > 0);
1715 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001716
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001717 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001718 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001719
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001720 Py_INCREF(Py_None);
1721 return Py_None;
1722}
1723
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001724PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001725"sendall(data[, flags])\n\
1726\n\
1727Send a data string to the socket. For the optional flags\n\
1728argument, see the Unix manual. This calls send() repeatedly\n\
1729until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001730to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001731
Guido van Rossum30a685f1991-06-27 15:51:29 +00001732
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001733/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001734
Guido van Rossum73624e91994-10-10 17:59:00 +00001735static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001736sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001737{
Guido van Rossum73624e91994-10-10 17:59:00 +00001738 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001739 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001740 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001741 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001742
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001743 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001744 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001745 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001746 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1747 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001748 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001749 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001750
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001751 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001752 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001753
Guido van Rossum73624e91994-10-10 17:59:00 +00001754 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001755 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001756 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001757 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001758
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001759 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001760 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001761 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001762}
1763
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001764PyDoc_STRVAR(sendto_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001765"sendto(data[, flags], address)\n\
1766\n\
1767Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001768For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001769
Guido van Rossum30a685f1991-06-27 15:51:29 +00001770
1771/* s.shutdown(how) method */
1772
Guido van Rossum73624e91994-10-10 17:59:00 +00001773static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001774sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001775{
1776 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001777 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001778
1779 how = PyInt_AsLong(arg);
1780 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001781 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001782 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001783 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001784 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001785 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001786 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001787 Py_INCREF(Py_None);
1788 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001789}
1790
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001791PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001792"shutdown(flag)\n\
1793\n\
1794Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001795of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001796
Guido van Rossum30a685f1991-06-27 15:51:29 +00001797
1798/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001799
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001800static PyMethodDef sock_methods[] = {
1801 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001802 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001803 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001804 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001805 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001806 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001807 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001808 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001809 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001810 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001811#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001812 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001813 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001814#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001815 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001816 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001817#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001818 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001819 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001820#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001821 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001822 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001823 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001824 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001825 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001826 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001827#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001828 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001829 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001830#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001831 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001832 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001833 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001834 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001835 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001836 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001837 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001838 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001839 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001840 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001841 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001842 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001843 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001844 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001845 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001846 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001847 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001848 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001849 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001850 shutdown_doc},
1851#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001852 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001853 sleeptaskw_doc},
1854#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001855 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001856};
1857
Guido van Rossum30a685f1991-06-27 15:51:29 +00001858
Guido van Rossum73624e91994-10-10 17:59:00 +00001859/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001860 First close the file description. */
1861
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001862static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001863sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001864{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001865 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001866 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001867 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001868}
1869
Guido van Rossum30a685f1991-06-27 15:51:29 +00001870
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001871static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001872sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001873{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001874 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001875#if SIZEOF_SOCKET_T > SIZEOF_LONG
1876 if (s->sock_fd > LONG_MAX) {
1877 /* this can occur on Win64, and actually there is a special
1878 ugly printf formatter for decimal pointer length integer
1879 printing, only bother if necessary*/
1880 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001881 "no printf formatter to display "
1882 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00001883 return NULL;
1884 }
1885#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001886 PyOS_snprintf(
1887 buf, sizeof(buf),
1888 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1889 (long)s->sock_fd, s->sock_family,
1890 s->sock_type,
1891 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001892 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001893}
1894
1895
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001896/* Create a new, uninitialized socket object. */
1897
1898static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001899sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001900{
1901 PyObject *new;
1902
1903 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00001904 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001905 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001906 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001907 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00001908 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001909 return new;
1910}
1911
1912
1913/* Initialize a new socket object. */
1914
1915/*ARGSUSED*/
1916static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00001917sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001918{
1919 PySocketSockObject *s = (PySocketSockObject *)self;
1920 SOCKET_T fd;
1921 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1922 static char *keywords[] = {"family", "type", "proto", 0};
1923
1924 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1925 "|iii:socket", keywords,
1926 &family, &type, &proto))
1927 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001928
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001929 Py_BEGIN_ALLOW_THREADS
1930 fd = socket(family, type, proto);
1931 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001932
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001933#ifdef MS_WINDOWS
1934 if (fd == INVALID_SOCKET)
1935#else
1936 if (fd < 0)
1937#endif
1938 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001939 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001940 return -1;
1941 }
1942 init_sockobject(s, fd, family, type, proto);
1943 /* From now on, ignore SIGPIPE and let the error checking
1944 do the work. */
1945#ifdef SIGPIPE
1946 (void) signal(SIGPIPE, SIG_IGN);
1947#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001948
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001949 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001950
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001951}
1952
1953
Guido van Rossumb6775db1994-08-01 11:34:53 +00001954/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001955
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001956static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001957 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001958 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001959 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001960 sizeof(PySocketSockObject), /* tp_basicsize */
1961 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001962 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001963 0, /* tp_print */
1964 0, /* tp_getattr */
1965 0, /* tp_setattr */
1966 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001967 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001968 0, /* tp_as_number */
1969 0, /* tp_as_sequence */
1970 0, /* tp_as_mapping */
1971 0, /* tp_hash */
1972 0, /* tp_call */
1973 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001974 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001975 0, /* tp_setattro */
1976 0, /* tp_as_buffer */
1977 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001978 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001979 0, /* tp_traverse */
1980 0, /* tp_clear */
1981 0, /* tp_richcompare */
1982 0, /* tp_weaklistoffset */
1983 0, /* tp_iter */
1984 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001985 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001986 0, /* tp_members */
1987 0, /* tp_getset */
1988 0, /* tp_base */
1989 0, /* tp_dict */
1990 0, /* tp_descr_get */
1991 0, /* tp_descr_set */
1992 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00001993 sock_initobj, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001994 0, /* set below */ /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001995 sock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001996 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001997};
1998
Guido van Rossum30a685f1991-06-27 15:51:29 +00001999
Guido van Rossum81194471991-07-27 21:42:02 +00002000/* Python interface to gethostname(). */
2001
2002/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002003static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002004socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002005{
2006 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002007 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002008 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002009 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002010 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002011 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002012 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002013 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002014 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002015 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002016 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002017}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002018
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002019PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002020"gethostname() -> string\n\
2021\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002022Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002023
Guido van Rossumff4949e1992-08-05 19:58:53 +00002024
Guido van Rossum30a685f1991-06-27 15:51:29 +00002025/* Python interface to gethostbyname(name). */
2026
2027/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002028static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002029socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002030{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002031 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002032 struct sockaddr_storage addrbuf;
2033
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002034 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002035 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002036 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002037 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002038 return makeipaddr((struct sockaddr *)&addrbuf,
2039 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002040}
2041
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002042PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002043"gethostbyname(host) -> address\n\
2044\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002045Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002046
2047
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002048/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2049
2050static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002051gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002052{
2053 char **pch;
2054 PyObject *rtn_tuple = (PyObject *)NULL;
2055 PyObject *name_list = (PyObject *)NULL;
2056 PyObject *addr_list = (PyObject *)NULL;
2057 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002058
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002059 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002060 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002061#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002062 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002063#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002064 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002065#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002066 return NULL;
2067 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002068
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002069 if (h->h_addrtype != af) {
2070#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002071 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002072 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002073 (char *)strerror(EAFNOSUPPORT));
2074#else
2075 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002076 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002077 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002078#endif
2079 return NULL;
2080 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002081
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002082 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002083
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002084 case AF_INET:
2085 if (alen < sizeof(struct sockaddr_in))
2086 return NULL;
2087 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002088
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002089#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002090 case AF_INET6:
2091 if (alen < sizeof(struct sockaddr_in6))
2092 return NULL;
2093 break;
2094#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002095
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002096 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002097
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002098 if ((name_list = PyList_New(0)) == NULL)
2099 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002100
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002101 if ((addr_list = PyList_New(0)) == NULL)
2102 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002103
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002104 for (pch = h->h_aliases; *pch != NULL; pch++) {
2105 int status;
2106 tmp = PyString_FromString(*pch);
2107 if (tmp == NULL)
2108 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002109
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002110 status = PyList_Append(name_list, tmp);
2111 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002112
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002113 if (status)
2114 goto err;
2115 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002116
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002117 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2118 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002119
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002120 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002121
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002122 case AF_INET:
2123 {
2124 struct sockaddr_in sin;
2125 memset(&sin, 0, sizeof(sin));
2126 sin.sin_family = af;
2127#ifdef HAVE_SOCKADDR_SA_LEN
2128 sin.sin_len = sizeof(sin);
2129#endif
2130 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2131 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002132
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002133 if (pch == h->h_addr_list && alen >= sizeof(sin))
2134 memcpy((char *) addr, &sin, sizeof(sin));
2135 break;
2136 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002137
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002138#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002139 case AF_INET6:
2140 {
2141 struct sockaddr_in6 sin6;
2142 memset(&sin6, 0, sizeof(sin6));
2143 sin6.sin6_family = af;
2144#ifdef HAVE_SOCKADDR_SA_LEN
2145 sin6.sin6_len = sizeof(sin6);
2146#endif
2147 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2148 tmp = makeipaddr((struct sockaddr *)&sin6,
2149 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002150
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002151 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2152 memcpy((char *) addr, &sin6, sizeof(sin6));
2153 break;
2154 }
2155#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002156
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002157 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002158 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002159 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002160 return NULL;
2161 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002162
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002163 if (tmp == NULL)
2164 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002165
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002166 status = PyList_Append(addr_list, tmp);
2167 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002168
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002169 if (status)
2170 goto err;
2171 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002172
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002173 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002174
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002175 err:
2176 Py_XDECREF(name_list);
2177 Py_XDECREF(addr_list);
2178 return rtn_tuple;
2179}
2180
2181
2182/* Python interface to gethostbyname_ex(name). */
2183
2184/*ARGSUSED*/
2185static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002186socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002187{
2188 char *name;
2189 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002190 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002191 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002192 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002193#ifdef HAVE_GETHOSTBYNAME_R
2194 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002195#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2196 struct hostent_data data;
2197#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002198 char buf[16384];
2199 int buf_len = (sizeof buf) - 1;
2200 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002201#endif
2202#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002203 int result;
2204#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002205#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002206
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002207 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002208 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002209 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002210 return NULL;
2211 Py_BEGIN_ALLOW_THREADS
2212#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002213#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002214 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2215 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002216#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002217 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002218#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002219 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002220 result = gethostbyname_r(name, &hp_allocated, &data);
2221 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002222#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002223#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002224#ifdef USE_GETHOSTBYNAME_LOCK
2225 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002226#endif
2227 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002228#endif /* HAVE_GETHOSTBYNAME_R */
2229 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002230 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002231 addr.ss_family.
2232 Therefore, we cast the sockaddr_storage into sockaddr to
2233 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002234 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002235 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002236 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002237#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002238 PyThread_release_lock(gethostbyname_lock);
2239#endif
2240 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002241}
2242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002243PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002244"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2245\n\
2246Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002247for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002248
2249
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002250/* Python interface to gethostbyaddr(IP). */
2251
2252/*ARGSUSED*/
2253static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002254socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002255{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002256#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002257 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002258#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002259 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002260#endif
2261 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002262 char *ip_num;
2263 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002264 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002265#ifdef HAVE_GETHOSTBYNAME_R
2266 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002267#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2268 struct hostent_data data;
2269#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002270 char buf[16384];
2271 int buf_len = (sizeof buf) - 1;
2272 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002273#endif
2274#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002275 int result;
2276#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002277#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002278 char *ap;
2279 int al;
2280 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002281
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002282 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002283 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002284 af = PF_UNSPEC;
2285 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002286 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002287 af = sa->sa_family;
2288 ap = NULL;
2289 al = 0;
2290 switch (af) {
2291 case AF_INET:
2292 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2293 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2294 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002295#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002296 case AF_INET6:
2297 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2298 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2299 break;
2300#endif
2301 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002302 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002303 return NULL;
2304 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002305 Py_BEGIN_ALLOW_THREADS
2306#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002307#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002308 result = gethostbyaddr_r(ap, al, af,
2309 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002310 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002311#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002312 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002313 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002314#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002315 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002316 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002317 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002318#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002319#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002320#ifdef USE_GETHOSTBYNAME_LOCK
2321 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002322#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002323 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002324#endif /* HAVE_GETHOSTBYNAME_R */
2325 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002326 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002327#ifdef USE_GETHOSTBYNAME_LOCK
2328 PyThread_release_lock(gethostbyname_lock);
2329#endif
2330 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002331}
2332
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002333PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002334"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2335\n\
2336Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002337for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002338
Guido van Rossum30a685f1991-06-27 15:51:29 +00002339
2340/* Python interface to getservbyname(name).
2341 This only returns the port number, since the other info is already
2342 known or not useful (like the list of aliases). */
2343
2344/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002345static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002346socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002347{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002348 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002349 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002350 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002351 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002352 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002353 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002354 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002355 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002356 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002357 return NULL;
2358 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002359 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002360}
2361
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002362PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002363"getservbyname(servicename, protocolname) -> integer\n\
2364\n\
2365Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002366The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002367
Guido van Rossum30a685f1991-06-27 15:51:29 +00002368
Guido van Rossum3901d851996-12-19 16:35:04 +00002369/* Python interface to getprotobyname(name).
2370 This only returns the protocol number, since the other info is
2371 already known or not useful (like the list of aliases). */
2372
2373/*ARGSUSED*/
2374static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002375socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002376{
2377 char *name;
2378 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002379#ifdef __BEOS__
2380/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002381 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002382 return NULL;
2383#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002384 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002385 return NULL;
2386 Py_BEGIN_ALLOW_THREADS
2387 sp = getprotobyname(name);
2388 Py_END_ALLOW_THREADS
2389 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002390 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002391 return NULL;
2392 }
2393 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002394#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002395}
2396
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002397PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002398"getprotobyname(name) -> integer\n\
2399\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002400Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002401
Guido van Rossum3901d851996-12-19 16:35:04 +00002402
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002403#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002404/* Create a socket object from a numeric file description.
2405 Useful e.g. if stdin is a socket.
2406 Additional arguments as for socket(). */
2407
2408/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002409static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002410socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002411{
Guido van Rossum73624e91994-10-10 17:59:00 +00002412 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002413 SOCKET_T fd;
2414 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002415 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2416 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002417 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002418 /* Dup the fd so it and the socket can be closed independently */
2419 fd = dup(fd);
2420 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002421 return set_error();
2422 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002423 /* From now on, ignore SIGPIPE and let the error checking
2424 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002425#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002426 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002427#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002428 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002429}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002431PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002432"fromfd(fd, family, type[, proto]) -> socket object\n\
2433\n\
2434Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002435The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002436
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002437#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002438
Guido van Rossum82a5c661998-07-07 20:45:43 +00002439
Guido van Rossum006bf911996-06-12 04:04:55 +00002440static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002441socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002442{
2443 int x1, x2;
2444
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002445 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002446 return NULL;
2447 }
2448 x2 = (int)ntohs((short)x1);
2449 return PyInt_FromLong(x2);
2450}
2451
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002452PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002453"ntohs(integer) -> integer\n\
2454\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002455Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002456
2457
Guido van Rossum006bf911996-06-12 04:04:55 +00002458static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002459socket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002460{
2461 int x1, x2;
2462
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002463 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002464 return NULL;
2465 }
2466 x2 = ntohl(x1);
2467 return PyInt_FromLong(x2);
2468}
2469
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002470PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002471"ntohl(integer) -> integer\n\
2472\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002473Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002474
2475
Guido van Rossum006bf911996-06-12 04:04:55 +00002476static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002477socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002478{
2479 int x1, x2;
2480
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002481 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002482 return NULL;
2483 }
2484 x2 = (int)htons((short)x1);
2485 return PyInt_FromLong(x2);
2486}
2487
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002488PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002489"htons(integer) -> integer\n\
2490\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002491Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002492
2493
Guido van Rossum006bf911996-06-12 04:04:55 +00002494static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002495socket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002496{
2497 int x1, x2;
2498
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002499 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002500 return NULL;
2501 }
2502 x2 = htonl(x1);
2503 return PyInt_FromLong(x2);
2504}
2505
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002506PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002507"htonl(integer) -> integer\n\
2508\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002509Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002510
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002511/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002512
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002513PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002514"inet_aton(string) -> packed 32-bit IP representation\n\
2515\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002516Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002517binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002518
2519static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002520socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002521{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002522#ifndef INADDR_NONE
2523#define INADDR_NONE (-1)
2524#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002525
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002526 /* Have to use inet_addr() instead */
2527 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002528 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002529
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002530 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002531 return NULL;
2532 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002533 packed_addr = inet_addr(ip_addr);
2534
2535 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002536 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002537 "illegal IP address string passed to inet_aton");
2538 return NULL;
2539 }
2540
2541 return PyString_FromStringAndSize((char *) &packed_addr,
2542 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002543}
2544
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002545PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002546"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002547\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002548Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002549
2550static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002551socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002552{
2553 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002554 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002555 struct in_addr packed_addr;
2556
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002557 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002558 return NULL;
2559 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002560
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002561 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002562 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002563 "packed IP wrong length for inet_ntoa");
2564 return NULL;
2565 }
2566
2567 memcpy(&packed_addr, packed_str, addr_len);
2568
2569 return PyString_FromString(inet_ntoa(packed_addr));
2570}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002571
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002572/* Python interface to getaddrinfo(host, port). */
2573
2574/*ARGSUSED*/
2575static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002576socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002577{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002578 struct addrinfo hints, *res;
2579 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002580 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002581 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002582 char *hptr, *pptr;
2583 int family, socktype, protocol, flags;
2584 int error;
2585 PyObject *all = (PyObject *)NULL;
2586 PyObject *single = (PyObject *)NULL;
2587
2588 family = socktype = protocol = flags = 0;
2589 family = PF_UNSPEC;
2590 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2591 &hptr, &pobj, &family, &socktype,
2592 &protocol, &flags)) {
2593 return NULL;
2594 }
2595 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002596 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002597 pptr = pbuf;
2598 } else if (PyString_Check(pobj)) {
2599 pptr = PyString_AsString(pobj);
2600 } else if (pobj == Py_None) {
2601 pptr = (char *)NULL;
2602 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002603 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002604 return NULL;
2605 }
2606 memset(&hints, 0, sizeof(hints));
2607 hints.ai_family = family;
2608 hints.ai_socktype = socktype;
2609 hints.ai_protocol = protocol;
2610 hints.ai_flags = flags;
2611 error = getaddrinfo(hptr, pptr, &hints, &res0);
2612 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002613 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002614 return NULL;
2615 }
2616
2617 if ((all = PyList_New(0)) == NULL)
2618 goto err;
2619 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002620 PyObject *addr =
2621 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2622 if (addr == NULL)
2623 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002624 single = Py_BuildValue("iiisO", res->ai_family,
2625 res->ai_socktype, res->ai_protocol,
2626 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002627 addr);
2628 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002629 if (single == NULL)
2630 goto err;
2631
2632 if (PyList_Append(all, single))
2633 goto err;
2634 Py_XDECREF(single);
2635 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002636 return all;
2637 err:
2638 Py_XDECREF(single);
2639 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002640 if (res0)
2641 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002642 return (PyObject *)NULL;
2643}
2644
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002645PyDoc_STRVAR(getaddrinfo_doc,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002646"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2647 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2648\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002649Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002650
2651/* Python interface to getnameinfo(sa, flags). */
2652
2653/*ARGSUSED*/
2654static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002655socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002656{
2657 PyObject *sa = (PyObject *)NULL;
2658 int flags;
2659 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002660 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002661 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2662 struct addrinfo hints, *res = NULL;
2663 int error;
2664 PyObject *ret = (PyObject *)NULL;
2665
2666 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002667 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002668 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002669 if (!PyArg_ParseTuple(sa, "si|ii",
2670 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002671 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002672 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002673 memset(&hints, 0, sizeof(hints));
2674 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002675 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002676 error = getaddrinfo(hostp, pbuf, &hints, &res);
2677 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002678 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002679 goto fail;
2680 }
2681 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002682 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002683 "sockaddr resolved to multiple addresses");
2684 goto fail;
2685 }
2686 switch (res->ai_family) {
2687 case AF_INET:
2688 {
2689 char *t1;
2690 int t2;
2691 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002692 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002693 "IPv4 sockaddr must be 2 tuple");
2694 goto fail;
2695 }
2696 break;
2697 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002698#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002699 case AF_INET6:
2700 {
2701 struct sockaddr_in6 *sin6;
2702 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2703 sin6->sin6_flowinfo = flowinfo;
2704 sin6->sin6_scope_id = scope_id;
2705 break;
2706 }
2707#endif
2708 }
2709 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2710 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2711 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002712 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002713 goto fail;
2714 }
2715 ret = Py_BuildValue("ss", hbuf, pbuf);
2716
2717fail:
2718 if (res)
2719 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002720 return ret;
2721}
2722
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002723PyDoc_STRVAR(getnameinfo_doc,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002724"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2725\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002726Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002727
Guido van Rossum30a685f1991-06-27 15:51:29 +00002728/* List of functions exported by this module. */
2729
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002730static PyMethodDef socket_methods[] = {
2731 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002732 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002733 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002734 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002735 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002736 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002737 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002738 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002739 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002740 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002741 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002742 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002743#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002744 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002745 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002746#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002747 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002748 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002749 {"ntohl", socket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002750 METH_VARARGS, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002751 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002752 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002753 {"htonl", socket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002754 METH_VARARGS, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002755 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002756 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002757 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002758 METH_VARARGS, inet_ntoa_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002759 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002760 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002761 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002762 METH_VARARGS, getnameinfo_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002763 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002764};
2765
Guido van Rossum30a685f1991-06-27 15:51:29 +00002766
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002767#ifdef RISCOS
2768#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00002769
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002770static int
2771os_init(void)
2772{
2773 _kernel_swi_regs r;
2774
2775 r.r[0] = 0;
2776 _kernel_swi(0x43380, &r, &r);
2777 taskwindow = r.r[0];
2778
2779 return 0;
2780}
2781
2782#endif /* RISCOS */
2783
2784
2785#ifdef MS_WINDOWS
2786#define OS_INIT_DEFINED
2787
2788/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002789
2790static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002791os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002792{
2793 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002794}
2795
2796static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002797os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002798{
2799 WSADATA WSAData;
2800 int ret;
2801 char buf[100];
2802 ret = WSAStartup(0x0101, &WSAData);
2803 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002804 case 0: /* No error */
2805 atexit(os_cleanup);
2806 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002807 case WSASYSNOTREADY:
2808 PyErr_SetString(PyExc_ImportError,
2809 "WSAStartup failed: network not ready");
2810 break;
2811 case WSAVERNOTSUPPORTED:
2812 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002813 PyErr_SetString(
2814 PyExc_ImportError,
2815 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00002816 break;
2817 default:
Tim Peters885d4572001-11-28 20:27:42 +00002818 PyOS_snprintf(buf, sizeof(buf),
2819 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002820 PyErr_SetString(PyExc_ImportError, buf);
2821 break;
2822 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002823 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002824}
2825
Guido van Rossum8d665e61996-06-26 18:22:49 +00002826#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002827
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002828
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002829#ifdef PYOS_OS2
2830#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002831
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002832/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002833
2834static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002835os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002836{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002837#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002838 char reason[64];
2839 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002840
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002841 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002842 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002843 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002844
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002845 PyOS_snprintf(reason, sizeof(reason),
2846 "OS/2 TCP/IP Error# %d", sock_errno());
2847 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002848
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002849 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002850#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002851 /* No need to initialise sockets with GCC/EMX */
2852 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002853#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002854}
2855
2856#endif /* PYOS_OS2 */
2857
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002858
2859#ifndef OS_INIT_DEFINED
2860static int
2861os_init(void)
2862{
2863 return 1; /* Success */
2864}
2865#endif
2866
2867
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002868/* C API table - always add new things to the end for binary
2869 compatibility. */
2870static
2871PySocketModule_APIObject PySocketModuleAPI =
2872{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002873 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002874};
2875
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002876
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002877/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002878
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002879 This module is actually called "_socket", and there's a wrapper
2880 "socket.py" which implements some additional functionality. On some
2881 platforms (e.g. Windows and OS/2), socket.py also implements a
2882 wrapper for the socket type that provides missing functionality such
2883 as makefile(), dup() and fromfd(). The import of "_socket" may fail
2884 with an ImportError exception if os-specific initialization fails.
2885 On Windows, this does WINSOCK initialization. When WINSOCK is
2886 initialized succesfully, a call to WSACleanup() is scheduled to be
2887 made at exit time.
2888*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002890PyDoc_STRVAR(socket_doc,
Fred Drakea136d492000-08-16 14:18:30 +00002891"Implementation module for socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002892for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002893
Guido van Rossum3886bb61998-12-04 18:50:17 +00002894DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002895init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002896{
Fred Drake4baedc12002-04-01 14:53:37 +00002897 PyObject *m;
Fred Drake4baedc12002-04-01 14:53:37 +00002898
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002899 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002900 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002901
2902 sock_type.ob_type = &PyType_Type;
2903 sock_type.tp_getattro = PyObject_GenericGetAttr;
2904 sock_type.tp_alloc = PyType_GenericAlloc;
2905 sock_type.tp_free = PyObject_Del;
2906 m = Py_InitModule3(PySocket_MODULE_NAME,
2907 socket_methods,
2908 socket_doc);
2909
2910 socket_error = PyErr_NewException("socket.error", NULL, NULL);
2911 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002912 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002913 Py_INCREF(socket_error);
2914 PyModule_AddObject(m, "error", socket_error);
2915 socket_herror = PyErr_NewException("socket.herror",
2916 socket_error, NULL);
2917 if (socket_herror == NULL)
2918 return;
2919 Py_INCREF(socket_herror);
2920 PyModule_AddObject(m, "herror", socket_herror);
2921 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002922 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002923 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002924 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002925 Py_INCREF(socket_gaierror);
2926 PyModule_AddObject(m, "gaierror", socket_gaierror);
2927 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00002928 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002929 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002930 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002931 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00002932 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002933 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002934 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002935
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002936 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00002937 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002938 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
2939 ) != 0)
2940 return;
2941
Guido van Rossum09be4091999-08-09 14:40:40 +00002942 /* Address families (we only support AF_INET and AF_UNIX) */
2943#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00002944 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00002945#endif
Fred Drake4baedc12002-04-01 14:53:37 +00002946 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002947#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00002948 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002949#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002950#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00002951 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002952#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002953#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00002954 /* Amateur Radio AX.25 */
2955 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00002956#endif
2957#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00002958 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002959#endif
2960#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00002961 /* Appletalk DDP */
2962 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00002963#endif
2964#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00002965 /* Amateur radio NetROM */
2966 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00002967#endif
2968#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00002969 /* Multiprotocol bridge */
2970 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00002971#endif
2972#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00002973 /* Reserved for Werner's ATM */
2974 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00002975#endif
2976#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00002977 /* Reserved for X.25 project */
2978 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00002979#endif
2980#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00002981 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00002982#endif
2983#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00002984 /* Amateur Radio X.25 PLP */
2985 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00002986#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002987#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00002988 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
2989 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
2990 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
2991 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
2992 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
2993 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2994 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
2995 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2996 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002997#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002998
2999 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003000 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3001 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003002#ifndef __BEOS__
3003/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003004 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3005 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3006 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003007#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003008
3009#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003010 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003011#endif
3012#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003013 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003014#endif
3015#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003016 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003017#endif
3018#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003019 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003020#endif
3021#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003022 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003023#endif
3024#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003025 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003026#endif
3027#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003028 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003029#endif
3030#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003031 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003032#endif
3033#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003034 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003035#endif
3036#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003037 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003038#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003039#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003040 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003041#endif
3042#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003043 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003044#endif
3045#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003046 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003047#endif
3048#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003049 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003050#endif
3051#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003052 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003053#endif
3054#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003055 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003056#endif
3057#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003058 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003059#endif
3060#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003061 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003062#endif
3063
3064 /* Maximum number of connections for "listen" */
3065#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003066 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003067#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003068 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003069#endif
3070
3071 /* Flags for send, recv */
3072#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003073 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003074#endif
3075#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003076 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003077#endif
3078#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003079 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003080#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003081#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003082 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003083#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003084#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003085 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003086#endif
3087#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003088 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003089#endif
3090#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003091 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003092#endif
3093#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003094 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003095#endif
3096#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003097 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003098#endif
3099#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003100 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003101#endif
3102
3103 /* Protocol level and numbers, usable for [gs]etsockopt */
3104#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003105 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003106#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003107#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003108 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003109#else
Fred Drake4baedc12002-04-01 14:53:37 +00003110 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003111#endif
3112#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003113 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003114#endif
3115#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003116 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003117#endif
3118#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003119 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003120#endif
3121#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003122 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003123#endif
3124#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003125 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003126#endif
3127#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003128 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003129#else
Fred Drake4baedc12002-04-01 14:53:37 +00003130 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003131#endif
3132#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003133 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003134#else
Fred Drake4baedc12002-04-01 14:53:37 +00003135 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003136#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003137#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003138 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003139#else
Fred Drake4baedc12002-04-01 14:53:37 +00003140 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003141#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003142#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003143 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003144#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003145#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003146 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003147#else
Fred Drake4baedc12002-04-01 14:53:37 +00003148 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003149#endif
3150#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003151 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003152#endif
3153#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003154 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003155#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003156#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003157 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003158#endif
3159#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003160 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003161#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003162#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003163 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003164#else
Fred Drake4baedc12002-04-01 14:53:37 +00003165 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003166#endif
3167#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003168 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003169#endif
3170#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003171 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003172#endif
3173#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003174 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003175#else
Fred Drake4baedc12002-04-01 14:53:37 +00003176 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003177#endif
3178#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003179 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003180#endif
3181#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003182 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003183#endif
3184#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003185 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003186#endif
3187#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003188 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003189#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003190#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003191 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003192#endif
3193#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003194 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003195#endif
3196#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003197 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003198#endif
3199#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003200 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003201#endif
3202#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003203 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003204#endif
3205#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003206 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003207#endif
3208#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003209 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003210#endif
3211#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003212 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003213#endif
3214#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003215 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003216#endif
3217#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003218 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003219#endif
3220#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003221 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003222#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003223#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003224 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003225#endif
3226#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003227 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003228#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003229#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003230 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003231#endif
3232#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003233 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003234#endif
3235#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003236 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003237#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003238#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003239 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003240#endif
3241/**/
3242#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003243 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003244#else
Fred Drake4baedc12002-04-01 14:53:37 +00003245 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003246#endif
3247#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003248 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003249#endif
3250
3251 /* Some port configuration */
3252#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003253 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003254#else
Fred Drake4baedc12002-04-01 14:53:37 +00003255 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003256#endif
3257#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003258 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003259#else
Fred Drake4baedc12002-04-01 14:53:37 +00003260 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003261#endif
3262
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003263 /* Some reserved IP v.4 addresses */
3264#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003265 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003266#else
Fred Drake4baedc12002-04-01 14:53:37 +00003267 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003268#endif
3269#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003270 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003271#else
Fred Drake4baedc12002-04-01 14:53:37 +00003272 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003273#endif
3274#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003275 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003276#else
Fred Drake4baedc12002-04-01 14:53:37 +00003277 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003278#endif
3279#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003280 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003281#else
Fred Drake4baedc12002-04-01 14:53:37 +00003282 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003283#endif
3284#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003285 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3286 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003287#else
Fred Drake4baedc12002-04-01 14:53:37 +00003288 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003289#endif
3290#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003291 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3292 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003293#else
Fred Drake4baedc12002-04-01 14:53:37 +00003294 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003295#endif
3296#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003297 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003298#else
Fred Drake4baedc12002-04-01 14:53:37 +00003299 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003300#endif
3301
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003302 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003303#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003304 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003305#endif
3306#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003307 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003308#endif
3309#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003310 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003311#endif
3312#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003313 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003314#endif
3315#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003316 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003317#endif
3318#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003319 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003320#endif
3321#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003322 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003323#endif
3324#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003325 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003326#endif
3327#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003328 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003329#endif
3330#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003331 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003332#endif
3333#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003334 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003335#endif
3336#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003337 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003338#endif
3339#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003340 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003341#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003342#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003343 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3344 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003345#endif
3346#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003347 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3348 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003349#endif
3350#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003351 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003352#endif
3353
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003354 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3355#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003356 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003357#endif
3358#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003359 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003360#endif
3361#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003362 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003363#endif
3364#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003365 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003366#endif
3367#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003368 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003369#endif
3370#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003371 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003372#endif
3373
Guido van Rossum09be4091999-08-09 14:40:40 +00003374 /* TCP options */
3375#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003376 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003377#endif
3378#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003379 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003380#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003381#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003382 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003383#endif
3384#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003385 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003386#endif
3387#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003388 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003389#endif
3390#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003391 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003392#endif
3393#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003394 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003395#endif
3396#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003397 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003398#endif
3399#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003400 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003401#endif
3402#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003403 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003404#endif
3405#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003406 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003407#endif
3408#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003409 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003410#endif
3411
Guido van Rossum09be4091999-08-09 14:40:40 +00003412
3413 /* IPX options */
3414#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003415 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003416#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003417
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003418 /* get{addr,name}info parameters */
3419#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003420 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003421#endif
3422#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003424#endif
3425#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003426 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003427#endif
3428#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003429 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003430#endif
3431#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003432 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003433#endif
3434#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003435 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003436#endif
3437#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003438 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003439#endif
3440#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003441 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003442#endif
3443#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003444 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003445#endif
3446#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003447 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003448#endif
3449#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003450 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003451#endif
3452#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003453 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003454#endif
3455#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003456 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003457#endif
3458#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003459 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003460#endif
3461#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003462 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003463#endif
3464#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003465 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003466#endif
3467#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003468 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003469#endif
3470#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003471 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003472#endif
3473#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003474 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003475#endif
3476#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003477 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003478#endif
3479#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003480 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003481#endif
3482#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003483 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003484#endif
3485#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003486 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003487#endif
3488#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003489 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003490#endif
3491#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003492 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003493#endif
3494#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003495 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003496#endif
3497#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003498 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003499#endif
3500#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003501 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003502#endif
3503#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003504 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003505#endif
3506#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003507 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003508#endif
3509
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003510 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003511#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003512 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003513#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003514}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003515
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003516
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003517#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003518
3519/* Simplistic emulation code for inet_pton that only works for IPv4 */
3520
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003521int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003522inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003523{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003524 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003525 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003526 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003527 if (packed_addr == INADDR_NONE)
3528 return 0;
3529 memcpy(dst, &packed_addr, 4);
3530 return 1;
3531 }
3532 /* Should set errno to EAFNOSUPPORT */
3533 return -1;
3534}
3535
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003536const char *
3537inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003538{
3539 if (af == AF_INET) {
3540 struct in_addr packed_addr;
3541 if (size < 16)
3542 /* Should set errno to ENOSPC. */
3543 return NULL;
3544 memcpy(&packed_addr, src, sizeof(packed_addr));
3545 return strncpy(dst, inet_ntoa(packed_addr), size);
3546 }
3547 /* Should set errno to EAFNOSUPPORT */
3548 return NULL;
3549}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003550
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003551#endif