blob: 9a3951681d5e0ccdb8043650e1e93ad297d495ac [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 Rossum9d0c8ce2002-07-18 17:08:35 +000038- socket.getdefaulttimeout() -> None | float
39- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000040- an Internet socket address is a pair (hostname, port)
41 where hostname can be anything recognized by gethostbyname()
42 (including the dd.dd.dd.dd notation) and port is in host byte order
43- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000044- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000045- an AF_PACKET socket address is a tuple containing a string
46 specifying the ethernet interface and an integer specifying
47 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000048 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
49 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000050 networking code, but accepted since they are returned by the
51 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000052
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000053Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000054
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000055- names starting with sock_ are socket object methods
56- names starting with socket_ are module-level functions
57- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000058
Guido van Rossum6574b3e1991-06-25 21:36:08 +000059*/
60
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000061#include "Python.h"
62
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000063/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000064PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000065"socket([family[, type[, proto]]]) -> socket object\n\
66\n\
67Open a socket of the given type. The family argument specifies the\n\
68address family; it defaults to AF_INET. The type argument specifies\n\
69whether this is a stream (SOCK_STREAM, this is the default)\n\
70or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
71specifying the default protocol. Keyword arguments are accepted.\n\
72\n\
73A socket object represents one endpoint of a network connection.\n\
74\n\
75Methods of socket objects (keyword arguments not allowed):\n\
76\n\
77accept() -- accept a connection, returning new socket and client address\n\
78bind(addr) -- bind the socket to a local address\n\
79close() -- close the socket\n\
80connect(addr) -- connect the socket to a remote address\n\
81connect_ex(addr) -- connect, return an error code instead of an exception\n\
82dup() -- return a new socket object identical to the current one [*]\n\
83fileno() -- return underlying file descriptor\n\
84getpeername() -- return remote address [*]\n\
85getsockname() -- return local address\n\
86getsockopt(level, optname[, buflen]) -- get socket options\n\
87gettimeout() -- return timeout or None\n\
88listen(n) -- start listening for incoming connections\n\
89makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
90recv(buflen[, flags]) -- receive data\n\
91recvfrom(buflen[, flags]) -- receive data and sender's address\n\
92sendall(data[, flags]) -- send all data\n\
93send(data[, flags]) -- send data, may not send all of it\n\
94sendto(data[, flags], addr) -- send data to a given address\n\
95setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
96setsockopt(level, optname, value) -- set socket options\n\
97settimeout(None | float) -- set or clear the timeout\n\
98shutdown(how) -- shut down traffic in one or both directions\n\
99\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000101
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000102/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
103 I hope some day someone can clean this up please... */
104
Guido van Rossum9376b741999-09-15 22:01:40 +0000105/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
106 script doesn't get this right, so we hardcode some platform checks below.
107 On the other hand, not all Linux versions agree, so there the settings
108 computed by the configure script are needed! */
109
110#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000111# undef HAVE_GETHOSTBYNAME_R_3_ARG
112# undef HAVE_GETHOSTBYNAME_R_5_ARG
113# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000114#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000115
Guido van Rossum7a122991999-04-13 04:07:32 +0000116#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000117# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000118#endif
119
Guido van Rossume7de2061999-03-24 17:24:33 +0000120#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000121# if defined(_AIX) || defined(__osf__)
122# define HAVE_GETHOSTBYNAME_R_3_ARG
123# elif defined(__sun) || defined(__sgi)
124# define HAVE_GETHOSTBYNAME_R_5_ARG
125# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000126/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000127# else
128# undef HAVE_GETHOSTBYNAME_R
129# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000130#endif
131
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000132#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
133 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000134# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000135#endif
136
137#ifdef USE_GETHOSTBYNAME_LOCK
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000138# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000139#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000140
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000141#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000142# include <types.h>
143# include <io.h>
144# include <sys/ioctl.h>
145# include <utils.h>
146# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000147#endif
148
149#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000150# define INCL_DOS
151# define INCL_DOSERRORS
152# define INCL_NOPMAPI
153# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000154#endif
155
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000156/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000157#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000158#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000160/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000162#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163
164/* Addressing includes */
165
Guido van Rossum6f489d91996-06-28 20:15:15 +0000166#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167
168/* Non-MS WINDOWS includes */
169# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000170
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# ifdef __BEOS__
173# include <net/netdb.h>
174# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
175# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000176typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000178# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000180
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# ifndef RISCOS
182# include <fcntl.h>
183# else
184# include <sys/fcntl.h>
185# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000186int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000187# endif
188
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000189#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000190
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000191/* MS_WINDOWS includes */
192# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000193
Jeremy Hylton22308652001-02-02 03:23:09 +0000194#endif
195
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000196#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000197# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000198#endif
199
200#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000201# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000202#endif
203
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000204#ifndef O_NDELAY
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000205# define O_NDELAY O_NONBLOCK /* For QNX only? */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000206#endif
207
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000208#include "addrinfo.h"
209
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000210#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000211int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000212const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000213#endif
214
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000215#ifdef __APPLE__
216/* On OS X, getaddrinfo returns no error indication of lookup
217 failure, so we must use the emulation instead of the libinfo
218 implementation. Unfortunately, performing an autoconf test
219 for this bug would require DNS access for the machine performing
220 the configuration, which is not acceptable. Therefore, we
221 determine the bug just by checking for __APPLE__. If this bug
222 gets ever fixed, perhaps checking for sys/version.h would be
223 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000224#ifndef HAVE_GETNAMEINFO
225/* This bug seems to be fixed in Jaguar. Ths easiest way I could
226 Find to check for Jaguar is that it has getnameinfo(), which
227 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000228#undef HAVE_GETADDRINFO
229/* avoid clashes with the C library definition of the symbol. */
230#define getaddrinfo fake_getaddrinfo
231#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000232#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000233
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000234/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000235#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000236#include "getaddrinfo.c"
237#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000238#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000239#include "getnameinfo.c"
240#endif
241
Guido van Rossumbcc20741998-08-04 22:53:56 +0000242#if defined(MS_WINDOWS) || defined(__BEOS__)
243/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000244/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000245#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000246#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000247#endif
248
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000249#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000250#define EAFNOSUPPORT WSAEAFNOSUPPORT
251#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000252#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000253
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000254#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000255#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000256#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000257#endif
258
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000259#ifndef SOCKETCLOSE
260#define SOCKETCLOSE close
261#endif
262
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000263/* XXX There's a problem here: *static* functions are not supposed to have
264 a Py prefix (or use CapitalizedWords). Later... */
265
Guido van Rossum30a685f1991-06-27 15:51:29 +0000266/* Global variable holding the exception type for errors detected
267 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000268static PyObject *socket_error;
269static PyObject *socket_herror;
270static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000271
Guido van Rossum48a680c2001-03-02 06:34:14 +0000272#ifdef RISCOS
273/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
274static int taskwindow;
275#endif
276
Tim Peters643a7fc2002-02-17 04:13:21 +0000277/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000278 The sock_type variable contains pointers to various functions,
279 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000280 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000281static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000282
Guido van Rossum30a685f1991-06-27 15:51:29 +0000283/* Convenience function to raise an error according to errno
284 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000285
Guido van Rossum73624e91994-10-10 17:59:00 +0000286static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000287set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000288{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000289#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000290 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000291 static struct {
292 int no;
293 const char *msg;
294 } *msgp, msgs[] = {
295 {WSAEINTR, "Interrupted system call"},
296 {WSAEBADF, "Bad file descriptor"},
297 {WSAEACCES, "Permission denied"},
298 {WSAEFAULT, "Bad address"},
299 {WSAEINVAL, "Invalid argument"},
300 {WSAEMFILE, "Too many open files"},
301 {WSAEWOULDBLOCK,
302 "The socket operation could not complete "
303 "without blocking"},
304 {WSAEINPROGRESS, "Operation now in progress"},
305 {WSAEALREADY, "Operation already in progress"},
306 {WSAENOTSOCK, "Socket operation on non-socket"},
307 {WSAEDESTADDRREQ, "Destination address required"},
308 {WSAEMSGSIZE, "Message too long"},
309 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
310 {WSAENOPROTOOPT, "Protocol not available"},
311 {WSAEPROTONOSUPPORT, "Protocol not supported"},
312 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
313 {WSAEOPNOTSUPP, "Operation not supported"},
314 {WSAEPFNOSUPPORT, "Protocol family not supported"},
315 {WSAEAFNOSUPPORT, "Address family not supported"},
316 {WSAEADDRINUSE, "Address already in use"},
317 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
318 {WSAENETDOWN, "Network is down"},
319 {WSAENETUNREACH, "Network is unreachable"},
320 {WSAENETRESET, "Network dropped connection on reset"},
321 {WSAECONNABORTED, "Software caused connection abort"},
322 {WSAECONNRESET, "Connection reset by peer"},
323 {WSAENOBUFS, "No buffer space available"},
324 {WSAEISCONN, "Socket is already connected"},
325 {WSAENOTCONN, "Socket is not connected"},
326 {WSAESHUTDOWN, "Can't send after socket shutdown"},
327 {WSAETOOMANYREFS, "Too many references: can't splice"},
328 {WSAETIMEDOUT, "Operation timed out"},
329 {WSAECONNREFUSED, "Connection refused"},
330 {WSAELOOP, "Too many levels of symbolic links"},
331 {WSAENAMETOOLONG, "File name too long"},
332 {WSAEHOSTDOWN, "Host is down"},
333 {WSAEHOSTUNREACH, "No route to host"},
334 {WSAENOTEMPTY, "Directory not empty"},
335 {WSAEPROCLIM, "Too many processes"},
336 {WSAEUSERS, "Too many users"},
337 {WSAEDQUOT, "Disc quota exceeded"},
338 {WSAESTALE, "Stale NFS file handle"},
339 {WSAEREMOTE, "Too many levels of remote in path"},
340 {WSASYSNOTREADY, "Network subsystem is unvailable"},
341 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
342 {WSANOTINITIALISED,
343 "Successful WSAStartup() not yet performed"},
344 {WSAEDISCON, "Graceful shutdown in progress"},
345 /* Resolver errors */
346 {WSAHOST_NOT_FOUND, "No such host is known"},
347 {WSATRY_AGAIN, "Host not found, or server failed"},
348 {WSANO_RECOVERY, "Unexpected server error encountered"},
349 {WSANO_DATA, "Valid name without requested data"},
350 {WSANO_ADDRESS, "No address, look for MX record"},
351 {0, NULL}
352 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000353 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000354 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000355 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000356
Mark Hammond46a733d2000-07-24 01:45:11 +0000357 for (msgp = msgs; msgp->msg; msgp++) {
358 if (err_no == msgp->no) {
359 msg = msgp->msg;
360 break;
361 }
362 }
363
364 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000365 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000366 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000367 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000368 }
369 return NULL;
370 }
371 else
372#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000373
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000374#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000375 if (sock_errno() != NO_ERROR) {
376 APIRET rc;
377 ULONG msglen;
378 char outbuf[100];
379 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000380
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000381 /* Retrieve socket-related error message from MPTN.MSG file */
382 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
383 myerrorcode - SOCBASEERR + 26,
384 "mptn.msg",
385 &msglen);
386 if (rc == NO_ERROR) {
387 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000388
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000389 /* OS/2 doesn't guarantee a terminator */
390 outbuf[msglen] = '\0';
391 if (strlen(outbuf) > 0) {
392 /* If non-empty msg, trim CRLF */
393 char *lastc = &outbuf[ strlen(outbuf)-1 ];
394 while (lastc > outbuf && isspace(*lastc)) {
395 /* Trim trailing whitespace (CRLF) */
396 *lastc-- = '\0';
397 }
398 }
399 v = Py_BuildValue("(is)", myerrorcode, outbuf);
400 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000401 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000402 Py_DECREF(v);
403 }
404 return NULL;
405 }
406 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000407#endif
408
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000409 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000410}
411
Guido van Rossum30a685f1991-06-27 15:51:29 +0000412
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000413static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000414set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000415{
416 PyObject *v;
417
418#ifdef HAVE_HSTRERROR
419 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
420#else
421 v = Py_BuildValue("(is)", h_error, "host not found");
422#endif
423 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000424 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000425 Py_DECREF(v);
426 }
427
428 return NULL;
429}
430
431
432static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000433set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000434{
435 PyObject *v;
436
Martin v. Löwis272cb402002-03-01 08:31:07 +0000437#ifdef EAI_SYSTEM
438 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000439 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000440 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000441#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000442
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000443#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000444 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000445#else
446 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
447#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000448 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000449 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000450 Py_DECREF(v);
451 }
452
453 return NULL;
454}
455
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000456/* Function to perform the setting of socket blocking mode
457 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000458static int
459internal_setblocking(PySocketSockObject *s, int block)
460{
461#ifndef RISCOS
462#ifndef MS_WINDOWS
463 int delay_flag;
464#endif
465#endif
466
467 Py_BEGIN_ALLOW_THREADS
468#ifdef __BEOS__
469 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000470 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
471 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000472#else
473#ifndef RISCOS
474#ifndef MS_WINDOWS
475#if defined(PYOS_OS2) && !defined(PYCC_GCC)
476 block = !block;
477 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
478#else /* !PYOS_OS2 */
479 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
480 if (block)
481 delay_flag &= (~O_NDELAY);
482 else
483 delay_flag |= O_NDELAY;
484 fcntl(s->sock_fd, F_SETFL, delay_flag);
485#endif /* !PYOS_OS2 */
486#else /* MS_WINDOWS */
487 block = !block;
488 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
489#endif /* MS_WINDOWS */
490#endif /* __BEOS__ */
491#endif /* RISCOS */
492 Py_END_ALLOW_THREADS
493
494 /* Since these don't return anything */
495 return 1;
496}
497
Guido van Rossum11ba0942002-06-13 15:07:44 +0000498/* Do a select() on the socket, if necessary (sock_timeout > 0).
499 The argument writing indicates the direction.
500 This does not raise an exception or return a success indicator;
501 we'll let the actual socket call do that. */
502static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000503internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000504{
505 fd_set fds;
506 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000507
508 if (s->sock_timeout <= 0.0)
509 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000510
511 /* Construct the arguments to select */
512 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000513 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000514 FD_ZERO(&fds);
515 FD_SET(s->sock_fd, &fds);
516
517 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000518 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000519 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000520 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000521 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000522}
523
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000524/* Initialize a new socket object. */
525
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000526static float defaulttimeout = -1.0; /* Default timeout for new sockets */
527
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000528static void
529init_sockobject(PySocketSockObject *s,
530 SOCKET_T fd, int family, int type, int proto)
531{
532#ifdef RISCOS
533 int block = 1;
534#endif
535 s->sock_fd = fd;
536 s->sock_family = family;
537 s->sock_type = type;
538 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000539 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000540
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000541 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000542
543 if (defaulttimeout >= 0.0)
544 internal_setblocking(s, 0);
545
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000546#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000547 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000548 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000549#endif
550}
551
552
Guido van Rossum30a685f1991-06-27 15:51:29 +0000553/* Create a new socket object.
554 This just creates the object and initializes it.
555 If the creation fails, return NULL and set an exception (implicit
556 in NEWOBJ()). */
557
Guido van Rossum73624e91994-10-10 17:59:00 +0000558static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000559new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000560{
Guido van Rossum73624e91994-10-10 17:59:00 +0000561 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000562 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000563 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000564 if (s != NULL)
565 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000566 return s;
567}
568
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569
Guido van Rossum48a680c2001-03-02 06:34:14 +0000570/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000571 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000572#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000573PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000574#endif
575
576
Guido van Rossum30a685f1991-06-27 15:51:29 +0000577/* Convert a string specifying a host name or one of a few symbolic
578 names to a numeric IP address. This usually calls gethostbyname()
579 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000581 an error occurred; then an exception is raised. */
582
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000583static int
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000584setipaddr(char *name, struct sockaddr *addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000585{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586 struct addrinfo hints, *res;
587 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000588
Guido van Rossuma376cc51996-12-05 23:43:35 +0000589 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000590 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591 int siz;
592 memset(&hints, 0, sizeof(hints));
593 hints.ai_family = af;
594 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
595 hints.ai_flags = AI_PASSIVE;
596 error = getaddrinfo(NULL, "0", &hints, &res);
597 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000598 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000599 return -1;
600 }
601 switch (res->ai_family) {
602 case AF_INET:
603 siz = 4;
604 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000605#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606 case AF_INET6:
607 siz = 16;
608 break;
609#endif
610 default:
611 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000612 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613 "unsupported address family");
614 return -1;
615 }
616 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000617 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000618 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000619 "wildcard resolved to multiple address");
620 return -1;
621 }
622 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
623 freeaddrinfo(res);
624 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000625 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000626 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000627 struct sockaddr_in *sin;
628 if (af != PF_INET && af != PF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000629 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000630 "address family mismatched");
631 return -1;
632 }
633 sin = (struct sockaddr_in *)addr_ret;
634 memset((void *) sin, '\0', sizeof(*sin));
635 sin->sin_family = AF_INET;
636#ifdef HAVE_SOCKADDR_SA_LEN
637 sin->sin_len = sizeof(*sin);
638#endif
639 sin->sin_addr.s_addr = INADDR_BROADCAST;
640 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000642 memset(&hints, 0, sizeof(hints));
643 hints.ai_family = af;
644 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000645#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000646 if (error == EAI_NONAME && af == AF_UNSPEC) {
647 /* On Tru64 V5.1, numeric-to-addr conversion fails
648 if no address family is given. Assume IPv4 for now.*/
649 hints.ai_family = AF_INET;
650 error = getaddrinfo(name, NULL, &hints, &res);
651 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000652#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000653 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000654 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000655 return -1;
656 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000657 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
658 freeaddrinfo(res);
659 switch (addr_ret->sa_family) {
660 case AF_INET:
661 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000662#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000663 case AF_INET6:
664 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000665#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000666 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000667 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000668 return -1;
669 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000670}
671
Guido van Rossum30a685f1991-06-27 15:51:29 +0000672
Guido van Rossum30a685f1991-06-27 15:51:29 +0000673/* Create a string object representing an IP address.
674 This is always a string of the form 'dd.dd.dd.dd' (with variable
675 size numbers). */
676
Guido van Rossum73624e91994-10-10 17:59:00 +0000677static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000678makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000679{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000680 char buf[NI_MAXHOST];
681 int error;
682
683 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
684 NI_NUMERICHOST);
685 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000686 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000687 return NULL;
688 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000689 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000690}
691
692
693/* Create an object representing the given socket address,
694 suitable for passing it back to bind(), connect() etc.
695 The family field of the sockaddr structure is inspected
696 to determine what kind of address it really is. */
697
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000698/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000699static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000700makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000701{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000702 if (addrlen == 0) {
703 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000704 Py_INCREF(Py_None);
705 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000706 }
707
Guido van Rossumbcc20741998-08-04 22:53:56 +0000708#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000709 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000710 addr->sa_family = AF_INET;
711#endif
712
Guido van Rossum30a685f1991-06-27 15:51:29 +0000713 switch (addr->sa_family) {
714
715 case AF_INET:
716 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000717 struct sockaddr_in *a;
718 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000719 PyObject *ret = NULL;
720 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000721 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000722 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
723 Py_DECREF(addrobj);
724 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000725 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000726 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000727
Guido van Rossumb6775db1994-08-01 11:34:53 +0000728#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000729 case AF_UNIX:
730 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000732 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000733 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000734#endif /* AF_UNIX */
735
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000736#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000737 case AF_INET6:
738 {
739 struct sockaddr_in6 *a;
740 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
741 PyObject *ret = NULL;
742 if (addrobj) {
743 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000744 ret = Py_BuildValue("Oiii",
745 addrobj,
746 ntohs(a->sin6_port),
747 a->sin6_flowinfo,
748 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000749 Py_DECREF(addrobj);
750 }
751 return ret;
752 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000753#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000755#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000756 case AF_PACKET:
757 {
758 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
759 char *ifname = "";
760 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000761 /* need to look up interface name give index */
762 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000763 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000764 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000765 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000766 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000767 return Py_BuildValue("shbhs#",
768 ifname,
769 ntohs(a->sll_protocol),
770 a->sll_pkttype,
771 a->sll_hatype,
772 a->sll_addr,
773 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000774 }
775#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000776
Guido van Rossum30a685f1991-06-27 15:51:29 +0000777 /* More cases here... */
778
779 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000780 /* If we don't know the address family, don't raise an
781 exception -- return it as a tuple. */
782 return Py_BuildValue("is#",
783 addr->sa_family,
784 addr->sa_data,
785 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000786
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788}
789
Guido van Rossum30a685f1991-06-27 15:51:29 +0000790
791/* Parse a socket address argument according to the socket object's
792 address family. Return 1 if the address was in the proper format,
793 0 of not. The address is returned through addr_ret, its length
794 through len_ret. */
795
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000797getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000798 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000799{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000800 switch (s->sock_family) {
801
Guido van Rossumb6775db1994-08-01 11:34:53 +0000802#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000803 case AF_UNIX:
804 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000805 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000806 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000808 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000809 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000811 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000812 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000813 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000814 return 0;
815 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000816 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000817 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000818 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000819 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000820 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000821 return 1;
822 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000823#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824
Guido van Rossum30a685f1991-06-27 15:51:29 +0000825 case AF_INET:
826 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000827 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000828 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000830 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000831 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000832 PyErr_Format(
833 PyExc_TypeError,
834 "getsockaddrarg: "
835 "AF_INET address must be tuple, not %.500s",
836 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000837 return 0;
838 }
839 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000840 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000841 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000842 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000843 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000844 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000845 *addr_ret = (struct sockaddr *) addr;
846 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847 return 1;
848 }
849
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000850#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000851 case AF_INET6:
852 {
853 struct sockaddr_in6* addr;
854 char *host;
855 int port, flowinfo, scope_id;
856 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
857 flowinfo = scope_id = 0;
858 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000859 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000860 return 0;
861 }
862 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
863 return 0;
864 addr->sin6_family = s->sock_family;
865 addr->sin6_port = htons((short)port);
866 addr->sin6_flowinfo = flowinfo;
867 addr->sin6_scope_id = scope_id;
868 *addr_ret = (struct sockaddr *) addr;
869 *len_ret = sizeof *addr;
870 return 1;
871 }
872#endif
873
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000874#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000875 case AF_PACKET:
876 {
877 struct sockaddr_ll* addr;
878 struct ifreq ifr;
879 char *interfaceName;
880 int protoNumber;
881 int hatype = 0;
882 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000883 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000884
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000885 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
886 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000887 return 0;
888 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
889 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000890 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000891 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000892 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000893 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000894 addr = &(s->sock_addr.ll);
895 addr->sll_family = AF_PACKET;
896 addr->sll_protocol = htons((short)protoNumber);
897 addr->sll_ifindex = ifr.ifr_ifindex;
898 addr->sll_pkttype = pkttype;
899 addr->sll_hatype = hatype;
900 *addr_ret = (struct sockaddr *) addr;
901 *len_ret = sizeof *addr;
902 return 1;
903 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000904#endif
905
Guido van Rossum30a685f1991-06-27 15:51:29 +0000906 /* More cases here... */
907
908 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000909 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000910 return 0;
911
912 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000913}
914
Guido van Rossum30a685f1991-06-27 15:51:29 +0000915
Guido van Rossum48a680c2001-03-02 06:34:14 +0000916/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000917 Return 1 if the family is known, 0 otherwise. The length is returned
918 through len_ret. */
919
920static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000921getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000922{
923 switch (s->sock_family) {
924
Guido van Rossumb6775db1994-08-01 11:34:53 +0000925#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000926 case AF_UNIX:
927 {
928 *len_ret = sizeof (struct sockaddr_un);
929 return 1;
930 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000931#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000932
933 case AF_INET:
934 {
935 *len_ret = sizeof (struct sockaddr_in);
936 return 1;
937 }
938
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000939#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000940 case AF_INET6:
941 {
942 *len_ret = sizeof (struct sockaddr_in6);
943 return 1;
944 }
945#endif
946
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000947#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000948 case AF_PACKET:
949 {
950 *len_ret = sizeof (struct sockaddr_ll);
951 return 1;
952 }
953#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000954
Guido van Rossum710e1df1992-06-12 10:39:36 +0000955 /* More cases here... */
956
957 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000958 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000959 return 0;
960
961 }
962}
963
964
Guido van Rossum30a685f1991-06-27 15:51:29 +0000965/* s.accept() method */
966
Guido van Rossum73624e91994-10-10 17:59:00 +0000967static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000968sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000969{
970 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000971 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000972 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000973 PyObject *sock = NULL;
974 PyObject *addr = NULL;
975 PyObject *res = NULL;
976
Guido van Rossum710e1df1992-06-12 10:39:36 +0000977 if (!getsockaddrlen(s, &addrlen))
978 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000979 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000980
Guido van Rossum73624e91994-10-10 17:59:00 +0000981 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +0000982 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000983 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000984 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000985
Fred Drakea04eaad2000-06-30 02:46:07 +0000986#ifdef MS_WINDOWS
987 if (newfd == INVALID_SOCKET)
988#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000989 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000990#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000991 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +0000992
Guido van Rossum30a685f1991-06-27 15:51:29 +0000993 /* Create the new object with unspecified family,
994 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000995 sock = (PyObject *) new_sockobject(newfd,
996 s->sock_family,
997 s->sock_type,
998 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000999
Barry Warsaw752300b1997-01-03 17:18:10 +00001000 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001001 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001002 goto finally;
1003 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001004 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001005 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001006 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001007 goto finally;
1008
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001009 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001010
Guido van Rossum67f7a382002-06-06 21:08:16 +00001011finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001012 Py_XDECREF(sock);
1013 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001014 return res;
1015}
1016
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001017PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001018"accept() -> (socket object, address info)\n\
1019\n\
1020Wait for an incoming connection. Return a new socket representing the\n\
1021connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001022info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001023
Guido van Rossum11ba0942002-06-13 15:07:44 +00001024/* s.setblocking(flag) method. Argument:
1025 False -- non-blocking mode; same as settimeout(0)
1026 True -- blocking mode; same as settimeout(None)
1027*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001028
Guido van Rossum73624e91994-10-10 17:59:00 +00001029static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001030sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001031{
1032 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001033
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001034 block = PyInt_AsLong(arg);
1035 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001036 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001037
Guido van Rossum11ba0942002-06-13 15:07:44 +00001038 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001039 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001040
Guido van Rossum73624e91994-10-10 17:59:00 +00001041 Py_INCREF(Py_None);
1042 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001043}
Guido van Rossume4485b01994-09-07 14:32:49 +00001044
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001045PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001046"setblocking(flag)\n\
1047\n\
1048Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001049setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001050setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001051
Guido van Rossum11ba0942002-06-13 15:07:44 +00001052/* s.settimeout(timeout) method. Argument:
1053 None -- no timeout, blocking mode; same as setblocking(True)
1054 0.0 -- non-blocking mode; same as setblocking(False)
1055 > 0 -- timeout mode; operations time out after timeout seconds
1056 < 0 -- illegal; raises an exception
1057*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001058static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001059sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001060{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001061 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001062
1063 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001064 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001065 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001066 timeout = PyFloat_AsDouble(arg);
1067 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001068 if (!PyErr_Occurred())
1069 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001070 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001071 return NULL;
1072 }
1073 }
1074
Guido van Rossum11ba0942002-06-13 15:07:44 +00001075 s->sock_timeout = timeout;
1076 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001077
1078 Py_INCREF(Py_None);
1079 return Py_None;
1080}
1081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001082PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001083"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001084\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001085Set a timeout on socket operations. 'timeout' can be a float,\n\
1086giving in seconds, or None. Setting a timeout of None disables\n\
1087the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001088Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001089
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001090/* s.gettimeout() method.
1091 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001092static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001093sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001094{
1095 if (s->sock_timeout < 0.0) {
1096 Py_INCREF(Py_None);
1097 return Py_None;
1098 }
1099 else
1100 return PyFloat_FromDouble(s->sock_timeout);
1101}
1102
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001103PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001104"gettimeout()\n\
1105\n\
1106Returns the timeout in floating seconds associated with socket \n\
1107operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001108operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001109
Guido van Rossum48a680c2001-03-02 06:34:14 +00001110#ifdef RISCOS
1111/* s.sleeptaskw(1 | 0) method */
1112
1113static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001114sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001115{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001116 int block;
1117 int delay_flag;
1118 if (!PyArg_Parse(args, "i", &block))
1119 return NULL;
1120 Py_BEGIN_ALLOW_THREADS
1121 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1122 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001123
Guido van Rossum67f7a382002-06-06 21:08:16 +00001124 Py_INCREF(Py_None);
1125 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001126}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001127PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001128"sleeptaskw(flag)\n\
1129\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001130Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001131#endif
1132
1133
Guido van Rossumaee08791992-09-08 09:05:33 +00001134/* s.setsockopt() method.
1135 With an integer third argument, sets an integer option.
1136 With a string third argument, sets an option from a buffer;
1137 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001138
Guido van Rossum73624e91994-10-10 17:59:00 +00001139static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001140sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001141{
1142 int level;
1143 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001144 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001145 char *buf;
1146 int buflen;
1147 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001148
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001149 if (PyArg_ParseTuple(args, "iii:setsockopt",
1150 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001151 buf = (char *) &flag;
1152 buflen = sizeof flag;
1153 }
1154 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001155 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001156 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1157 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001158 return NULL;
1159 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001160 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001161 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001162 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001163 Py_INCREF(Py_None);
1164 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001165}
1166
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001167PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001168"setsockopt(level, option, value)\n\
1169\n\
1170Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001171The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001172
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001173
Guido van Rossumaee08791992-09-08 09:05:33 +00001174/* s.getsockopt() method.
1175 With two arguments, retrieves an integer option.
1176 With a third integer argument, retrieves a string buffer of that size;
1177 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001178
Guido van Rossum73624e91994-10-10 17:59:00 +00001179static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001180sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001181{
1182 int level;
1183 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001184 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001185 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001186 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001187
Guido van Rossumbcc20741998-08-04 22:53:56 +00001188#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001189 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001190 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001191 return NULL;
1192#else
1193
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001194 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1195 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001196 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001197
Guido van Rossumbe32c891996-06-20 16:25:29 +00001198 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001199 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001200 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001201 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001202 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001203 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001204 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001205 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001206 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001207 if (buflen <= 0 || buflen > 1024) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001208 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001209 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001210 return NULL;
1211 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001212 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001213 if (buf == NULL)
1214 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001215 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001216 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001217 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001218 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001219 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001220 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001221 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001222 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001223#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001224}
1225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001226PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001227"getsockopt(level, option[, buffersize]) -> value\n\
1228\n\
1229Get a socket option. See the Unix manual for level and option.\n\
1230If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001231string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001232
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001233
Fred Drake728819a2000-07-01 03:40:12 +00001234/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001235
Guido van Rossum73624e91994-10-10 17:59:00 +00001236static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001237sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001238{
1239 struct sockaddr *addr;
1240 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001241 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001242
Fred Drake728819a2000-07-01 03:40:12 +00001243 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001244 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001245 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001246 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001247 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001248 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001249 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001250 Py_INCREF(Py_None);
1251 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001252}
1253
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001254PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001255"bind(address)\n\
1256\n\
1257Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001258pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001259sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001260
Guido van Rossum30a685f1991-06-27 15:51:29 +00001261
1262/* s.close() method.
1263 Set the file descriptor to -1 so operations tried subsequently
1264 will surely fail. */
1265
Guido van Rossum73624e91994-10-10 17:59:00 +00001266static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001267sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001268{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001269 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001270
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001271 if ((fd = s->sock_fd) != -1) {
1272 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001273 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001274 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001275 Py_END_ALLOW_THREADS
1276 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001277 Py_INCREF(Py_None);
1278 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001279}
1280
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001281PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001282"close()\n\
1283\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001284Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001285
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001286static int
1287internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1288{
1289 int res;
1290
1291 res = connect(s->sock_fd, addr, addrlen);
1292
1293#ifdef MS_WINDOWS
1294
1295 if (s->sock_timeout > 0.0) {
1296 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
1297 internal_select(s, 1);
1298 res = connect(s->sock_fd, addr, addrlen);
1299 if (res < 0 && WSAGetLastError() == WSAEISCONN)
1300 res = 0;
1301 }
1302 }
1303
1304 if (res < 0)
1305 res = WSAGetLastError();
1306
1307#else
1308
1309 if (s->sock_timeout > 0.0) {
1310 if (res < 0 && errno == EINPROGRESS) {
1311 internal_select(s, 1);
1312 res = connect(s->sock_fd, addr, addrlen);
1313 }
1314 }
1315
1316 if (res < 0)
1317 res = errno;
1318
1319#endif
1320
1321 return res;
1322}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001323
Fred Drake728819a2000-07-01 03:40:12 +00001324/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001325
Guido van Rossum73624e91994-10-10 17:59:00 +00001326static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001327sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001328{
1329 struct sockaddr *addr;
1330 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001331 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001332
Fred Drake728819a2000-07-01 03:40:12 +00001333 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001334 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001335
Guido van Rossum73624e91994-10-10 17:59:00 +00001336 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001337 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001338 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001339
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001340 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001341 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001342 Py_INCREF(Py_None);
1343 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001344}
1345
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001346PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001347"connect(address)\n\
1348\n\
1349Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001350is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001351
Guido van Rossum30a685f1991-06-27 15:51:29 +00001352
Fred Drake728819a2000-07-01 03:40:12 +00001353/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001354
1355static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001356sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001357{
1358 struct sockaddr *addr;
1359 int addrlen;
1360 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001361
Fred Drake728819a2000-07-01 03:40:12 +00001362 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001363 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001364
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001365 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001366 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001367 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001368
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001369 return PyInt_FromLong((long) res);
1370}
1371
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001372PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001373"connect_ex(address)\n\
1374\n\
1375This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001376instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001377
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001378
Guido van Rossumed233a51992-06-23 09:07:03 +00001379/* s.fileno() method */
1380
Guido van Rossum73624e91994-10-10 17:59:00 +00001381static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001382sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001383{
Fred Drakea04eaad2000-06-30 02:46:07 +00001384#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001385 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001386#else
1387 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1388#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001389}
1390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001391PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001392"fileno() -> integer\n\
1393\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001394Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001395
Guido van Rossumed233a51992-06-23 09:07:03 +00001396
Guido van Rossumbe32c891996-06-20 16:25:29 +00001397#ifndef NO_DUP
1398/* s.dup() method */
1399
1400static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001401sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001402{
Fred Drakea04eaad2000-06-30 02:46:07 +00001403 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001404 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001405
Guido van Rossumbe32c891996-06-20 16:25:29 +00001406 newfd = dup(s->sock_fd);
1407 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001408 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001409 sock = (PyObject *) new_sockobject(newfd,
1410 s->sock_family,
1411 s->sock_type,
1412 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001413 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001414 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001415 return sock;
1416}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001417
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001418PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001419"dup() -> socket object\n\
1420\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001421Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001422
Guido van Rossumbe32c891996-06-20 16:25:29 +00001423#endif
1424
1425
Guido van Rossumc89705d1992-11-26 08:54:07 +00001426/* s.getsockname() method */
1427
Guido van Rossum73624e91994-10-10 17:59:00 +00001428static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001429sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001430{
1431 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001432 int res;
1433 socklen_t addrlen;
1434
Guido van Rossumc89705d1992-11-26 08:54:07 +00001435 if (!getsockaddrlen(s, &addrlen))
1436 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001437 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001438 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001439 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001440 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001441 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001442 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001443 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001444}
1445
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001446PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001447"getsockname() -> address info\n\
1448\n\
1449Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001450info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001451
Guido van Rossumc89705d1992-11-26 08:54:07 +00001452
Guido van Rossumb6775db1994-08-01 11:34:53 +00001453#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001454/* s.getpeername() method */
1455
Guido van Rossum73624e91994-10-10 17:59:00 +00001456static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001457sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001458{
1459 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001460 int res;
1461 socklen_t addrlen;
1462
Guido van Rossumc89705d1992-11-26 08:54:07 +00001463 if (!getsockaddrlen(s, &addrlen))
1464 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001465 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001466 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001467 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001468 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001469 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001470 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001471 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001472}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001473
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001474PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001475"getpeername() -> address info\n\
1476\n\
1477Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001478info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001479
Guido van Rossumb6775db1994-08-01 11:34:53 +00001480#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001481
1482
Guido van Rossum30a685f1991-06-27 15:51:29 +00001483/* s.listen(n) method */
1484
Guido van Rossum73624e91994-10-10 17:59:00 +00001485static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001486sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001487{
1488 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001489 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001490
1491 backlog = PyInt_AsLong(arg);
1492 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001493 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001494 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001495 if (backlog < 1)
1496 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001497 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001498 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001499 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001500 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001501 Py_INCREF(Py_None);
1502 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001503}
1504
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001505PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001506"listen(backlog)\n\
1507\n\
1508Enable a server to accept connections. The backlog argument must be at\n\
1509least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001510will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001511
1512
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001513#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001514/* s.makefile(mode) method.
1515 Create a new open file object referring to a dupped version of
1516 the socket's file descriptor. (The dup() call is necessary so
1517 that the open file and socket objects may be closed independent
1518 of each other.)
1519 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1520
Guido van Rossum73624e91994-10-10 17:59:00 +00001521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001522sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001523{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001524 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001525 char *mode = "r";
1526 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001527#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001528 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001529#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001530 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001531#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001532 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001533 PyObject *f;
1534
Guido van Rossum43713e52000-02-29 13:59:29 +00001535 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001536 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001537#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001538 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1539 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001540#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001541 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001542#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001543 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001544 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001545 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001546 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001547 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001548#ifdef USE_GUSI2
1549 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001550 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001551 bufsize = 0;
1552#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001553 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1554 if (f != NULL)
1555 PyFile_SetBufSize(f, bufsize);
1556 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001557}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001558
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001559PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001560"makefile([mode[, buffersize]]) -> file object\n\
1561\n\
1562Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001563The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001564
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001565#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001566
Guido van Rossum48a680c2001-03-02 06:34:14 +00001567
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001568/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001569
Guido van Rossum73624e91994-10-10 17:59:00 +00001570static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001571sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001572{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001573 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001574 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001575
Guido van Rossum43713e52000-02-29 13:59:29 +00001576 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001577 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001578
1579 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001580 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001581 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001582 return NULL;
1583 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001584
Guido van Rossum73624e91994-10-10 17:59:00 +00001585 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001586 if (buf == NULL)
1587 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001588
Guido van Rossum73624e91994-10-10 17:59:00 +00001589 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001590 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001591 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001592 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001593
Guido van Rossum7c53b771995-09-13 18:39:47 +00001594 if (n < 0) {
1595 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001596 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001597 }
Tim Peters5de98422002-04-27 18:44:32 +00001598 if (n != len)
1599 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001600 return buf;
1601}
1602
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001603PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001604"recv(buffersize[, flags]) -> data\n\
1605\n\
1606Receive up to buffersize bytes from the socket. For the optional flags\n\
1607argument, see the Unix manual. When no data is available, block until\n\
1608at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001609the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001610
Guido van Rossum30a685f1991-06-27 15:51:29 +00001611
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001612/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001613
Guido van Rossum73624e91994-10-10 17:59:00 +00001614static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001615sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001616{
1617 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001618 PyObject *buf = NULL;
1619 PyObject *addr = NULL;
1620 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001621 int len, n, flags = 0;
1622 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001623
Guido van Rossum43713e52000-02-29 13:59:29 +00001624 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001625 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001626
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001627 if (!getsockaddrlen(s, &addrlen))
1628 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001629 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001630 if (buf == NULL)
1631 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001632
Guido van Rossum73624e91994-10-10 17:59:00 +00001633 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001634 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001635 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001636 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001637#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001638#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001639 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001640#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001641 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001642#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001643#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001644 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001645#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001646 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001647 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001648
Guido van Rossum7c53b771995-09-13 18:39:47 +00001649 if (n < 0) {
1650 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001651 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001652 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001653
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001654 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001655 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001656
Guido van Rossum67f7a382002-06-06 21:08:16 +00001657 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001658 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001659 goto finally;
1660
Guido van Rossum73624e91994-10-10 17:59:00 +00001661 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001662
1663finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001664 Py_XDECREF(addr);
1665 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001666 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001667}
1668
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001669PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001670"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1671\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001672Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001673
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001674/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001675
Guido van Rossum73624e91994-10-10 17:59:00 +00001676static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001677sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001678{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001679 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001680 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001681
Guido van Rossum43713e52000-02-29 13:59:29 +00001682 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001683 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001684
Guido van Rossum73624e91994-10-10 17:59:00 +00001685 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001686 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001687 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001688 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001689
Guido van Rossum30a685f1991-06-27 15:51:29 +00001690 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001691 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001692 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001693}
1694
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001695PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001696"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001697\n\
1698Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001699argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001700sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001701
1702
1703/* s.sendall(data [,flags]) method */
1704
1705static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001706sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001707{
1708 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001709 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001710
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001711 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1712 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001713
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001714 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001715 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001716 do {
1717 n = send(s->sock_fd, buf, len, flags);
1718 if (n < 0)
1719 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001720 buf += n;
1721 len -= n;
1722 } while (len > 0);
1723 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001724
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001725 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001726 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001727
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001728 Py_INCREF(Py_None);
1729 return Py_None;
1730}
1731
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001732PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001733"sendall(data[, flags])\n\
1734\n\
1735Send a data string to the socket. For the optional flags\n\
1736argument, see the Unix manual. This calls send() repeatedly\n\
1737until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001738to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001739
Guido van Rossum30a685f1991-06-27 15:51:29 +00001740
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001741/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001742
Guido van Rossum73624e91994-10-10 17:59:00 +00001743static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001744sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001745{
Guido van Rossum73624e91994-10-10 17:59:00 +00001746 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001747 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001748 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001749 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001750
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001751 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001752 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001753 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001754 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1755 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001756 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001757 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001758
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001759 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001760 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001761
Guido van Rossum73624e91994-10-10 17:59:00 +00001762 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001763 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001764 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001765 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001766
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001767 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001768 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001769 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001770}
1771
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001772PyDoc_STRVAR(sendto_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001773"sendto(data[, flags], address)\n\
1774\n\
1775Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001776For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001777
Guido van Rossum30a685f1991-06-27 15:51:29 +00001778
1779/* s.shutdown(how) method */
1780
Guido van Rossum73624e91994-10-10 17:59:00 +00001781static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001782sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001783{
1784 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001785 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001786
1787 how = PyInt_AsLong(arg);
1788 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001789 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001790 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001791 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001792 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001793 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001794 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001795 Py_INCREF(Py_None);
1796 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001797}
1798
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001799PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001800"shutdown(flag)\n\
1801\n\
1802Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001803of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001804
Guido van Rossum30a685f1991-06-27 15:51:29 +00001805
1806/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001807
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001808static PyMethodDef sock_methods[] = {
1809 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001810 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001811 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001812 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001813 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001814 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001815 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001816 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001817 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001818 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001819#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001820 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001821 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001822#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001823 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001824 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001825#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001826 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001827 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001828#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001829 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001830 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001831 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001832 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001833 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001834 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001835#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001836 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001837 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001838#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001839 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001840 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001841 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001842 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001843 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001844 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001845 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001846 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001847 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001848 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001849 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001850 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001851 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001852 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001853 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001854 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001855 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001856 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001857 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001858 shutdown_doc},
1859#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001860 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001861 sleeptaskw_doc},
1862#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001863 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001864};
1865
Guido van Rossum30a685f1991-06-27 15:51:29 +00001866
Guido van Rossum73624e91994-10-10 17:59:00 +00001867/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001868 First close the file description. */
1869
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001870static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001871sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001872{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001873 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001874 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001875 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001876}
1877
Guido van Rossum30a685f1991-06-27 15:51:29 +00001878
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001879static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001880sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001881{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001882 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001883#if SIZEOF_SOCKET_T > SIZEOF_LONG
1884 if (s->sock_fd > LONG_MAX) {
1885 /* this can occur on Win64, and actually there is a special
1886 ugly printf formatter for decimal pointer length integer
1887 printing, only bother if necessary*/
1888 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001889 "no printf formatter to display "
1890 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00001891 return NULL;
1892 }
1893#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001894 PyOS_snprintf(
1895 buf, sizeof(buf),
1896 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1897 (long)s->sock_fd, s->sock_family,
1898 s->sock_type,
1899 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001900 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001901}
1902
1903
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001904/* Create a new, uninitialized socket object. */
1905
1906static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001907sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001908{
1909 PyObject *new;
1910
1911 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00001912 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001913 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001914 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001915 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00001916 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001917 return new;
1918}
1919
1920
1921/* Initialize a new socket object. */
1922
1923/*ARGSUSED*/
1924static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00001925sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001926{
1927 PySocketSockObject *s = (PySocketSockObject *)self;
1928 SOCKET_T fd;
1929 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1930 static char *keywords[] = {"family", "type", "proto", 0};
1931
1932 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1933 "|iii:socket", keywords,
1934 &family, &type, &proto))
1935 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001936
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001937 Py_BEGIN_ALLOW_THREADS
1938 fd = socket(family, type, proto);
1939 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001940
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001941#ifdef MS_WINDOWS
1942 if (fd == INVALID_SOCKET)
1943#else
1944 if (fd < 0)
1945#endif
1946 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001947 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001948 return -1;
1949 }
1950 init_sockobject(s, fd, family, type, proto);
1951 /* From now on, ignore SIGPIPE and let the error checking
1952 do the work. */
1953#ifdef SIGPIPE
1954 (void) signal(SIGPIPE, SIG_IGN);
1955#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001956
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001957 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001958
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001959}
1960
1961
Guido van Rossumb6775db1994-08-01 11:34:53 +00001962/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001963
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001964static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001965 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001966 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001967 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001968 sizeof(PySocketSockObject), /* tp_basicsize */
1969 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001970 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001971 0, /* tp_print */
1972 0, /* tp_getattr */
1973 0, /* tp_setattr */
1974 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001975 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001976 0, /* tp_as_number */
1977 0, /* tp_as_sequence */
1978 0, /* tp_as_mapping */
1979 0, /* tp_hash */
1980 0, /* tp_call */
1981 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001982 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001983 0, /* tp_setattro */
1984 0, /* tp_as_buffer */
1985 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001986 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001987 0, /* tp_traverse */
1988 0, /* tp_clear */
1989 0, /* tp_richcompare */
1990 0, /* tp_weaklistoffset */
1991 0, /* tp_iter */
1992 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001993 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001994 0, /* tp_members */
1995 0, /* tp_getset */
1996 0, /* tp_base */
1997 0, /* tp_dict */
1998 0, /* tp_descr_get */
1999 0, /* tp_descr_set */
2000 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002001 sock_initobj, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002002 0, /* set below */ /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002003 sock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002004 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002005};
2006
Guido van Rossum30a685f1991-06-27 15:51:29 +00002007
Guido van Rossum81194471991-07-27 21:42:02 +00002008/* Python interface to gethostname(). */
2009
2010/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002011static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002012socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002013{
2014 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002015 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002016 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002017 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002018 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002019 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002020 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002021 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002022 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002023 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002024 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002025}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002026
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002027PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002028"gethostname() -> string\n\
2029\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002030Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002031
Guido van Rossumff4949e1992-08-05 19:58:53 +00002032
Guido van Rossum30a685f1991-06-27 15:51:29 +00002033/* Python interface to gethostbyname(name). */
2034
2035/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002036static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002037socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002038{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002039 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002040 struct sockaddr_storage addrbuf;
2041
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002042 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002043 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002044 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002045 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002046 return makeipaddr((struct sockaddr *)&addrbuf,
2047 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002048}
2049
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002050PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002051"gethostbyname(host) -> address\n\
2052\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002053Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002054
2055
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002056/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2057
2058static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002059gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002060{
2061 char **pch;
2062 PyObject *rtn_tuple = (PyObject *)NULL;
2063 PyObject *name_list = (PyObject *)NULL;
2064 PyObject *addr_list = (PyObject *)NULL;
2065 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002066
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002067 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002068 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002069#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002070 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002071#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002072 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002073#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002074 return NULL;
2075 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002076
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002077 if (h->h_addrtype != af) {
2078#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002079 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002080 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002081 (char *)strerror(EAFNOSUPPORT));
2082#else
2083 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002084 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002085 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002086#endif
2087 return NULL;
2088 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002089
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002090 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002091
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002092 case AF_INET:
2093 if (alen < sizeof(struct sockaddr_in))
2094 return NULL;
2095 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002096
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002097#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002098 case AF_INET6:
2099 if (alen < sizeof(struct sockaddr_in6))
2100 return NULL;
2101 break;
2102#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002103
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002104 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002105
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002106 if ((name_list = PyList_New(0)) == NULL)
2107 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002108
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002109 if ((addr_list = PyList_New(0)) == NULL)
2110 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002111
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002112 for (pch = h->h_aliases; *pch != NULL; pch++) {
2113 int status;
2114 tmp = PyString_FromString(*pch);
2115 if (tmp == NULL)
2116 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002117
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002118 status = PyList_Append(name_list, tmp);
2119 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002120
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002121 if (status)
2122 goto err;
2123 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002124
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002125 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2126 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002127
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002128 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002129
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002130 case AF_INET:
2131 {
2132 struct sockaddr_in sin;
2133 memset(&sin, 0, sizeof(sin));
2134 sin.sin_family = af;
2135#ifdef HAVE_SOCKADDR_SA_LEN
2136 sin.sin_len = sizeof(sin);
2137#endif
2138 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2139 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002140
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002141 if (pch == h->h_addr_list && alen >= sizeof(sin))
2142 memcpy((char *) addr, &sin, sizeof(sin));
2143 break;
2144 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002145
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002146#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002147 case AF_INET6:
2148 {
2149 struct sockaddr_in6 sin6;
2150 memset(&sin6, 0, sizeof(sin6));
2151 sin6.sin6_family = af;
2152#ifdef HAVE_SOCKADDR_SA_LEN
2153 sin6.sin6_len = sizeof(sin6);
2154#endif
2155 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2156 tmp = makeipaddr((struct sockaddr *)&sin6,
2157 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002158
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002159 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2160 memcpy((char *) addr, &sin6, sizeof(sin6));
2161 break;
2162 }
2163#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002164
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002165 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002166 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002167 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002168 return NULL;
2169 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002170
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002171 if (tmp == NULL)
2172 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002173
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002174 status = PyList_Append(addr_list, tmp);
2175 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002176
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002177 if (status)
2178 goto err;
2179 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002180
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002181 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002182
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002183 err:
2184 Py_XDECREF(name_list);
2185 Py_XDECREF(addr_list);
2186 return rtn_tuple;
2187}
2188
2189
2190/* Python interface to gethostbyname_ex(name). */
2191
2192/*ARGSUSED*/
2193static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002194socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002195{
2196 char *name;
2197 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002198 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002199 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002200 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002201#ifdef HAVE_GETHOSTBYNAME_R
2202 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002203#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2204 struct hostent_data data;
2205#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002206 char buf[16384];
2207 int buf_len = (sizeof buf) - 1;
2208 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002209#endif
2210#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002211 int result;
2212#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002213#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002214
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002215 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002216 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002217 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002218 return NULL;
2219 Py_BEGIN_ALLOW_THREADS
2220#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002221#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002222 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2223 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002224#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002225 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002226#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002227 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002228 result = gethostbyname_r(name, &hp_allocated, &data);
2229 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002230#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002231#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002232#ifdef USE_GETHOSTBYNAME_LOCK
2233 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002234#endif
2235 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002236#endif /* HAVE_GETHOSTBYNAME_R */
2237 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002238 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002239 addr.ss_family.
2240 Therefore, we cast the sockaddr_storage into sockaddr to
2241 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002242 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002243 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002244 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002245#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002246 PyThread_release_lock(gethostbyname_lock);
2247#endif
2248 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002249}
2250
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002251PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002252"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2253\n\
2254Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002255for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002256
2257
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002258/* Python interface to gethostbyaddr(IP). */
2259
2260/*ARGSUSED*/
2261static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002262socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002263{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002264#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002265 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002266#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002267 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002268#endif
2269 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002270 char *ip_num;
2271 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002272 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002273#ifdef HAVE_GETHOSTBYNAME_R
2274 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002275#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2276 struct hostent_data data;
2277#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002278 char buf[16384];
2279 int buf_len = (sizeof buf) - 1;
2280 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002281#endif
2282#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002283 int result;
2284#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002285#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002286 char *ap;
2287 int al;
2288 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002289
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002290 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002291 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002292 af = PF_UNSPEC;
2293 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002294 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002295 af = sa->sa_family;
2296 ap = NULL;
2297 al = 0;
2298 switch (af) {
2299 case AF_INET:
2300 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2301 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2302 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002303#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002304 case AF_INET6:
2305 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2306 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2307 break;
2308#endif
2309 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002310 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002311 return NULL;
2312 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002313 Py_BEGIN_ALLOW_THREADS
2314#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002315#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002316 result = gethostbyaddr_r(ap, al, af,
2317 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002318 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002319#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002320 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002321 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002322#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002323 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002324 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002325 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002326#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002327#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002328#ifdef USE_GETHOSTBYNAME_LOCK
2329 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002330#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002331 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002332#endif /* HAVE_GETHOSTBYNAME_R */
2333 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002334 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002335#ifdef USE_GETHOSTBYNAME_LOCK
2336 PyThread_release_lock(gethostbyname_lock);
2337#endif
2338 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002339}
2340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002341PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002342"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2343\n\
2344Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002345for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002346
Guido van Rossum30a685f1991-06-27 15:51:29 +00002347
2348/* Python interface to getservbyname(name).
2349 This only returns the port number, since the other info is already
2350 known or not useful (like the list of aliases). */
2351
2352/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002353static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002354socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002355{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002356 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002357 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002358 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002359 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002360 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002361 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002362 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002363 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002364 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002365 return NULL;
2366 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002367 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002368}
2369
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002370PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002371"getservbyname(servicename, protocolname) -> integer\n\
2372\n\
2373Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002374The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002375
Guido van Rossum30a685f1991-06-27 15:51:29 +00002376
Guido van Rossum3901d851996-12-19 16:35:04 +00002377/* Python interface to getprotobyname(name).
2378 This only returns the protocol number, since the other info is
2379 already known or not useful (like the list of aliases). */
2380
2381/*ARGSUSED*/
2382static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002383socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002384{
2385 char *name;
2386 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002387#ifdef __BEOS__
2388/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002389 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002390 return NULL;
2391#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002392 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002393 return NULL;
2394 Py_BEGIN_ALLOW_THREADS
2395 sp = getprotobyname(name);
2396 Py_END_ALLOW_THREADS
2397 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002398 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002399 return NULL;
2400 }
2401 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002402#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002403}
2404
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002405PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002406"getprotobyname(name) -> integer\n\
2407\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002408Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002409
Guido van Rossum3901d851996-12-19 16:35:04 +00002410
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002411#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002412/* Create a socket object from a numeric file description.
2413 Useful e.g. if stdin is a socket.
2414 Additional arguments as for socket(). */
2415
2416/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002417static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002418socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002419{
Guido van Rossum73624e91994-10-10 17:59:00 +00002420 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002421 SOCKET_T fd;
2422 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002423 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2424 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002425 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002426 /* Dup the fd so it and the socket can be closed independently */
2427 fd = dup(fd);
2428 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002429 return set_error();
2430 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002431 /* From now on, ignore SIGPIPE and let the error checking
2432 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002433#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002434 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002435#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002436 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002437}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002438
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002439PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002440"fromfd(fd, family, type[, proto]) -> socket object\n\
2441\n\
2442Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002443The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002444
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002445#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002446
Guido van Rossum82a5c661998-07-07 20:45:43 +00002447
Guido van Rossum006bf911996-06-12 04:04:55 +00002448static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002449socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002450{
2451 int x1, x2;
2452
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002453 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002454 return NULL;
2455 }
2456 x2 = (int)ntohs((short)x1);
2457 return PyInt_FromLong(x2);
2458}
2459
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002460PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002461"ntohs(integer) -> integer\n\
2462\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002463Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002464
2465
Guido van Rossum006bf911996-06-12 04:04:55 +00002466static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002467socket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002468{
2469 int x1, x2;
2470
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002471 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002472 return NULL;
2473 }
2474 x2 = ntohl(x1);
2475 return PyInt_FromLong(x2);
2476}
2477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002478PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002479"ntohl(integer) -> integer\n\
2480\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002481Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002482
2483
Guido van Rossum006bf911996-06-12 04:04:55 +00002484static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002485socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002486{
2487 int x1, x2;
2488
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002489 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002490 return NULL;
2491 }
2492 x2 = (int)htons((short)x1);
2493 return PyInt_FromLong(x2);
2494}
2495
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002496PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002497"htons(integer) -> integer\n\
2498\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002499Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002500
2501
Guido van Rossum006bf911996-06-12 04:04:55 +00002502static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002503socket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002504{
2505 int x1, x2;
2506
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002507 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002508 return NULL;
2509 }
2510 x2 = htonl(x1);
2511 return PyInt_FromLong(x2);
2512}
2513
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002514PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002515"htonl(integer) -> integer\n\
2516\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002517Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002518
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002519/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002520
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002521PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002522"inet_aton(string) -> packed 32-bit IP representation\n\
2523\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002524Convert 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 +00002525binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002526
2527static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002528socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002529{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002530#ifndef INADDR_NONE
2531#define INADDR_NONE (-1)
2532#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002533
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002534 /* Have to use inet_addr() instead */
2535 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002536 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002537
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002538 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002539 return NULL;
2540 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002541 packed_addr = inet_addr(ip_addr);
2542
2543 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002544 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002545 "illegal IP address string passed to inet_aton");
2546 return NULL;
2547 }
2548
2549 return PyString_FromStringAndSize((char *) &packed_addr,
2550 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002551}
2552
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002553PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002554"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002555\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002556Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002557
2558static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002559socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002560{
2561 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002562 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002563 struct in_addr packed_addr;
2564
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002565 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002566 return NULL;
2567 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002568
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002569 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002570 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002571 "packed IP wrong length for inet_ntoa");
2572 return NULL;
2573 }
2574
2575 memcpy(&packed_addr, packed_str, addr_len);
2576
2577 return PyString_FromString(inet_ntoa(packed_addr));
2578}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002579
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002580/* Python interface to getaddrinfo(host, port). */
2581
2582/*ARGSUSED*/
2583static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002584socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002585{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002586 struct addrinfo hints, *res;
2587 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002588 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002589 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002590 char *hptr, *pptr;
2591 int family, socktype, protocol, flags;
2592 int error;
2593 PyObject *all = (PyObject *)NULL;
2594 PyObject *single = (PyObject *)NULL;
2595
2596 family = socktype = protocol = flags = 0;
2597 family = PF_UNSPEC;
2598 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2599 &hptr, &pobj, &family, &socktype,
2600 &protocol, &flags)) {
2601 return NULL;
2602 }
2603 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002604 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002605 pptr = pbuf;
2606 } else if (PyString_Check(pobj)) {
2607 pptr = PyString_AsString(pobj);
2608 } else if (pobj == Py_None) {
2609 pptr = (char *)NULL;
2610 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002611 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002612 return NULL;
2613 }
2614 memset(&hints, 0, sizeof(hints));
2615 hints.ai_family = family;
2616 hints.ai_socktype = socktype;
2617 hints.ai_protocol = protocol;
2618 hints.ai_flags = flags;
2619 error = getaddrinfo(hptr, pptr, &hints, &res0);
2620 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002621 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002622 return NULL;
2623 }
2624
2625 if ((all = PyList_New(0)) == NULL)
2626 goto err;
2627 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002628 PyObject *addr =
2629 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2630 if (addr == NULL)
2631 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002632 single = Py_BuildValue("iiisO", res->ai_family,
2633 res->ai_socktype, res->ai_protocol,
2634 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002635 addr);
2636 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002637 if (single == NULL)
2638 goto err;
2639
2640 if (PyList_Append(all, single))
2641 goto err;
2642 Py_XDECREF(single);
2643 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002644 return all;
2645 err:
2646 Py_XDECREF(single);
2647 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002648 if (res0)
2649 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002650 return (PyObject *)NULL;
2651}
2652
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002653PyDoc_STRVAR(getaddrinfo_doc,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002654"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2655 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2656\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002657Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002658
2659/* Python interface to getnameinfo(sa, flags). */
2660
2661/*ARGSUSED*/
2662static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002663socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002664{
2665 PyObject *sa = (PyObject *)NULL;
2666 int flags;
2667 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002668 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002669 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2670 struct addrinfo hints, *res = NULL;
2671 int error;
2672 PyObject *ret = (PyObject *)NULL;
2673
2674 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002675 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002676 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002677 if (!PyArg_ParseTuple(sa, "si|ii",
2678 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002679 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002680 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002681 memset(&hints, 0, sizeof(hints));
2682 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002683 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002684 error = getaddrinfo(hostp, pbuf, &hints, &res);
2685 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002686 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002687 goto fail;
2688 }
2689 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002690 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002691 "sockaddr resolved to multiple addresses");
2692 goto fail;
2693 }
2694 switch (res->ai_family) {
2695 case AF_INET:
2696 {
2697 char *t1;
2698 int t2;
2699 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002700 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002701 "IPv4 sockaddr must be 2 tuple");
2702 goto fail;
2703 }
2704 break;
2705 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002706#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002707 case AF_INET6:
2708 {
2709 struct sockaddr_in6 *sin6;
2710 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2711 sin6->sin6_flowinfo = flowinfo;
2712 sin6->sin6_scope_id = scope_id;
2713 break;
2714 }
2715#endif
2716 }
2717 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2718 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2719 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002720 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002721 goto fail;
2722 }
2723 ret = Py_BuildValue("ss", hbuf, pbuf);
2724
2725fail:
2726 if (res)
2727 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002728 return ret;
2729}
2730
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002731PyDoc_STRVAR(getnameinfo_doc,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002732"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2733\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002734Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002735
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002736
2737/* Python API to getting and setting the default timeout value. */
2738
2739static PyObject *
2740socket_getdefaulttimeout(PyObject *self)
2741{
2742 if (defaulttimeout < 0.0) {
2743 Py_INCREF(Py_None);
2744 return Py_None;
2745 }
2746 else
2747 return PyFloat_FromDouble(defaulttimeout);
2748}
2749
2750PyDoc_STRVAR(getdefaulttimeout_doc,
2751"socket.getdefaulttimeout() -> None | float\n\
2752\n\
2753Returns the default timeout in floating seconds for new socket objects.\n\
2754A value of None indicates that new socket objects have no timeout.\n\
2755When the socket module is first imported, the default is None.");
2756
2757static PyObject *
2758socket_setdefaulttimeout(PyObject *self, PyObject *arg)
2759{
2760 double timeout;
2761
2762 if (arg == Py_None)
2763 timeout = -1.0;
2764 else {
2765 timeout = PyFloat_AsDouble(arg);
2766 if (timeout < 0.0) {
2767 if (!PyErr_Occurred())
2768 PyErr_SetString(PyExc_ValueError,
2769 "Timeout value out of range");
2770 return NULL;
2771 }
2772 }
2773
2774 defaulttimeout = timeout;
2775
2776 Py_INCREF(Py_None);
2777 return Py_None;
2778}
2779
2780PyDoc_STRVAR(setdefaulttimeout_doc,
2781"socket.setdefaulttimeout(None | float)\n\
2782\n\
2783Set the default timeout in floating seconds for new socket objects.\n\
2784A value of None indicates that new socket objects have no timeout.\n\
2785When the socket module is first imported, the default is None.");
2786
2787
Guido van Rossum30a685f1991-06-27 15:51:29 +00002788/* List of functions exported by this module. */
2789
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002790static PyMethodDef socket_methods[] = {
2791 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002792 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002793 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002794 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002795 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002796 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002797 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002798 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002799 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002800 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002801 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002802 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002803#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002804 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002805 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002806#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002807 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002808 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002809 {"ntohl", socket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002810 METH_VARARGS, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002811 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002812 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002813 {"htonl", socket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002814 METH_VARARGS, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002815 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002816 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002817 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002818 METH_VARARGS, inet_ntoa_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002819 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002820 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002821 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002822 METH_VARARGS, getnameinfo_doc},
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002823 {"getdefaulttimeout", socket_getdefaulttimeout,
2824 METH_NOARGS, getdefaulttimeout_doc},
2825 {"setdefaulttimeout", socket_setdefaulttimeout,
2826 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002827 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002828};
2829
Guido van Rossum30a685f1991-06-27 15:51:29 +00002830
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002831#ifdef RISCOS
2832#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00002833
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002834static int
2835os_init(void)
2836{
2837 _kernel_swi_regs r;
2838
2839 r.r[0] = 0;
2840 _kernel_swi(0x43380, &r, &r);
2841 taskwindow = r.r[0];
2842
2843 return 0;
2844}
2845
2846#endif /* RISCOS */
2847
2848
2849#ifdef MS_WINDOWS
2850#define OS_INIT_DEFINED
2851
2852/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002853
2854static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002855os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002856{
2857 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002858}
2859
2860static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002861os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002862{
2863 WSADATA WSAData;
2864 int ret;
2865 char buf[100];
2866 ret = WSAStartup(0x0101, &WSAData);
2867 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002868 case 0: /* No error */
2869 atexit(os_cleanup);
2870 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002871 case WSASYSNOTREADY:
2872 PyErr_SetString(PyExc_ImportError,
2873 "WSAStartup failed: network not ready");
2874 break;
2875 case WSAVERNOTSUPPORTED:
2876 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002877 PyErr_SetString(
2878 PyExc_ImportError,
2879 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00002880 break;
2881 default:
Tim Peters885d4572001-11-28 20:27:42 +00002882 PyOS_snprintf(buf, sizeof(buf),
2883 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002884 PyErr_SetString(PyExc_ImportError, buf);
2885 break;
2886 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002887 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002888}
2889
Guido van Rossum8d665e61996-06-26 18:22:49 +00002890#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002891
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002892
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002893#ifdef PYOS_OS2
2894#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002895
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002896/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002897
2898static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002899os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002900{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002901#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002902 char reason[64];
2903 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002904
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002905 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002906 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002907 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002908
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002909 PyOS_snprintf(reason, sizeof(reason),
2910 "OS/2 TCP/IP Error# %d", sock_errno());
2911 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002912
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002913 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002914#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002915 /* No need to initialise sockets with GCC/EMX */
2916 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002917#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002918}
2919
2920#endif /* PYOS_OS2 */
2921
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002922
2923#ifndef OS_INIT_DEFINED
2924static int
2925os_init(void)
2926{
2927 return 1; /* Success */
2928}
2929#endif
2930
2931
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002932/* C API table - always add new things to the end for binary
2933 compatibility. */
2934static
2935PySocketModule_APIObject PySocketModuleAPI =
2936{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002937 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002938};
2939
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002940
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002941/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002942
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002943 This module is actually called "_socket", and there's a wrapper
2944 "socket.py" which implements some additional functionality. On some
2945 platforms (e.g. Windows and OS/2), socket.py also implements a
2946 wrapper for the socket type that provides missing functionality such
2947 as makefile(), dup() and fromfd(). The import of "_socket" may fail
2948 with an ImportError exception if os-specific initialization fails.
2949 On Windows, this does WINSOCK initialization. When WINSOCK is
2950 initialized succesfully, a call to WSACleanup() is scheduled to be
2951 made at exit time.
2952*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002954PyDoc_STRVAR(socket_doc,
Fred Drakea136d492000-08-16 14:18:30 +00002955"Implementation module for socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002956for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002957
Guido van Rossum3886bb61998-12-04 18:50:17 +00002958DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002959init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002960{
Fred Drake4baedc12002-04-01 14:53:37 +00002961 PyObject *m;
Fred Drake4baedc12002-04-01 14:53:37 +00002962
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002963 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002964 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002965
2966 sock_type.ob_type = &PyType_Type;
2967 sock_type.tp_getattro = PyObject_GenericGetAttr;
2968 sock_type.tp_alloc = PyType_GenericAlloc;
2969 sock_type.tp_free = PyObject_Del;
2970 m = Py_InitModule3(PySocket_MODULE_NAME,
2971 socket_methods,
2972 socket_doc);
2973
2974 socket_error = PyErr_NewException("socket.error", NULL, NULL);
2975 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002976 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002977 Py_INCREF(socket_error);
2978 PyModule_AddObject(m, "error", socket_error);
2979 socket_herror = PyErr_NewException("socket.herror",
2980 socket_error, NULL);
2981 if (socket_herror == NULL)
2982 return;
2983 Py_INCREF(socket_herror);
2984 PyModule_AddObject(m, "herror", socket_herror);
2985 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002986 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002987 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002988 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002989 Py_INCREF(socket_gaierror);
2990 PyModule_AddObject(m, "gaierror", socket_gaierror);
2991 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00002992 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002993 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002994 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002995 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00002996 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002997 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002998 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002999
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003000 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003001 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003002 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3003 ) != 0)
3004 return;
3005
Guido van Rossum09be4091999-08-09 14:40:40 +00003006 /* Address families (we only support AF_INET and AF_UNIX) */
3007#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003008 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003009#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003010 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003011#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003012 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003013#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003014#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00003015 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003016#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003017#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003018 /* Amateur Radio AX.25 */
3019 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003020#endif
3021#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003022 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003023#endif
3024#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003025 /* Appletalk DDP */
3026 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003027#endif
3028#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003029 /* Amateur radio NetROM */
3030 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003031#endif
3032#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003033 /* Multiprotocol bridge */
3034 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003035#endif
3036#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003037 /* Reserved for Werner's ATM */
3038 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003039#endif
3040#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003041 /* Reserved for X.25 project */
3042 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003043#endif
3044#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003045 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003046#endif
3047#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003048 /* Amateur Radio X.25 PLP */
3049 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003050#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003051#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003052 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3053 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3054 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3055 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3056 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3057 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3058 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3059 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3060 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003061#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003062
3063 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003064 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3065 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003066#ifndef __BEOS__
3067/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003068 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3069 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3070 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003071#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003072
3073#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003074 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003075#endif
3076#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003077 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003078#endif
3079#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003080 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003081#endif
3082#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003083 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003084#endif
3085#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003086 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003087#endif
3088#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003089 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003090#endif
3091#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003092 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003093#endif
3094#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003095 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003096#endif
3097#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003098 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003099#endif
3100#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003101 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003102#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003103#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003104 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003105#endif
3106#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003107 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003108#endif
3109#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003110 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003111#endif
3112#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003113 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003114#endif
3115#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003116 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003117#endif
3118#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003119 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003120#endif
3121#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003122 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003123#endif
3124#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003125 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003126#endif
3127
3128 /* Maximum number of connections for "listen" */
3129#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003130 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003131#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003132 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003133#endif
3134
3135 /* Flags for send, recv */
3136#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003137 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003138#endif
3139#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003140 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003141#endif
3142#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003143 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003144#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003145#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003146 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003147#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003148#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003149 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003150#endif
3151#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003152 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003153#endif
3154#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003155 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003156#endif
3157#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003158 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003159#endif
3160#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003161 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003162#endif
3163#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003164 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003165#endif
3166
3167 /* Protocol level and numbers, usable for [gs]etsockopt */
3168#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003169 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003170#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003171#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003172 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003173#else
Fred Drake4baedc12002-04-01 14:53:37 +00003174 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003175#endif
3176#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003177 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003178#endif
3179#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003180 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003181#endif
3182#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003183 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003184#endif
3185#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003186 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003187#endif
3188#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003189 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003190#endif
3191#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003192 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003193#else
Fred Drake4baedc12002-04-01 14:53:37 +00003194 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003195#endif
3196#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003197 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003198#else
Fred Drake4baedc12002-04-01 14:53:37 +00003199 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003200#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003201#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003202 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003203#else
Fred Drake4baedc12002-04-01 14:53:37 +00003204 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003205#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003206#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003207 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003208#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003209#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003210 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003211#else
Fred Drake4baedc12002-04-01 14:53:37 +00003212 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003213#endif
3214#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003215 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003216#endif
3217#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003218 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003219#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003220#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003221 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003222#endif
3223#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003224 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003225#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003226#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003227 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003228#else
Fred Drake4baedc12002-04-01 14:53:37 +00003229 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003230#endif
3231#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003232 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003233#endif
3234#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003235 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003236#endif
3237#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003238 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003239#else
Fred Drake4baedc12002-04-01 14:53:37 +00003240 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003241#endif
3242#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003243 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003244#endif
3245#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003246 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003247#endif
3248#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003249 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003250#endif
3251#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003252 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003253#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003254#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003255 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003256#endif
3257#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003258 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003259#endif
3260#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003261 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003262#endif
3263#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003264 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003265#endif
3266#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003267 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003268#endif
3269#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003270 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003271#endif
3272#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003273 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003274#endif
3275#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003276 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003277#endif
3278#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003279 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003280#endif
3281#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003282 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003283#endif
3284#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003285 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003286#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003287#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003288 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003289#endif
3290#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003291 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003292#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003293#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003294 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003295#endif
3296#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003297 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003298#endif
3299#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003300 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003301#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003302#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003303 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003304#endif
3305/**/
3306#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003307 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003308#else
Fred Drake4baedc12002-04-01 14:53:37 +00003309 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003310#endif
3311#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003312 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003313#endif
3314
3315 /* Some port configuration */
3316#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003317 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003318#else
Fred Drake4baedc12002-04-01 14:53:37 +00003319 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003320#endif
3321#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003322 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003323#else
Fred Drake4baedc12002-04-01 14:53:37 +00003324 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003325#endif
3326
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003327 /* Some reserved IP v.4 addresses */
3328#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003329 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003330#else
Fred Drake4baedc12002-04-01 14:53:37 +00003331 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003332#endif
3333#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003334 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003335#else
Fred Drake4baedc12002-04-01 14:53:37 +00003336 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003337#endif
3338#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003339 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003340#else
Fred Drake4baedc12002-04-01 14:53:37 +00003341 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003342#endif
3343#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003344 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003345#else
Fred Drake4baedc12002-04-01 14:53:37 +00003346 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003347#endif
3348#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003349 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3350 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003351#else
Fred Drake4baedc12002-04-01 14:53:37 +00003352 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003353#endif
3354#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003355 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3356 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003357#else
Fred Drake4baedc12002-04-01 14:53:37 +00003358 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003359#endif
3360#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003361 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003362#else
Fred Drake4baedc12002-04-01 14:53:37 +00003363 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003364#endif
3365
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003366 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003367#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003368 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003369#endif
3370#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003371 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003372#endif
3373#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003374 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003375#endif
3376#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003377 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003378#endif
3379#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003380 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003381#endif
3382#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003383 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003384#endif
3385#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003386 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003387#endif
3388#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003389 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003390#endif
3391#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003392 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003393#endif
3394#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003395 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003396#endif
3397#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003398 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003399#endif
3400#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003401 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003402#endif
3403#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003404 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003405#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003406#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003407 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3408 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003409#endif
3410#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003411 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3412 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003413#endif
3414#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003415 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003416#endif
3417
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003418 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3419#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003420 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003421#endif
3422#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003424#endif
3425#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003426 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003427#endif
3428#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003429 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003430#endif
3431#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003432 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003433#endif
3434#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003435 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003436#endif
3437
Guido van Rossum09be4091999-08-09 14:40:40 +00003438 /* TCP options */
3439#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003440 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003441#endif
3442#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003443 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003444#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003445#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003446 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003447#endif
3448#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003449 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003450#endif
3451#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003452 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003453#endif
3454#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003455 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003456#endif
3457#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003458 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003459#endif
3460#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003461 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003462#endif
3463#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003464 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003465#endif
3466#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003467 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003468#endif
3469#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003470 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003471#endif
3472#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003473 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003474#endif
3475
Guido van Rossum09be4091999-08-09 14:40:40 +00003476
3477 /* IPX options */
3478#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003479 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003480#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003481
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003482 /* get{addr,name}info parameters */
3483#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003484 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003485#endif
3486#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003487 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003488#endif
3489#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003490 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003491#endif
3492#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003493 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003494#endif
3495#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003496 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003497#endif
3498#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003499 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003500#endif
3501#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003502 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003503#endif
3504#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003505 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003506#endif
3507#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003508 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003509#endif
3510#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003511 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003512#endif
3513#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003514 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003515#endif
3516#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003517 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003518#endif
3519#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003520 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003521#endif
3522#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003523 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003524#endif
3525#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003526 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003527#endif
3528#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003529 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003530#endif
3531#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003532 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003533#endif
3534#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003535 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003536#endif
3537#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003538 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003539#endif
3540#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003541 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003542#endif
3543#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003544 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003545#endif
3546#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003547 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003548#endif
3549#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003550 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003551#endif
3552#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003553 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003554#endif
3555#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003556 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003557#endif
3558#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003559 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003560#endif
3561#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003562 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003563#endif
3564#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003565 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003566#endif
3567#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003568 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003569#endif
3570#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003571 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003572#endif
3573
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003574 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003575#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003576 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003577#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003578}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003579
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003580
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003581#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003582
3583/* Simplistic emulation code for inet_pton that only works for IPv4 */
3584
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003585int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003586inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003587{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003588 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003589 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003590 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003591 if (packed_addr == INADDR_NONE)
3592 return 0;
3593 memcpy(dst, &packed_addr, 4);
3594 return 1;
3595 }
3596 /* Should set errno to EAFNOSUPPORT */
3597 return -1;
3598}
3599
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003600const char *
3601inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003602{
3603 if (af == AF_INET) {
3604 struct in_addr packed_addr;
3605 if (size < 16)
3606 /* Should set errno to ENOSPC. */
3607 return NULL;
3608 memcpy(&packed_addr, src, sizeof(packed_addr));
3609 return strncpy(dst, inet_ntoa(packed_addr), size);
3610 }
3611 /* Should set errno to EAFNOSUPPORT */
3612 return NULL;
3613}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003614
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003615#endif