blob: 7461f60fa32704ba69d5bccf1d67c26cff30b0aa [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
Guido van Rossumad654902002-07-19 12:44:59 +0000508 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000509 if (s->sock_timeout <= 0.0)
510 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000511
Guido van Rossumad654902002-07-19 12:44:59 +0000512 /* Guard against closed socket */
513 if (s->sock_fd < 0)
514 return;
515
Guido van Rossum67f7a382002-06-06 21:08:16 +0000516 /* Construct the arguments to select */
517 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000518 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000519 FD_ZERO(&fds);
520 FD_SET(s->sock_fd, &fds);
521
522 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000523 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000524 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000525 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000526 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000527}
528
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000529/* Initialize a new socket object. */
530
Tim Petersa12b4cf2002-07-18 22:38:44 +0000531static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000532
Mark Hammond62b1ab12002-07-23 06:31:15 +0000533PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000534init_sockobject(PySocketSockObject *s,
535 SOCKET_T fd, int family, int type, int proto)
536{
537#ifdef RISCOS
538 int block = 1;
539#endif
540 s->sock_fd = fd;
541 s->sock_family = family;
542 s->sock_type = type;
543 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000544 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000545
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000546 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000547
548 if (defaulttimeout >= 0.0)
549 internal_setblocking(s, 0);
550
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000551#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000552 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000553 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000554#endif
555}
556
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558/* Create a new socket object.
559 This just creates the object and initializes it.
560 If the creation fails, return NULL and set an exception (implicit
561 in NEWOBJ()). */
562
Guido van Rossum73624e91994-10-10 17:59:00 +0000563static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000564new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565{
Guido van Rossum73624e91994-10-10 17:59:00 +0000566 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000567 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000568 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000569 if (s != NULL)
570 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000571 return s;
572}
573
Guido van Rossum30a685f1991-06-27 15:51:29 +0000574
Guido van Rossum48a680c2001-03-02 06:34:14 +0000575/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000576 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000577#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000578PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000579#endif
580
581
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582/* Convert a string specifying a host name or one of a few symbolic
583 names to a numeric IP address. This usually calls gethostbyname()
584 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000586 an error occurred; then an exception is raised. */
587
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000588static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000589setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000590{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591 struct addrinfo hints, *res;
592 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593
Guido van Rossuma376cc51996-12-05 23:43:35 +0000594 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000595 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000596 int siz;
597 memset(&hints, 0, sizeof(hints));
598 hints.ai_family = af;
599 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
600 hints.ai_flags = AI_PASSIVE;
601 error = getaddrinfo(NULL, "0", &hints, &res);
602 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000603 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000604 return -1;
605 }
606 switch (res->ai_family) {
607 case AF_INET:
608 siz = 4;
609 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000610#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611 case AF_INET6:
612 siz = 16;
613 break;
614#endif
615 default:
616 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000617 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618 "unsupported address family");
619 return -1;
620 }
621 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000622 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000623 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000624 "wildcard resolved to multiple address");
625 return -1;
626 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000627 if (res->ai_addrlen < addr_ret_size)
628 addr_ret_size = res->ai_addrlen;
629 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000630 freeaddrinfo(res);
631 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000632 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000633 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000634 struct sockaddr_in *sin;
635 if (af != PF_INET && af != PF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000636 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000637 "address family mismatched");
638 return -1;
639 }
640 sin = (struct sockaddr_in *)addr_ret;
641 memset((void *) sin, '\0', sizeof(*sin));
642 sin->sin_family = AF_INET;
643#ifdef HAVE_SOCKADDR_SA_LEN
644 sin->sin_len = sizeof(*sin);
645#endif
646 sin->sin_addr.s_addr = INADDR_BROADCAST;
647 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000648 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649 memset(&hints, 0, sizeof(hints));
650 hints.ai_family = af;
651 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000652#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000653 if (error == EAI_NONAME && af == AF_UNSPEC) {
654 /* On Tru64 V5.1, numeric-to-addr conversion fails
655 if no address family is given. Assume IPv4 for now.*/
656 hints.ai_family = AF_INET;
657 error = getaddrinfo(name, NULL, &hints, &res);
658 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000659#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000660 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000661 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000662 return -1;
663 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000664 if (res->ai_addrlen < addr_ret_size)
665 addr_ret_size = res->ai_addrlen;
666 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000667 freeaddrinfo(res);
668 switch (addr_ret->sa_family) {
669 case AF_INET:
670 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000671#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000672 case AF_INET6:
673 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000674#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000675 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000676 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000677 return -1;
678 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000679}
680
Guido van Rossum30a685f1991-06-27 15:51:29 +0000681
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682/* Create a string object representing an IP address.
683 This is always a string of the form 'dd.dd.dd.dd' (with variable
684 size numbers). */
685
Guido van Rossum73624e91994-10-10 17:59:00 +0000686static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000687makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000688{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000689 char buf[NI_MAXHOST];
690 int error;
691
692 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
693 NI_NUMERICHOST);
694 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000695 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000696 return NULL;
697 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000698 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000699}
700
701
702/* Create an object representing the given socket address,
703 suitable for passing it back to bind(), connect() etc.
704 The family field of the sockaddr structure is inspected
705 to determine what kind of address it really is. */
706
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000707/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000708static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000709makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000710{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000711 if (addrlen == 0) {
712 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000713 Py_INCREF(Py_None);
714 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000715 }
716
Guido van Rossumbcc20741998-08-04 22:53:56 +0000717#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000718 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000719 addr->sa_family = AF_INET;
720#endif
721
Guido van Rossum30a685f1991-06-27 15:51:29 +0000722 switch (addr->sa_family) {
723
724 case AF_INET:
725 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000726 struct sockaddr_in *a;
727 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000728 PyObject *ret = NULL;
729 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000730 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000731 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
732 Py_DECREF(addrobj);
733 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000734 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000735 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000736
Guido van Rossumb6775db1994-08-01 11:34:53 +0000737#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000738 case AF_UNIX:
739 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000740 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000741 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000742 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000743#endif /* AF_UNIX */
744
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000745#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000746 case AF_INET6:
747 {
748 struct sockaddr_in6 *a;
749 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
750 PyObject *ret = NULL;
751 if (addrobj) {
752 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000753 ret = Py_BuildValue("Oiii",
754 addrobj,
755 ntohs(a->sin6_port),
756 a->sin6_flowinfo,
757 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000758 Py_DECREF(addrobj);
759 }
760 return ret;
761 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000762#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000763
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000764#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000765 case AF_PACKET:
766 {
767 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
768 char *ifname = "";
769 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000770 /* need to look up interface name give index */
771 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000772 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000773 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000774 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000775 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000776 return Py_BuildValue("shbhs#",
777 ifname,
778 ntohs(a->sll_protocol),
779 a->sll_pkttype,
780 a->sll_hatype,
781 a->sll_addr,
782 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000783 }
784#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000785
Guido van Rossum30a685f1991-06-27 15:51:29 +0000786 /* More cases here... */
787
788 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000789 /* If we don't know the address family, don't raise an
790 exception -- return it as a tuple. */
791 return Py_BuildValue("is#",
792 addr->sa_family,
793 addr->sa_data,
794 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000795
Guido van Rossum30a685f1991-06-27 15:51:29 +0000796 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000797}
798
Guido van Rossum30a685f1991-06-27 15:51:29 +0000799
800/* Parse a socket address argument according to the socket object's
801 address family. Return 1 if the address was in the proper format,
802 0 of not. The address is returned through addr_ret, its length
803 through len_ret. */
804
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000805static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000806getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000807 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000808{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000809 switch (s->sock_family) {
810
Guido van Rossumb6775db1994-08-01 11:34:53 +0000811#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000812 case AF_UNIX:
813 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000814 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000815 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000816 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000817 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000818 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000820 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000821 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000822 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823 return 0;
824 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000825 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000826 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000827 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000828 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000829 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830 return 1;
831 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000832#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000833
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834 case AF_INET:
835 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000836 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000837 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000838 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000839 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000840 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000841 PyErr_Format(
842 PyExc_TypeError,
843 "getsockaddrarg: "
844 "AF_INET address must be tuple, not %.500s",
845 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000846 return 0;
847 }
848 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000850 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000851 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000852 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000853 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000854 *addr_ret = (struct sockaddr *) addr;
855 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000856 return 1;
857 }
858
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000859#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000860 case AF_INET6:
861 {
862 struct sockaddr_in6* addr;
863 char *host;
864 int port, flowinfo, scope_id;
865 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
866 flowinfo = scope_id = 0;
867 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000868 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000869 return 0;
870 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000871 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000872 return 0;
873 addr->sin6_family = s->sock_family;
874 addr->sin6_port = htons((short)port);
875 addr->sin6_flowinfo = flowinfo;
876 addr->sin6_scope_id = scope_id;
877 *addr_ret = (struct sockaddr *) addr;
878 *len_ret = sizeof *addr;
879 return 1;
880 }
881#endif
882
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000883#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000884 case AF_PACKET:
885 {
886 struct sockaddr_ll* addr;
887 struct ifreq ifr;
888 char *interfaceName;
889 int protoNumber;
890 int hatype = 0;
891 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000892 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000893
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000894 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
895 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000896 return 0;
897 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
898 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000899 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000900 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000901 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000902 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000903 addr = &(s->sock_addr.ll);
904 addr->sll_family = AF_PACKET;
905 addr->sll_protocol = htons((short)protoNumber);
906 addr->sll_ifindex = ifr.ifr_ifindex;
907 addr->sll_pkttype = pkttype;
908 addr->sll_hatype = hatype;
909 *addr_ret = (struct sockaddr *) addr;
910 *len_ret = sizeof *addr;
911 return 1;
912 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000913#endif
914
Guido van Rossum30a685f1991-06-27 15:51:29 +0000915 /* More cases here... */
916
917 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000918 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000919 return 0;
920
921 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000922}
923
Guido van Rossum30a685f1991-06-27 15:51:29 +0000924
Guido van Rossum48a680c2001-03-02 06:34:14 +0000925/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000926 Return 1 if the family is known, 0 otherwise. The length is returned
927 through len_ret. */
928
929static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000930getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000931{
932 switch (s->sock_family) {
933
Guido van Rossumb6775db1994-08-01 11:34:53 +0000934#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000935 case AF_UNIX:
936 {
937 *len_ret = sizeof (struct sockaddr_un);
938 return 1;
939 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000940#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000941
942 case AF_INET:
943 {
944 *len_ret = sizeof (struct sockaddr_in);
945 return 1;
946 }
947
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000948#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000949 case AF_INET6:
950 {
951 *len_ret = sizeof (struct sockaddr_in6);
952 return 1;
953 }
954#endif
955
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000956#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000957 case AF_PACKET:
958 {
959 *len_ret = sizeof (struct sockaddr_ll);
960 return 1;
961 }
962#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000963
Guido van Rossum710e1df1992-06-12 10:39:36 +0000964 /* More cases here... */
965
966 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000967 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000968 return 0;
969
970 }
971}
972
973
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974/* s.accept() method */
975
Guido van Rossum73624e91994-10-10 17:59:00 +0000976static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000977sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000978{
979 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000980 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000981 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000982 PyObject *sock = NULL;
983 PyObject *addr = NULL;
984 PyObject *res = NULL;
985
Guido van Rossum710e1df1992-06-12 10:39:36 +0000986 if (!getsockaddrlen(s, &addrlen))
987 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000988 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000989
Guido van Rossum73624e91994-10-10 17:59:00 +0000990 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +0000991 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000992 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000993 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000994
Fred Drakea04eaad2000-06-30 02:46:07 +0000995#ifdef MS_WINDOWS
996 if (newfd == INVALID_SOCKET)
997#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000998 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000999#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001000 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001001
Guido van Rossum30a685f1991-06-27 15:51:29 +00001002 /* Create the new object with unspecified family,
1003 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001004 sock = (PyObject *) new_sockobject(newfd,
1005 s->sock_family,
1006 s->sock_type,
1007 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001008
Barry Warsaw752300b1997-01-03 17:18:10 +00001009 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001010 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001011 goto finally;
1012 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001013 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001014 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001015 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001016 goto finally;
1017
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001018 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001019
Guido van Rossum67f7a382002-06-06 21:08:16 +00001020finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001021 Py_XDECREF(sock);
1022 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001023 return res;
1024}
1025
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001026PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001027"accept() -> (socket object, address info)\n\
1028\n\
1029Wait for an incoming connection. Return a new socket representing the\n\
1030connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001031info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001032
Guido van Rossum11ba0942002-06-13 15:07:44 +00001033/* s.setblocking(flag) method. Argument:
1034 False -- non-blocking mode; same as settimeout(0)
1035 True -- blocking mode; same as settimeout(None)
1036*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001037
Guido van Rossum73624e91994-10-10 17:59:00 +00001038static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001039sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001040{
1041 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001042
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001043 block = PyInt_AsLong(arg);
1044 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001045 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001046
Guido van Rossum11ba0942002-06-13 15:07:44 +00001047 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001048 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001049
Guido van Rossum73624e91994-10-10 17:59:00 +00001050 Py_INCREF(Py_None);
1051 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001052}
Guido van Rossume4485b01994-09-07 14:32:49 +00001053
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001054PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001055"setblocking(flag)\n\
1056\n\
1057Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001058setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001059setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001060
Guido van Rossum11ba0942002-06-13 15:07:44 +00001061/* s.settimeout(timeout) method. Argument:
1062 None -- no timeout, blocking mode; same as setblocking(True)
1063 0.0 -- non-blocking mode; same as setblocking(False)
1064 > 0 -- timeout mode; operations time out after timeout seconds
1065 < 0 -- illegal; raises an exception
1066*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001067static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001068sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001069{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001070 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001071
1072 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001073 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001074 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001075 timeout = PyFloat_AsDouble(arg);
1076 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001077 if (!PyErr_Occurred())
1078 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001079 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001080 return NULL;
1081 }
1082 }
1083
Guido van Rossum11ba0942002-06-13 15:07:44 +00001084 s->sock_timeout = timeout;
1085 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001086
1087 Py_INCREF(Py_None);
1088 return Py_None;
1089}
1090
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001091PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001092"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001093\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001094Set a timeout on socket operations. 'timeout' can be a float,\n\
1095giving in seconds, or None. Setting a timeout of None disables\n\
1096the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001097Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001098
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001099/* s.gettimeout() method.
1100 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001101static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001102sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001103{
1104 if (s->sock_timeout < 0.0) {
1105 Py_INCREF(Py_None);
1106 return Py_None;
1107 }
1108 else
1109 return PyFloat_FromDouble(s->sock_timeout);
1110}
1111
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001112PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001113"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001114\n\
1115Returns the timeout in floating seconds associated with socket \n\
1116operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001117operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001118
Guido van Rossum48a680c2001-03-02 06:34:14 +00001119#ifdef RISCOS
1120/* s.sleeptaskw(1 | 0) method */
1121
1122static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001123sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001124{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001125 int block;
1126 int delay_flag;
1127 if (!PyArg_Parse(args, "i", &block))
1128 return NULL;
1129 Py_BEGIN_ALLOW_THREADS
1130 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1131 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001132
Guido van Rossum67f7a382002-06-06 21:08:16 +00001133 Py_INCREF(Py_None);
1134 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001135}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001136PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001137"sleeptaskw(flag)\n\
1138\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001139Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001140#endif
1141
1142
Guido van Rossumaee08791992-09-08 09:05:33 +00001143/* s.setsockopt() method.
1144 With an integer third argument, sets an integer option.
1145 With a string third argument, sets an option from a buffer;
1146 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001147
Guido van Rossum73624e91994-10-10 17:59:00 +00001148static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001149sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001150{
1151 int level;
1152 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001153 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001154 char *buf;
1155 int buflen;
1156 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001157
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001158 if (PyArg_ParseTuple(args, "iii:setsockopt",
1159 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001160 buf = (char *) &flag;
1161 buflen = sizeof flag;
1162 }
1163 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001164 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001165 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1166 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001167 return NULL;
1168 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001169 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001170 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001171 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001172 Py_INCREF(Py_None);
1173 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001174}
1175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001176PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001177"setsockopt(level, option, value)\n\
1178\n\
1179Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001180The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001181
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001182
Guido van Rossumaee08791992-09-08 09:05:33 +00001183/* s.getsockopt() method.
1184 With two arguments, retrieves an integer option.
1185 With a third integer argument, retrieves a string buffer of that size;
1186 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001187
Guido van Rossum73624e91994-10-10 17:59:00 +00001188static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001189sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001190{
1191 int level;
1192 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001193 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001194 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001195 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001196
Guido van Rossumbcc20741998-08-04 22:53:56 +00001197#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001198 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001199 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001200 return NULL;
1201#else
1202
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001203 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1204 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001205 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001206
Guido van Rossumbe32c891996-06-20 16:25:29 +00001207 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001208 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001209 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001210 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001211 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001212 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001213 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001214 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001215 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001216 if (buflen <= 0 || buflen > 1024) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001217 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001218 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001219 return NULL;
1220 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001221 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001222 if (buf == NULL)
1223 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001224 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001225 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001226 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001227 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001228 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001229 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001230 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001231 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001232#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001233}
1234
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001235PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001236"getsockopt(level, option[, buffersize]) -> value\n\
1237\n\
1238Get a socket option. See the Unix manual for level and option.\n\
1239If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001240string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001241
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001242
Fred Drake728819a2000-07-01 03:40:12 +00001243/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001244
Guido van Rossum73624e91994-10-10 17:59:00 +00001245static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001246sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001247{
1248 struct sockaddr *addr;
1249 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001250 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001251
Fred Drake728819a2000-07-01 03:40:12 +00001252 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001253 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001254 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001255 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001256 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001257 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001258 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001259 Py_INCREF(Py_None);
1260 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001261}
1262
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001263PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001264"bind(address)\n\
1265\n\
1266Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001267pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001268sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001269
Guido van Rossum30a685f1991-06-27 15:51:29 +00001270
1271/* s.close() method.
1272 Set the file descriptor to -1 so operations tried subsequently
1273 will surely fail. */
1274
Guido van Rossum73624e91994-10-10 17:59:00 +00001275static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001276sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001277{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001278 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001279
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001280 if ((fd = s->sock_fd) != -1) {
1281 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001282 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001283 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001284 Py_END_ALLOW_THREADS
1285 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001286 Py_INCREF(Py_None);
1287 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001288}
1289
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001290PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001291"close()\n\
1292\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001293Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001294
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001295static int
1296internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1297{
1298 int res;
1299
1300 res = connect(s->sock_fd, addr, addrlen);
1301
1302#ifdef MS_WINDOWS
1303
1304 if (s->sock_timeout > 0.0) {
1305 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
1306 internal_select(s, 1);
1307 res = connect(s->sock_fd, addr, addrlen);
Tim Peters58141872002-08-06 22:25:02 +00001308 if (res < 0) {
1309 /* On Win98, WSAEISCONN was seen here. But
1310 * on Win2K, WSAEINVAL. So accept both as
1311 * meaning "fine".
1312 */
1313 int code = WSAGetLastError();
1314 if (code == WSAEISCONN ||
1315 code == WSAEINVAL)
1316 res = 0;
1317 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001318 }
1319 }
1320
1321 if (res < 0)
1322 res = WSAGetLastError();
1323
1324#else
1325
1326 if (s->sock_timeout > 0.0) {
1327 if (res < 0 && errno == EINPROGRESS) {
1328 internal_select(s, 1);
1329 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001330 if (res < 0 && errno == EISCONN)
1331 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001332 }
1333 }
1334
1335 if (res < 0)
1336 res = errno;
1337
1338#endif
1339
1340 return res;
1341}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001342
Fred Drake728819a2000-07-01 03:40:12 +00001343/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001344
Guido van Rossum73624e91994-10-10 17:59:00 +00001345static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001346sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001347{
1348 struct sockaddr *addr;
1349 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001350 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001351
Fred Drake728819a2000-07-01 03:40:12 +00001352 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001353 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001354
Guido van Rossum73624e91994-10-10 17:59:00 +00001355 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001356 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001357 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001358
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001359 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001360 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001361 Py_INCREF(Py_None);
1362 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001363}
1364
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001365PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001366"connect(address)\n\
1367\n\
1368Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001369is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001370
Guido van Rossum30a685f1991-06-27 15:51:29 +00001371
Fred Drake728819a2000-07-01 03:40:12 +00001372/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001373
1374static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001375sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001376{
1377 struct sockaddr *addr;
1378 int addrlen;
1379 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001380
Fred Drake728819a2000-07-01 03:40:12 +00001381 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001382 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001383
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001384 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001385 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001386 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001387
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001388 return PyInt_FromLong((long) res);
1389}
1390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001391PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001392"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001393\n\
1394This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001395instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001396
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001397
Guido van Rossumed233a51992-06-23 09:07:03 +00001398/* s.fileno() method */
1399
Guido van Rossum73624e91994-10-10 17:59:00 +00001400static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001401sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001402{
Fred Drakea04eaad2000-06-30 02:46:07 +00001403#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001404 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001405#else
1406 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1407#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001408}
1409
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001410PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001411"fileno() -> integer\n\
1412\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001413Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001414
Guido van Rossumed233a51992-06-23 09:07:03 +00001415
Guido van Rossumbe32c891996-06-20 16:25:29 +00001416#ifndef NO_DUP
1417/* s.dup() method */
1418
1419static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001420sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001421{
Fred Drakea04eaad2000-06-30 02:46:07 +00001422 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001423 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001424
Guido van Rossumbe32c891996-06-20 16:25:29 +00001425 newfd = dup(s->sock_fd);
1426 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001427 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001428 sock = (PyObject *) new_sockobject(newfd,
1429 s->sock_family,
1430 s->sock_type,
1431 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001432 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001433 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001434 return sock;
1435}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001436
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001437PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001438"dup() -> socket object\n\
1439\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001440Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001441
Guido van Rossumbe32c891996-06-20 16:25:29 +00001442#endif
1443
1444
Guido van Rossumc89705d1992-11-26 08:54:07 +00001445/* s.getsockname() method */
1446
Guido van Rossum73624e91994-10-10 17:59:00 +00001447static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001448sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001449{
1450 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001451 int res;
1452 socklen_t addrlen;
1453
Guido van Rossumc89705d1992-11-26 08:54:07 +00001454 if (!getsockaddrlen(s, &addrlen))
1455 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001456 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001457 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001458 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001459 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001460 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001461 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001462 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001463}
1464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001465PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001466"getsockname() -> address info\n\
1467\n\
1468Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001469info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001470
Guido van Rossumc89705d1992-11-26 08:54:07 +00001471
Guido van Rossumb6775db1994-08-01 11:34:53 +00001472#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001473/* s.getpeername() method */
1474
Guido van Rossum73624e91994-10-10 17:59:00 +00001475static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001476sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001477{
1478 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001479 int res;
1480 socklen_t addrlen;
1481
Guido van Rossumc89705d1992-11-26 08:54:07 +00001482 if (!getsockaddrlen(s, &addrlen))
1483 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001484 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001485 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001486 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001487 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001488 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001489 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001490 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001491}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001493PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001494"getpeername() -> address info\n\
1495\n\
1496Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001497info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001498
Guido van Rossumb6775db1994-08-01 11:34:53 +00001499#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001500
1501
Guido van Rossum30a685f1991-06-27 15:51:29 +00001502/* s.listen(n) method */
1503
Guido van Rossum73624e91994-10-10 17:59:00 +00001504static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001505sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001506{
1507 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001508 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001509
1510 backlog = PyInt_AsLong(arg);
1511 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001512 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001513 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001514 if (backlog < 1)
1515 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001516 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001517 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001518 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001519 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001520 Py_INCREF(Py_None);
1521 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001522}
1523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001524PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001525"listen(backlog)\n\
1526\n\
1527Enable a server to accept connections. The backlog argument must be at\n\
1528least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001529will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001530
1531
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001532#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001533/* s.makefile(mode) method.
1534 Create a new open file object referring to a dupped version of
1535 the socket's file descriptor. (The dup() call is necessary so
1536 that the open file and socket objects may be closed independent
1537 of each other.)
1538 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1539
Guido van Rossum73624e91994-10-10 17:59:00 +00001540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001541sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001542{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001543 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001544 char *mode = "r";
1545 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001546#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001547 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001548#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001549 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001550#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001551 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001552 PyObject *f;
1553
Guido van Rossum43713e52000-02-29 13:59:29 +00001554 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001555 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001556#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001557 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1558 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001559#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001560 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001561#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001562 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001563 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001564 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001565 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001566 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001567#ifdef USE_GUSI2
1568 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001569 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001570 bufsize = 0;
1571#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001572 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1573 if (f != NULL)
1574 PyFile_SetBufSize(f, bufsize);
1575 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001576}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001577
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001578PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001579"makefile([mode[, buffersize]]) -> file object\n\
1580\n\
1581Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001582The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001583
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001584#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001585
Guido van Rossum48a680c2001-03-02 06:34:14 +00001586
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001587/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001588
Guido van Rossum73624e91994-10-10 17:59:00 +00001589static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001590sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001591{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001592 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001593 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001594
Guido van Rossum43713e52000-02-29 13:59:29 +00001595 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001596 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001597
1598 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001599 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001600 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001601 return NULL;
1602 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001603
Guido van Rossum73624e91994-10-10 17:59:00 +00001604 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001605 if (buf == NULL)
1606 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001607
Guido van Rossum73624e91994-10-10 17:59:00 +00001608 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001609 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001610 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001611 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001612
Guido van Rossum7c53b771995-09-13 18:39:47 +00001613 if (n < 0) {
1614 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001615 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001616 }
Tim Peters5de98422002-04-27 18:44:32 +00001617 if (n != len)
1618 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001619 return buf;
1620}
1621
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001622PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001623"recv(buffersize[, flags]) -> data\n\
1624\n\
1625Receive up to buffersize bytes from the socket. For the optional flags\n\
1626argument, see the Unix manual. When no data is available, block until\n\
1627at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001628the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001629
Guido van Rossum30a685f1991-06-27 15:51:29 +00001630
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001631/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001632
Guido van Rossum73624e91994-10-10 17:59:00 +00001633static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001634sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001635{
1636 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001637 PyObject *buf = NULL;
1638 PyObject *addr = NULL;
1639 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001640 int len, n, flags = 0;
1641 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001642
Guido van Rossum43713e52000-02-29 13:59:29 +00001643 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001644 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001645
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001646 if (!getsockaddrlen(s, &addrlen))
1647 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001648 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001649 if (buf == NULL)
1650 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001651
Guido van Rossum73624e91994-10-10 17:59:00 +00001652 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001653 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001654 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001655 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001656#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001657#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001658 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001659#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001660 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001661#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001662#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001663 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001664#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001665 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001666 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001667
Guido van Rossum7c53b771995-09-13 18:39:47 +00001668 if (n < 0) {
1669 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001670 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001671 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001672
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001673 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001674 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001675
Guido van Rossum67f7a382002-06-06 21:08:16 +00001676 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001677 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001678 goto finally;
1679
Guido van Rossum73624e91994-10-10 17:59:00 +00001680 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001681
1682finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001683 Py_XDECREF(addr);
1684 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001685 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001686}
1687
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001688PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001689"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1690\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001691Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001692
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001693/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001694
Guido van Rossum73624e91994-10-10 17:59:00 +00001695static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001696sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001697{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001698 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001699 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001700
Guido van Rossum43713e52000-02-29 13:59:29 +00001701 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001702 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001703
Guido van Rossum73624e91994-10-10 17:59:00 +00001704 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001705 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001706 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001707 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001708
Guido van Rossum30a685f1991-06-27 15:51:29 +00001709 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001710 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001711 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001712}
1713
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001714PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001715"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001716\n\
1717Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001718argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001719sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001720
1721
1722/* s.sendall(data [,flags]) method */
1723
1724static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001725sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001726{
1727 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001728 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001729
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001730 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1731 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001732
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001733 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001734 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001735 do {
1736 n = send(s->sock_fd, buf, len, flags);
1737 if (n < 0)
1738 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001739 buf += n;
1740 len -= n;
1741 } while (len > 0);
1742 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001743
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001744 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001745 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001746
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001747 Py_INCREF(Py_None);
1748 return Py_None;
1749}
1750
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001751PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001752"sendall(data[, flags])\n\
1753\n\
1754Send a data string to the socket. For the optional flags\n\
1755argument, see the Unix manual. This calls send() repeatedly\n\
1756until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001757to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001758
Guido van Rossum30a685f1991-06-27 15:51:29 +00001759
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001760/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001761
Guido van Rossum73624e91994-10-10 17:59:00 +00001762static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001763sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001764{
Guido van Rossum73624e91994-10-10 17:59:00 +00001765 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001766 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001767 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001768 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001769
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001770 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001771 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001772 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001773 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1774 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001775 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001776 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001777
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001778 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001779 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001780
Guido van Rossum73624e91994-10-10 17:59:00 +00001781 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001782 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001783 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001784 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001785
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001786 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001787 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001788 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001789}
1790
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001791PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001792"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001793\n\
1794Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001795For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001796
Guido van Rossum30a685f1991-06-27 15:51:29 +00001797
1798/* s.shutdown(how) method */
1799
Guido van Rossum73624e91994-10-10 17:59:00 +00001800static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001801sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001802{
1803 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001804 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001805
1806 how = PyInt_AsLong(arg);
1807 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001808 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001809 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001810 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001811 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001812 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001813 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001814 Py_INCREF(Py_None);
1815 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001816}
1817
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001818PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001819"shutdown(flag)\n\
1820\n\
1821Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001822of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001823
Guido van Rossum30a685f1991-06-27 15:51:29 +00001824
1825/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001826
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001827static PyMethodDef sock_methods[] = {
1828 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001829 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001830 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001831 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001832 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001833 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001834 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001835 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001836 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001837 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001838#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001839 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001840 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001841#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001842 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001843 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001844#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001845 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001846 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001847#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001848 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001849 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001850 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001851 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001852 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001853 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001854#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001855 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001856 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001857#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001858 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001859 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001860 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001861 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001862 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001863 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001864 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001865 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001866 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001867 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001868 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001869 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001870 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001871 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001872 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001873 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001874 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001875 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001876 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001877 shutdown_doc},
1878#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001879 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001880 sleeptaskw_doc},
1881#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001882 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001883};
1884
Guido van Rossum30a685f1991-06-27 15:51:29 +00001885
Guido van Rossum73624e91994-10-10 17:59:00 +00001886/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001887 First close the file description. */
1888
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001889static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001890sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001891{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001892 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001893 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001894 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001895}
1896
Guido van Rossum30a685f1991-06-27 15:51:29 +00001897
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001898static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001899sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001900{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001901 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001902#if SIZEOF_SOCKET_T > SIZEOF_LONG
1903 if (s->sock_fd > LONG_MAX) {
1904 /* this can occur on Win64, and actually there is a special
1905 ugly printf formatter for decimal pointer length integer
1906 printing, only bother if necessary*/
1907 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001908 "no printf formatter to display "
1909 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00001910 return NULL;
1911 }
1912#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001913 PyOS_snprintf(
1914 buf, sizeof(buf),
1915 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1916 (long)s->sock_fd, s->sock_family,
1917 s->sock_type,
1918 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001919 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001920}
1921
1922
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001923/* Create a new, uninitialized socket object. */
1924
1925static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001926sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001927{
1928 PyObject *new;
1929
1930 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00001931 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001932 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001933 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001934 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00001935 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001936 return new;
1937}
1938
1939
1940/* Initialize a new socket object. */
1941
1942/*ARGSUSED*/
1943static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00001944sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001945{
1946 PySocketSockObject *s = (PySocketSockObject *)self;
1947 SOCKET_T fd;
1948 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1949 static char *keywords[] = {"family", "type", "proto", 0};
1950
1951 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1952 "|iii:socket", keywords,
1953 &family, &type, &proto))
1954 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001955
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001956 Py_BEGIN_ALLOW_THREADS
1957 fd = socket(family, type, proto);
1958 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001959
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001960#ifdef MS_WINDOWS
1961 if (fd == INVALID_SOCKET)
1962#else
1963 if (fd < 0)
1964#endif
1965 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001966 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001967 return -1;
1968 }
1969 init_sockobject(s, fd, family, type, proto);
1970 /* From now on, ignore SIGPIPE and let the error checking
1971 do the work. */
1972#ifdef SIGPIPE
1973 (void) signal(SIGPIPE, SIG_IGN);
1974#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001975
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001976 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001977
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001978}
1979
1980
Guido van Rossumb6775db1994-08-01 11:34:53 +00001981/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001982
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001983static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001984 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001985 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001986 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001987 sizeof(PySocketSockObject), /* tp_basicsize */
1988 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001989 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001990 0, /* tp_print */
1991 0, /* tp_getattr */
1992 0, /* tp_setattr */
1993 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001994 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001995 0, /* tp_as_number */
1996 0, /* tp_as_sequence */
1997 0, /* tp_as_mapping */
1998 0, /* tp_hash */
1999 0, /* tp_call */
2000 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002001 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002002 0, /* tp_setattro */
2003 0, /* tp_as_buffer */
2004 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002005 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002006 0, /* tp_traverse */
2007 0, /* tp_clear */
2008 0, /* tp_richcompare */
2009 0, /* tp_weaklistoffset */
2010 0, /* tp_iter */
2011 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002012 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002013 0, /* tp_members */
2014 0, /* tp_getset */
2015 0, /* tp_base */
2016 0, /* tp_dict */
2017 0, /* tp_descr_get */
2018 0, /* tp_descr_set */
2019 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002020 sock_initobj, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002021 0, /* set below */ /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002022 sock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002023 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002024};
2025
Guido van Rossum30a685f1991-06-27 15:51:29 +00002026
Guido van Rossum81194471991-07-27 21:42:02 +00002027/* Python interface to gethostname(). */
2028
2029/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002030static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002031socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002032{
2033 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002034 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002035 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002036 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002037 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002038 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002039 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002040 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002041 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002042 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002043 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002044}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002045
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002046PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002047"gethostname() -> string\n\
2048\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002049Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002050
Guido van Rossumff4949e1992-08-05 19:58:53 +00002051
Guido van Rossum30a685f1991-06-27 15:51:29 +00002052/* Python interface to gethostbyname(name). */
2053
2054/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002055static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002056socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002057{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002058 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002059 struct sockaddr_storage addrbuf;
2060
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002061 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002062 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002063 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002064 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002065 return makeipaddr((struct sockaddr *)&addrbuf,
2066 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002067}
2068
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002069PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002070"gethostbyname(host) -> address\n\
2071\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002072Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002073
2074
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002075/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2076
2077static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002078gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002079{
2080 char **pch;
2081 PyObject *rtn_tuple = (PyObject *)NULL;
2082 PyObject *name_list = (PyObject *)NULL;
2083 PyObject *addr_list = (PyObject *)NULL;
2084 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002085
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002086 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002087 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002088#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002089 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002090#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002091 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002092#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002093 return NULL;
2094 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002095
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002096 if (h->h_addrtype != af) {
2097#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002098 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002099 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002100 (char *)strerror(EAFNOSUPPORT));
2101#else
2102 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002103 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002104 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002105#endif
2106 return NULL;
2107 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002108
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002109 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002110
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002111 case AF_INET:
2112 if (alen < sizeof(struct sockaddr_in))
2113 return NULL;
2114 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002115
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002116#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002117 case AF_INET6:
2118 if (alen < sizeof(struct sockaddr_in6))
2119 return NULL;
2120 break;
2121#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002122
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002123 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002124
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002125 if ((name_list = PyList_New(0)) == NULL)
2126 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002127
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002128 if ((addr_list = PyList_New(0)) == NULL)
2129 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002130
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002131 for (pch = h->h_aliases; *pch != NULL; pch++) {
2132 int status;
2133 tmp = PyString_FromString(*pch);
2134 if (tmp == NULL)
2135 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002136
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002137 status = PyList_Append(name_list, tmp);
2138 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002139
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002140 if (status)
2141 goto err;
2142 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002143
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002144 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2145 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002146
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002147 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002148
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002149 case AF_INET:
2150 {
2151 struct sockaddr_in sin;
2152 memset(&sin, 0, sizeof(sin));
2153 sin.sin_family = af;
2154#ifdef HAVE_SOCKADDR_SA_LEN
2155 sin.sin_len = sizeof(sin);
2156#endif
2157 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2158 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002159
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002160 if (pch == h->h_addr_list && alen >= sizeof(sin))
2161 memcpy((char *) addr, &sin, sizeof(sin));
2162 break;
2163 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002164
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002165#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002166 case AF_INET6:
2167 {
2168 struct sockaddr_in6 sin6;
2169 memset(&sin6, 0, sizeof(sin6));
2170 sin6.sin6_family = af;
2171#ifdef HAVE_SOCKADDR_SA_LEN
2172 sin6.sin6_len = sizeof(sin6);
2173#endif
2174 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2175 tmp = makeipaddr((struct sockaddr *)&sin6,
2176 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002177
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002178 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2179 memcpy((char *) addr, &sin6, sizeof(sin6));
2180 break;
2181 }
2182#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002183
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002184 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002185 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002186 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002187 return NULL;
2188 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002189
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002190 if (tmp == NULL)
2191 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002192
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002193 status = PyList_Append(addr_list, tmp);
2194 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002195
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002196 if (status)
2197 goto err;
2198 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002199
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002200 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002201
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002202 err:
2203 Py_XDECREF(name_list);
2204 Py_XDECREF(addr_list);
2205 return rtn_tuple;
2206}
2207
2208
2209/* Python interface to gethostbyname_ex(name). */
2210
2211/*ARGSUSED*/
2212static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002213socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002214{
2215 char *name;
2216 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002217 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002218 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002219 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002220#ifdef HAVE_GETHOSTBYNAME_R
2221 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002222#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2223 struct hostent_data data;
2224#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002225 char buf[16384];
2226 int buf_len = (sizeof buf) - 1;
2227 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002228#endif
2229#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002230 int result;
2231#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002232#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002233
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002234 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002235 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002236 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002237 return NULL;
2238 Py_BEGIN_ALLOW_THREADS
2239#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002240#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002241 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2242 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002243#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002244 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002245#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002246 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002247 result = gethostbyname_r(name, &hp_allocated, &data);
2248 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002249#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002250#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002251#ifdef USE_GETHOSTBYNAME_LOCK
2252 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002253#endif
2254 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002255#endif /* HAVE_GETHOSTBYNAME_R */
2256 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002257 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002258 addr.ss_family.
2259 Therefore, we cast the sockaddr_storage into sockaddr to
2260 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002261 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002262 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002263 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002264#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002265 PyThread_release_lock(gethostbyname_lock);
2266#endif
2267 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002268}
2269
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002270PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002271"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2272\n\
2273Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002274for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002275
2276
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002277/* Python interface to gethostbyaddr(IP). */
2278
2279/*ARGSUSED*/
2280static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002281socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002282{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002283#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002284 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002285#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002286 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002287#endif
2288 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002289 char *ip_num;
2290 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002291 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002292#ifdef HAVE_GETHOSTBYNAME_R
2293 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002294#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2295 struct hostent_data data;
2296#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002297 char buf[16384];
2298 int buf_len = (sizeof buf) - 1;
2299 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002300#endif
2301#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002302 int result;
2303#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002304#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002305 char *ap;
2306 int al;
2307 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002308
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002309 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002310 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002311 af = PF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002312 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002313 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002314 af = sa->sa_family;
2315 ap = NULL;
2316 al = 0;
2317 switch (af) {
2318 case AF_INET:
2319 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2320 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2321 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002322#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002323 case AF_INET6:
2324 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2325 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2326 break;
2327#endif
2328 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002329 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002330 return NULL;
2331 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002332 Py_BEGIN_ALLOW_THREADS
2333#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002334#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002335 result = gethostbyaddr_r(ap, al, af,
2336 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002337 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002338#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002339 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002340 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002341#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002342 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002343 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002344 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002345#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002346#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002347#ifdef USE_GETHOSTBYNAME_LOCK
2348 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002349#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002350 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002351#endif /* HAVE_GETHOSTBYNAME_R */
2352 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002353 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002354#ifdef USE_GETHOSTBYNAME_LOCK
2355 PyThread_release_lock(gethostbyname_lock);
2356#endif
2357 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002358}
2359
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002360PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002361"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2362\n\
2363Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002364for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002365
Guido van Rossum30a685f1991-06-27 15:51:29 +00002366
2367/* Python interface to getservbyname(name).
2368 This only returns the port number, since the other info is already
2369 known or not useful (like the list of aliases). */
2370
2371/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002372static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002373socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002374{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002375 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002376 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002377 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002378 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002379 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002380 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002381 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002382 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002383 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002384 return NULL;
2385 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002386 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002387}
2388
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002389PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002390"getservbyname(servicename, protocolname) -> integer\n\
2391\n\
2392Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002393The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002394
Guido van Rossum30a685f1991-06-27 15:51:29 +00002395
Guido van Rossum3901d851996-12-19 16:35:04 +00002396/* Python interface to getprotobyname(name).
2397 This only returns the protocol number, since the other info is
2398 already known or not useful (like the list of aliases). */
2399
2400/*ARGSUSED*/
2401static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002402socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002403{
2404 char *name;
2405 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002406#ifdef __BEOS__
2407/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002408 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002409 return NULL;
2410#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002411 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002412 return NULL;
2413 Py_BEGIN_ALLOW_THREADS
2414 sp = getprotobyname(name);
2415 Py_END_ALLOW_THREADS
2416 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002417 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002418 return NULL;
2419 }
2420 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002421#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002422}
2423
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002424PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002425"getprotobyname(name) -> integer\n\
2426\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002427Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002428
Guido van Rossum3901d851996-12-19 16:35:04 +00002429
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002430#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002431/* Create a socket object from a numeric file description.
2432 Useful e.g. if stdin is a socket.
2433 Additional arguments as for socket(). */
2434
2435/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002436static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002437socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002438{
Guido van Rossum73624e91994-10-10 17:59:00 +00002439 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002440 SOCKET_T fd;
2441 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002442 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2443 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002444 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002445 /* Dup the fd so it and the socket can be closed independently */
2446 fd = dup(fd);
2447 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002448 return set_error();
2449 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002450 /* From now on, ignore SIGPIPE and let the error checking
2451 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002452#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002453 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002454#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002455 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002456}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002457
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002458PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002459"fromfd(fd, family, type[, proto]) -> socket object\n\
2460\n\
2461Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002462The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002463
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002464#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002465
Guido van Rossum82a5c661998-07-07 20:45:43 +00002466
Guido van Rossum006bf911996-06-12 04:04:55 +00002467static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002468socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002469{
2470 int x1, x2;
2471
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002472 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002473 return NULL;
2474 }
2475 x2 = (int)ntohs((short)x1);
2476 return PyInt_FromLong(x2);
2477}
2478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002479PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002480"ntohs(integer) -> integer\n\
2481\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002482Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002483
2484
Guido van Rossum006bf911996-06-12 04:04:55 +00002485static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002486socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002487{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002488 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002489
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002490 if (PyInt_Check(arg)) {
2491 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002492 if (x == (unsigned long) -1 && PyErr_Occurred())
2493 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002494 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002495 else if (PyLong_Check(arg)) {
2496 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002497 if (x == (unsigned long) -1 && PyErr_Occurred())
2498 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002499#if SIZEOF_LONG > 4
2500 {
2501 unsigned long y;
2502 /* only want the trailing 32 bits */
2503 y = x & 0xFFFFFFFFUL;
2504 if (y ^ x)
2505 return PyErr_Format(PyExc_OverflowError,
2506 "long int larger than 32 bits");
2507 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002508 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002509#endif
2510 }
2511 else
Tim Peters58141872002-08-06 22:25:02 +00002512 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002513 "expected int/long, %s found",
2514 arg->ob_type->tp_name);
2515 if (x == (unsigned long) -1 && PyErr_Occurred())
2516 return NULL;
2517 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002518}
2519
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002520PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002521"ntohl(integer) -> integer\n\
2522\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002523Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002524
2525
Guido van Rossum006bf911996-06-12 04:04:55 +00002526static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002527socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002528{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002529 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002530
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002531 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002532 return NULL;
2533 }
2534 x2 = (int)htons((short)x1);
2535 return PyInt_FromLong(x2);
2536}
2537
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002538PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002539"htons(integer) -> integer\n\
2540\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002541Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002542
2543
Guido van Rossum006bf911996-06-12 04:04:55 +00002544static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002545socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002546{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002547 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002548
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002549 if (PyInt_Check(arg)) {
2550 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002551 if (x == (unsigned long) -1 && PyErr_Occurred())
2552 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002553 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002554 else if (PyLong_Check(arg)) {
2555 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002556 if (x == (unsigned long) -1 && PyErr_Occurred())
2557 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002558#if SIZEOF_LONG > 4
2559 {
2560 unsigned long y;
2561 /* only want the trailing 32 bits */
2562 y = x & 0xFFFFFFFFUL;
2563 if (y ^ x)
2564 return PyErr_Format(PyExc_OverflowError,
2565 "long int larger than 32 bits");
2566 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002567 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002568#endif
2569 }
2570 else
Tim Peters58141872002-08-06 22:25:02 +00002571 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002572 "expected int/long, %s found",
2573 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002574 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002575}
2576
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002577PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002578"htonl(integer) -> integer\n\
2579\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002580Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002581
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002582/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002583
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002584PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002585"inet_aton(string) -> packed 32-bit IP representation\n\
2586\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002587Convert 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 +00002588binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002589
2590static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002591socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002592{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002593#ifndef INADDR_NONE
2594#define INADDR_NONE (-1)
2595#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002596
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002597 /* Have to use inet_addr() instead */
2598 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002599 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002600
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002601 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002602 return NULL;
2603 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002604 packed_addr = inet_addr(ip_addr);
2605
2606 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002607 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002608 "illegal IP address string passed to inet_aton");
2609 return NULL;
2610 }
2611
2612 return PyString_FromStringAndSize((char *) &packed_addr,
2613 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002614}
2615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002616PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002617"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002618\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002619Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002620
2621static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002622socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002623{
2624 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002625 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002626 struct in_addr packed_addr;
2627
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002628 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002629 return NULL;
2630 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002631
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002632 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002633 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002634 "packed IP wrong length for inet_ntoa");
2635 return NULL;
2636 }
2637
2638 memcpy(&packed_addr, packed_str, addr_len);
2639
2640 return PyString_FromString(inet_ntoa(packed_addr));
2641}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002642
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002643/* Python interface to getaddrinfo(host, port). */
2644
2645/*ARGSUSED*/
2646static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002647socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002648{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002649 struct addrinfo hints, *res;
2650 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002651 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002652 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002653 char *hptr, *pptr;
2654 int family, socktype, protocol, flags;
2655 int error;
2656 PyObject *all = (PyObject *)NULL;
2657 PyObject *single = (PyObject *)NULL;
2658
2659 family = socktype = protocol = flags = 0;
2660 family = PF_UNSPEC;
2661 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2662 &hptr, &pobj, &family, &socktype,
2663 &protocol, &flags)) {
2664 return NULL;
2665 }
2666 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002667 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002668 pptr = pbuf;
2669 } else if (PyString_Check(pobj)) {
2670 pptr = PyString_AsString(pobj);
2671 } else if (pobj == Py_None) {
2672 pptr = (char *)NULL;
2673 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002674 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002675 return NULL;
2676 }
2677 memset(&hints, 0, sizeof(hints));
2678 hints.ai_family = family;
2679 hints.ai_socktype = socktype;
2680 hints.ai_protocol = protocol;
2681 hints.ai_flags = flags;
2682 error = getaddrinfo(hptr, pptr, &hints, &res0);
2683 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002684 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002685 return NULL;
2686 }
2687
2688 if ((all = PyList_New(0)) == NULL)
2689 goto err;
2690 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002691 PyObject *addr =
2692 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2693 if (addr == NULL)
2694 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002695 single = Py_BuildValue("iiisO", res->ai_family,
2696 res->ai_socktype, res->ai_protocol,
2697 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002698 addr);
2699 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002700 if (single == NULL)
2701 goto err;
2702
2703 if (PyList_Append(all, single))
2704 goto err;
2705 Py_XDECREF(single);
2706 }
Neal Norwitz90128ba2002-08-09 03:37:42 +00002707 if (res0)
2708 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002709 return all;
2710 err:
2711 Py_XDECREF(single);
2712 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002713 if (res0)
2714 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002715 return (PyObject *)NULL;
2716}
2717
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002718PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002719"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2720 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002721\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002722Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002723
2724/* Python interface to getnameinfo(sa, flags). */
2725
2726/*ARGSUSED*/
2727static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002728socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002729{
2730 PyObject *sa = (PyObject *)NULL;
2731 int flags;
2732 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002733 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002734 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2735 struct addrinfo hints, *res = NULL;
2736 int error;
2737 PyObject *ret = (PyObject *)NULL;
2738
2739 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002740 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002741 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002742 if (!PyArg_ParseTuple(sa, "si|ii",
2743 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002744 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002745 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002746 memset(&hints, 0, sizeof(hints));
2747 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002748 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002749 error = getaddrinfo(hostp, pbuf, &hints, &res);
2750 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002751 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002752 goto fail;
2753 }
2754 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002755 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002756 "sockaddr resolved to multiple addresses");
2757 goto fail;
2758 }
2759 switch (res->ai_family) {
2760 case AF_INET:
2761 {
2762 char *t1;
2763 int t2;
2764 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002765 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002766 "IPv4 sockaddr must be 2 tuple");
2767 goto fail;
2768 }
2769 break;
2770 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002771#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002772 case AF_INET6:
2773 {
2774 struct sockaddr_in6 *sin6;
2775 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2776 sin6->sin6_flowinfo = flowinfo;
2777 sin6->sin6_scope_id = scope_id;
2778 break;
2779 }
2780#endif
2781 }
2782 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2783 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2784 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002785 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002786 goto fail;
2787 }
2788 ret = Py_BuildValue("ss", hbuf, pbuf);
2789
2790fail:
2791 if (res)
2792 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002793 return ret;
2794}
2795
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002796PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002797"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002798\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002799Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002800
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002801
2802/* Python API to getting and setting the default timeout value. */
2803
2804static PyObject *
2805socket_getdefaulttimeout(PyObject *self)
2806{
2807 if (defaulttimeout < 0.0) {
2808 Py_INCREF(Py_None);
2809 return Py_None;
2810 }
2811 else
2812 return PyFloat_FromDouble(defaulttimeout);
2813}
2814
2815PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002816"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002817\n\
2818Returns the default timeout in floating seconds for new socket objects.\n\
2819A value of None indicates that new socket objects have no timeout.\n\
2820When the socket module is first imported, the default is None.");
2821
2822static PyObject *
2823socket_setdefaulttimeout(PyObject *self, PyObject *arg)
2824{
2825 double timeout;
2826
2827 if (arg == Py_None)
2828 timeout = -1.0;
2829 else {
2830 timeout = PyFloat_AsDouble(arg);
2831 if (timeout < 0.0) {
2832 if (!PyErr_Occurred())
2833 PyErr_SetString(PyExc_ValueError,
2834 "Timeout value out of range");
2835 return NULL;
2836 }
2837 }
2838
2839 defaulttimeout = timeout;
2840
2841 Py_INCREF(Py_None);
2842 return Py_None;
2843}
2844
2845PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002846"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002847\n\
2848Set the default timeout in floating seconds for new socket objects.\n\
2849A value of None indicates that new socket objects have no timeout.\n\
2850When the socket module is first imported, the default is None.");
2851
2852
Guido van Rossum30a685f1991-06-27 15:51:29 +00002853/* List of functions exported by this module. */
2854
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002855static PyMethodDef socket_methods[] = {
2856 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002857 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002858 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002859 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002860 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002861 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002862 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002863 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002864 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002865 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002866 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002867 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002868#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002869 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002870 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002871#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002872 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002873 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002874 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002875 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002876 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002877 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002878 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002879 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002880 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002881 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002882 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002883 METH_VARARGS, inet_ntoa_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002884 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002885 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002886 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002887 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00002888 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00002889 METH_NOARGS, getdefaulttimeout_doc},
2890 {"setdefaulttimeout", socket_setdefaulttimeout,
2891 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002892 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002893};
2894
Guido van Rossum30a685f1991-06-27 15:51:29 +00002895
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002896#ifdef RISCOS
2897#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00002898
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002899static int
2900os_init(void)
2901{
2902 _kernel_swi_regs r;
2903
2904 r.r[0] = 0;
2905 _kernel_swi(0x43380, &r, &r);
2906 taskwindow = r.r[0];
2907
2908 return 0;
2909}
2910
2911#endif /* RISCOS */
2912
2913
2914#ifdef MS_WINDOWS
2915#define OS_INIT_DEFINED
2916
2917/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002918
2919static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002920os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002921{
2922 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002923}
2924
2925static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002926os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002927{
2928 WSADATA WSAData;
2929 int ret;
2930 char buf[100];
2931 ret = WSAStartup(0x0101, &WSAData);
2932 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002933 case 0: /* No error */
2934 atexit(os_cleanup);
2935 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002936 case WSASYSNOTREADY:
2937 PyErr_SetString(PyExc_ImportError,
2938 "WSAStartup failed: network not ready");
2939 break;
2940 case WSAVERNOTSUPPORTED:
2941 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002942 PyErr_SetString(
2943 PyExc_ImportError,
2944 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00002945 break;
2946 default:
Tim Peters885d4572001-11-28 20:27:42 +00002947 PyOS_snprintf(buf, sizeof(buf),
2948 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002949 PyErr_SetString(PyExc_ImportError, buf);
2950 break;
2951 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002952 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002953}
2954
Guido van Rossum8d665e61996-06-26 18:22:49 +00002955#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002956
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002957
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002958#ifdef PYOS_OS2
2959#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002960
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002961/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002962
2963static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002964os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002965{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002966#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002967 char reason[64];
2968 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002969
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002970 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002971 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002972 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002973
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002974 PyOS_snprintf(reason, sizeof(reason),
2975 "OS/2 TCP/IP Error# %d", sock_errno());
2976 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002977
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002978 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002979#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002980 /* No need to initialise sockets with GCC/EMX */
2981 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002982#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002983}
2984
2985#endif /* PYOS_OS2 */
2986
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002987
2988#ifndef OS_INIT_DEFINED
2989static int
2990os_init(void)
2991{
2992 return 1; /* Success */
2993}
2994#endif
2995
2996
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002997/* C API table - always add new things to the end for binary
2998 compatibility. */
2999static
3000PySocketModule_APIObject PySocketModuleAPI =
3001{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003002 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003003};
3004
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003005
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003006/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003007
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003008 This module is actually called "_socket", and there's a wrapper
3009 "socket.py" which implements some additional functionality. On some
3010 platforms (e.g. Windows and OS/2), socket.py also implements a
3011 wrapper for the socket type that provides missing functionality such
3012 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3013 with an ImportError exception if os-specific initialization fails.
3014 On Windows, this does WINSOCK initialization. When WINSOCK is
3015 initialized succesfully, a call to WSACleanup() is scheduled to be
3016 made at exit time.
3017*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003018
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003019PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003020"Implementation module for socket operations.\n\
3021\n\
3022See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003023
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003024PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003025init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003026{
Fred Drake4baedc12002-04-01 14:53:37 +00003027 PyObject *m;
Fred Drake4baedc12002-04-01 14:53:37 +00003028
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003029 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003030 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003031
3032 sock_type.ob_type = &PyType_Type;
3033 sock_type.tp_getattro = PyObject_GenericGetAttr;
3034 sock_type.tp_alloc = PyType_GenericAlloc;
3035 sock_type.tp_free = PyObject_Del;
3036 m = Py_InitModule3(PySocket_MODULE_NAME,
3037 socket_methods,
3038 socket_doc);
3039
3040 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3041 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003042 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003043 Py_INCREF(socket_error);
3044 PyModule_AddObject(m, "error", socket_error);
3045 socket_herror = PyErr_NewException("socket.herror",
3046 socket_error, NULL);
3047 if (socket_herror == NULL)
3048 return;
3049 Py_INCREF(socket_herror);
3050 PyModule_AddObject(m, "herror", socket_herror);
3051 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003052 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003053 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003054 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003055 Py_INCREF(socket_gaierror);
3056 PyModule_AddObject(m, "gaierror", socket_gaierror);
3057 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003058 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003059 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003060 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003061 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003062 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003063 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003064 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003065
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003066 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003067 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003068 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3069 ) != 0)
3070 return;
3071
Guido van Rossum09be4091999-08-09 14:40:40 +00003072 /* Address families (we only support AF_INET and AF_UNIX) */
3073#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003074 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003075#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003076 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003077#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003078 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003079#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003080#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00003081 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003082#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003083#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003084 /* Amateur Radio AX.25 */
3085 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003086#endif
3087#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003088 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003089#endif
3090#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003091 /* Appletalk DDP */
3092 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003093#endif
3094#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003095 /* Amateur radio NetROM */
3096 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003097#endif
3098#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003099 /* Multiprotocol bridge */
3100 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003101#endif
3102#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003103 /* Reserved for Werner's ATM */
3104 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003105#endif
3106#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003107 /* Reserved for X.25 project */
3108 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003109#endif
3110#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003111 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003112#endif
3113#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003114 /* Amateur Radio X.25 PLP */
3115 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003116#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003117#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003118 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3119 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3120 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3121 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3122 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3123 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3124 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3125 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3126 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003127#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003128
3129 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003130 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3131 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003132#ifndef __BEOS__
3133/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003134 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3135 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3136 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003137#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003138
3139#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003140 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003141#endif
3142#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003143 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003144#endif
3145#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003146 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003147#endif
3148#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003149 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003150#endif
3151#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003152 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003153#endif
3154#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003155 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003156#endif
3157#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003158 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003159#endif
3160#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003161 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003162#endif
3163#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003164 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003165#endif
3166#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003167 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003168#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003169#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003170 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003171#endif
3172#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003173 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003174#endif
3175#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003176 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003177#endif
3178#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003179 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003180#endif
3181#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003182 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003183#endif
3184#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003185 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003186#endif
3187#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003188 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003189#endif
3190#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003191 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003192#endif
3193
3194 /* Maximum number of connections for "listen" */
3195#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003196 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003197#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003198 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003199#endif
3200
3201 /* Flags for send, recv */
3202#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003203 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003204#endif
3205#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003206 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003207#endif
3208#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003209 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003210#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003211#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003212 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003213#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003214#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003215 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003216#endif
3217#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003218 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003219#endif
3220#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003221 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003222#endif
3223#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003224 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003225#endif
3226#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003227 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003228#endif
3229#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003230 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003231#endif
3232
3233 /* Protocol level and numbers, usable for [gs]etsockopt */
3234#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003235 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003236#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003237#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003238 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003239#else
Fred Drake4baedc12002-04-01 14:53:37 +00003240 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003241#endif
3242#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003243 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003244#endif
3245#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003246 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003247#endif
3248#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003249 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003250#endif
3251#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003252 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003253#endif
3254#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003255 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003256#endif
3257#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003258 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003259#else
Fred Drake4baedc12002-04-01 14:53:37 +00003260 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003261#endif
3262#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003263 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003264#else
Fred Drake4baedc12002-04-01 14:53:37 +00003265 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003266#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003267#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003268 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003269#else
Fred Drake4baedc12002-04-01 14:53:37 +00003270 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003271#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003272#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003273 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003274#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003275#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003276 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003277#else
Fred Drake4baedc12002-04-01 14:53:37 +00003278 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003279#endif
3280#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003281 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003282#endif
3283#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003284 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003285#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003286#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003287 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003288#endif
3289#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003290 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003291#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003292#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003293 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003294#else
Fred Drake4baedc12002-04-01 14:53:37 +00003295 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003296#endif
3297#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003298 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003299#endif
3300#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003301 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003302#endif
3303#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003304 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003305#else
Fred Drake4baedc12002-04-01 14:53:37 +00003306 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003307#endif
3308#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003309 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003310#endif
3311#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003312 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003313#endif
3314#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003315 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003316#endif
3317#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003318 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003319#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003320#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003321 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003322#endif
3323#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003324 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003325#endif
3326#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003327 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003328#endif
3329#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003330 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003331#endif
3332#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003333 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003334#endif
3335#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003336 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003337#endif
3338#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003339 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003340#endif
3341#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003342 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003343#endif
3344#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003345 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003346#endif
3347#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003348 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003349#endif
3350#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003351 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003352#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003353#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003354 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003355#endif
3356#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003357 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003358#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003359#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003360 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003361#endif
3362#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003363 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003364#endif
3365#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003366 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003367#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003368#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003369 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003370#endif
3371/**/
3372#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003373 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003374#else
Fred Drake4baedc12002-04-01 14:53:37 +00003375 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003376#endif
3377#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003378 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003379#endif
3380
3381 /* Some port configuration */
3382#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003383 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003384#else
Fred Drake4baedc12002-04-01 14:53:37 +00003385 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003386#endif
3387#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003388 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003389#else
Fred Drake4baedc12002-04-01 14:53:37 +00003390 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003391#endif
3392
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003393 /* Some reserved IP v.4 addresses */
3394#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003395 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003396#else
Fred Drake4baedc12002-04-01 14:53:37 +00003397 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003398#endif
3399#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003400 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003401#else
Fred Drake4baedc12002-04-01 14:53:37 +00003402 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003403#endif
3404#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003405 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003406#else
Fred Drake4baedc12002-04-01 14:53:37 +00003407 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003408#endif
3409#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003410 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003411#else
Fred Drake4baedc12002-04-01 14:53:37 +00003412 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003413#endif
3414#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003415 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3416 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003417#else
Fred Drake4baedc12002-04-01 14:53:37 +00003418 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003419#endif
3420#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003421 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3422 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003423#else
Fred Drake4baedc12002-04-01 14:53:37 +00003424 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003425#endif
3426#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003427 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003428#else
Fred Drake4baedc12002-04-01 14:53:37 +00003429 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003430#endif
3431
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003432 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003433#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003434 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003435#endif
3436#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003437 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003438#endif
3439#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003440 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003441#endif
3442#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003443 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003444#endif
3445#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003446 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003447#endif
3448#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003449 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003450#endif
3451#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003452 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003453#endif
3454#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003455 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003456#endif
3457#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003458 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003459#endif
3460#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003461 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003462#endif
3463#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003464 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003465#endif
3466#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003467 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003468#endif
3469#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003470 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003471#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003472#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003473 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3474 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003475#endif
3476#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003477 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3478 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003479#endif
3480#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003481 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003482#endif
3483
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003484 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3485#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003486 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003487#endif
3488#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003489 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003490#endif
3491#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003492 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003493#endif
3494#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003495 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003496#endif
3497#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003498 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003499#endif
3500#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003501 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003502#endif
3503
Guido van Rossum09be4091999-08-09 14:40:40 +00003504 /* TCP options */
3505#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003506 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003507#endif
3508#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003509 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003510#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003511#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003512 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003513#endif
3514#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003515 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003516#endif
3517#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003518 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003519#endif
3520#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003521 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003522#endif
3523#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003524 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003525#endif
3526#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003527 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003528#endif
3529#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003530 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003531#endif
3532#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003533 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003534#endif
3535#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003536 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003537#endif
3538#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003539 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003540#endif
3541
Guido van Rossum09be4091999-08-09 14:40:40 +00003542
3543 /* IPX options */
3544#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003545 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003546#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003547
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003548 /* get{addr,name}info parameters */
3549#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003550 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003551#endif
3552#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003553 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003554#endif
3555#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003556 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003557#endif
3558#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003559 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003560#endif
3561#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003562 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003563#endif
3564#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003565 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003566#endif
3567#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003568 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003569#endif
3570#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003571 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003572#endif
3573#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003574 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003575#endif
3576#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003577 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003578#endif
3579#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003580 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003581#endif
3582#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003583 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003584#endif
3585#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003586 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003587#endif
3588#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003589 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003590#endif
3591#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003592 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003593#endif
3594#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003595 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003596#endif
3597#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003598 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003599#endif
3600#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003601 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003602#endif
3603#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003604 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003605#endif
3606#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003607 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003608#endif
3609#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003610 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003611#endif
3612#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003613 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003614#endif
3615#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003616 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003617#endif
3618#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003619 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003620#endif
3621#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003622 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003623#endif
3624#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003625 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003626#endif
3627#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003628 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003629#endif
3630#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003631 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003632#endif
3633#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003634 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003635#endif
3636#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003637 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003638#endif
3639
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003640 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003641#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003642 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003643#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003644}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003645
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003646
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003647#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003648
3649/* Simplistic emulation code for inet_pton that only works for IPv4 */
3650
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003651int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003652inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003653{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003654 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003655 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003656 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003657 if (packed_addr == INADDR_NONE)
3658 return 0;
3659 memcpy(dst, &packed_addr, 4);
3660 return 1;
3661 }
3662 /* Should set errno to EAFNOSUPPORT */
3663 return -1;
3664}
3665
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003666const char *
3667inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003668{
3669 if (af == AF_INET) {
3670 struct in_addr packed_addr;
3671 if (size < 16)
3672 /* Should set errno to ENOSPC. */
3673 return NULL;
3674 memcpy(&packed_addr, src, sizeof(packed_addr));
3675 return strncpy(dst, inet_ntoa(packed_addr), size);
3676 }
3677 /* Should set errno to EAFNOSUPPORT */
3678 return NULL;
3679}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003680
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003681#endif