blob: fd6ede0ea7826b5d4189f9d5b139f3b43aeb88ba [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 Rossum83a072d2002-09-03 19:10:18 +000022- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
23 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000024- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000025- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000027- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000028- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum83a072d2002-09-03 19:10:18 +000029- socket.socket([family[, type [, proto]]]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000030- socket.ntohs(16 bit value) --> new int object
31- socket.ntohl(32 bit value) --> new int object
32- socket.htons(16 bit value) --> new int object
33- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000034- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
35 --> List of (family, socktype, proto, canonname, sockaddr)
36- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000037- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000038- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000039- socket.inet_aton(IP address) -> 32-bit packed IP representation
40- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000041- socket.getdefaulttimeout() -> None | float
42- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000043- an Internet socket address is a pair (hostname, port)
44 where hostname can be anything recognized by gethostbyname()
45 (including the dd.dd.dd.dd notation) and port is in host byte order
46- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000047- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000048- an AF_PACKET socket address is a tuple containing a string
49 specifying the ethernet interface and an integer specifying
50 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000051 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
52 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000053 networking code, but accepted since they are returned by the
54 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000055
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000056Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000058- names starting with sock_ are socket object methods
59- names starting with socket_ are module-level functions
60- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000061
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062*/
63
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000064#include "Python.h"
65
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000066#undef MAX
67#define MAX(x, y) ((x) < (y) ? (y) : (x))
68
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000069/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000070PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000071"socket([family[, type[, proto]]]) -> socket object\n\
72\n\
73Open a socket of the given type. The family argument specifies the\n\
74address family; it defaults to AF_INET. The type argument specifies\n\
75whether this is a stream (SOCK_STREAM, this is the default)\n\
76or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
77specifying the default protocol. Keyword arguments are accepted.\n\
78\n\
79A socket object represents one endpoint of a network connection.\n\
80\n\
81Methods of socket objects (keyword arguments not allowed):\n\
82\n\
83accept() -- accept a connection, returning new socket and client address\n\
84bind(addr) -- bind the socket to a local address\n\
85close() -- close the socket\n\
86connect(addr) -- connect the socket to a remote address\n\
87connect_ex(addr) -- connect, return an error code instead of an exception\n\
88dup() -- return a new socket object identical to the current one [*]\n\
89fileno() -- return underlying file descriptor\n\
90getpeername() -- return remote address [*]\n\
91getsockname() -- return local address\n\
92getsockopt(level, optname[, buflen]) -- get socket options\n\
93gettimeout() -- return timeout or None\n\
94listen(n) -- start listening for incoming connections\n\
95makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
96recv(buflen[, flags]) -- receive data\n\
97recvfrom(buflen[, flags]) -- receive data and sender's address\n\
98sendall(data[, flags]) -- send all data\n\
99send(data[, flags]) -- send data, may not send all of it\n\
100sendto(data[, flags], addr) -- send data to a given address\n\
101setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
102setsockopt(level, optname, value) -- set socket options\n\
103settimeout(None | float) -- set or clear the timeout\n\
104shutdown(how) -- shut down traffic in one or both directions\n\
105\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000106 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000107
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000108/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
109 I hope some day someone can clean this up please... */
110
Guido van Rossum9376b741999-09-15 22:01:40 +0000111/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
112 script doesn't get this right, so we hardcode some platform checks below.
113 On the other hand, not all Linux versions agree, so there the settings
114 computed by the configure script are needed! */
115
116#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000117# undef HAVE_GETHOSTBYNAME_R_3_ARG
118# undef HAVE_GETHOSTBYNAME_R_5_ARG
119# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000120#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000121
Guido van Rossum7a122991999-04-13 04:07:32 +0000122#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000123# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000124#endif
125
Guido van Rossume7de2061999-03-24 17:24:33 +0000126#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000127# if defined(_AIX) || defined(__osf__)
128# define HAVE_GETHOSTBYNAME_R_3_ARG
129# elif defined(__sun) || defined(__sgi)
130# define HAVE_GETHOSTBYNAME_R_5_ARG
131# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000132/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000133# else
134# undef HAVE_GETHOSTBYNAME_R
135# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000136#endif
137
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000138#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
139 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000141#endif
142
143#ifdef USE_GETHOSTBYNAME_LOCK
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000144# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000145#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000146
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000147#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000148# include <types.h>
149# include <io.h>
150# include <sys/ioctl.h>
151# include <utils.h>
152# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000153#endif
154
Martin v. Löwis9e437302002-12-06 12:57:26 +0000155#if defined(__VMS)
156#if ! defined(_SOCKADDR_LEN)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000157# ifdef getaddrinfo
158# undef getaddrinfo
159# endif
160# include "TCPIP_IOCTL_ROUTINE"
161#else
162# include <ioctl.h>
163#endif
Martin v. Löwis9e437302002-12-06 12:57:26 +0000164#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000165
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000166#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# define INCL_DOS
168# define INCL_DOSERRORS
169# define INCL_NOPMAPI
170# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000171#endif
172
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000173#if defined(__sgi)&&_COMPILER_VERSION>700 && !_SGIAPI
174/* make sure that the reentrant (gethostbyaddr_r etc)
175 functions are declared correctly if compiling with
176 MIPSPro 7.x in ANSI C mode (default) */
177#define _SGIAPI 1
178#include "netdb.h"
179#endif
180
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000182#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000183#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000184
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000185/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000186#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000187#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000188
189/* Addressing includes */
190
Guido van Rossum6f489d91996-06-28 20:15:15 +0000191#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000192
193/* Non-MS WINDOWS includes */
194# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000195
Guido van Rossum9376b741999-09-15 22:01:40 +0000196/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000197# ifdef __BEOS__
198# include <net/netdb.h>
199# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
200# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000201typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000202# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000203# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000204# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000205
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000206# ifndef RISCOS
207# include <fcntl.h>
208# else
209# include <sys/fcntl.h>
210# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000211int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000212# endif
213
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000214#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000215
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000216/* MS_WINDOWS includes */
217# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000218
Jeremy Hylton22308652001-02-02 03:23:09 +0000219#endif
220
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000221#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000222# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000223#endif
224
225#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000227#endif
228
Neal Norwitz39d22e52002-11-02 19:55:21 +0000229#ifndef O_NONBLOCK
230# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000231#endif
232
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000233#include "addrinfo.h"
234
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000235#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000236int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000237const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000238#endif
239
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000240#ifdef __APPLE__
241/* On OS X, getaddrinfo returns no error indication of lookup
242 failure, so we must use the emulation instead of the libinfo
243 implementation. Unfortunately, performing an autoconf test
244 for this bug would require DNS access for the machine performing
245 the configuration, which is not acceptable. Therefore, we
246 determine the bug just by checking for __APPLE__. If this bug
247 gets ever fixed, perhaps checking for sys/version.h would be
248 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000249#ifndef HAVE_GETNAMEINFO
250/* This bug seems to be fixed in Jaguar. Ths easiest way I could
251 Find to check for Jaguar is that it has getnameinfo(), which
252 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000253#undef HAVE_GETADDRINFO
254/* avoid clashes with the C library definition of the symbol. */
255#define getaddrinfo fake_getaddrinfo
256#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000257#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000258
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000259/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000260#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000261#include "getaddrinfo.c"
262#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000263#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000264#include "getnameinfo.c"
265#endif
266
Guido van Rossumbcc20741998-08-04 22:53:56 +0000267#if defined(MS_WINDOWS) || defined(__BEOS__)
268/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000269/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000270#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000271#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000272#endif
273
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000274#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000275#define EAFNOSUPPORT WSAEAFNOSUPPORT
276#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000277#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000278
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000279#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000280#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000281#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000282#endif
283
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000284#ifndef SOCKETCLOSE
285#define SOCKETCLOSE close
286#endif
287
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000288#ifdef __VMS
289/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
290#define SEGMENT_SIZE 65535
291#endif
292
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000293/* XXX There's a problem here: *static* functions are not supposed to have
294 a Py prefix (or use CapitalizedWords). Later... */
295
Guido van Rossum30a685f1991-06-27 15:51:29 +0000296/* Global variable holding the exception type for errors detected
297 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000298static PyObject *socket_error;
299static PyObject *socket_herror;
300static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000301
Guido van Rossum48a680c2001-03-02 06:34:14 +0000302#ifdef RISCOS
303/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
304static int taskwindow;
305#endif
306
Tim Peters643a7fc2002-02-17 04:13:21 +0000307/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000308 The sock_type variable contains pointers to various functions,
309 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000310 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000311static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000312
Guido van Rossum30a685f1991-06-27 15:51:29 +0000313/* Convenience function to raise an error according to errno
314 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000315
Guido van Rossum73624e91994-10-10 17:59:00 +0000316static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000317set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000318{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000319#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000320 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000321 static struct {
322 int no;
323 const char *msg;
324 } *msgp, msgs[] = {
325 {WSAEINTR, "Interrupted system call"},
326 {WSAEBADF, "Bad file descriptor"},
327 {WSAEACCES, "Permission denied"},
328 {WSAEFAULT, "Bad address"},
329 {WSAEINVAL, "Invalid argument"},
330 {WSAEMFILE, "Too many open files"},
331 {WSAEWOULDBLOCK,
332 "The socket operation could not complete "
333 "without blocking"},
334 {WSAEINPROGRESS, "Operation now in progress"},
335 {WSAEALREADY, "Operation already in progress"},
336 {WSAENOTSOCK, "Socket operation on non-socket"},
337 {WSAEDESTADDRREQ, "Destination address required"},
338 {WSAEMSGSIZE, "Message too long"},
339 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
340 {WSAENOPROTOOPT, "Protocol not available"},
341 {WSAEPROTONOSUPPORT, "Protocol not supported"},
342 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
343 {WSAEOPNOTSUPP, "Operation not supported"},
344 {WSAEPFNOSUPPORT, "Protocol family not supported"},
345 {WSAEAFNOSUPPORT, "Address family not supported"},
346 {WSAEADDRINUSE, "Address already in use"},
347 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
348 {WSAENETDOWN, "Network is down"},
349 {WSAENETUNREACH, "Network is unreachable"},
350 {WSAENETRESET, "Network dropped connection on reset"},
351 {WSAECONNABORTED, "Software caused connection abort"},
352 {WSAECONNRESET, "Connection reset by peer"},
353 {WSAENOBUFS, "No buffer space available"},
354 {WSAEISCONN, "Socket is already connected"},
355 {WSAENOTCONN, "Socket is not connected"},
356 {WSAESHUTDOWN, "Can't send after socket shutdown"},
357 {WSAETOOMANYREFS, "Too many references: can't splice"},
358 {WSAETIMEDOUT, "Operation timed out"},
359 {WSAECONNREFUSED, "Connection refused"},
360 {WSAELOOP, "Too many levels of symbolic links"},
361 {WSAENAMETOOLONG, "File name too long"},
362 {WSAEHOSTDOWN, "Host is down"},
363 {WSAEHOSTUNREACH, "No route to host"},
364 {WSAENOTEMPTY, "Directory not empty"},
365 {WSAEPROCLIM, "Too many processes"},
366 {WSAEUSERS, "Too many users"},
367 {WSAEDQUOT, "Disc quota exceeded"},
368 {WSAESTALE, "Stale NFS file handle"},
369 {WSAEREMOTE, "Too many levels of remote in path"},
370 {WSASYSNOTREADY, "Network subsystem is unvailable"},
371 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
372 {WSANOTINITIALISED,
373 "Successful WSAStartup() not yet performed"},
374 {WSAEDISCON, "Graceful shutdown in progress"},
375 /* Resolver errors */
376 {WSAHOST_NOT_FOUND, "No such host is known"},
377 {WSATRY_AGAIN, "Host not found, or server failed"},
378 {WSANO_RECOVERY, "Unexpected server error encountered"},
379 {WSANO_DATA, "Valid name without requested data"},
380 {WSANO_ADDRESS, "No address, look for MX record"},
381 {0, NULL}
382 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000383 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000384 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000385 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000386
Mark Hammond46a733d2000-07-24 01:45:11 +0000387 for (msgp = msgs; msgp->msg; msgp++) {
388 if (err_no == msgp->no) {
389 msg = msgp->msg;
390 break;
391 }
392 }
393
394 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000395 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000396 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000397 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000398 }
399 return NULL;
400 }
401 else
402#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000403
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000404#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000405 if (sock_errno() != NO_ERROR) {
406 APIRET rc;
407 ULONG msglen;
408 char outbuf[100];
409 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000410
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000411 /* Retrieve socket-related error message from MPTN.MSG file */
412 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
413 myerrorcode - SOCBASEERR + 26,
414 "mptn.msg",
415 &msglen);
416 if (rc == NO_ERROR) {
417 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000418
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000419 /* OS/2 doesn't guarantee a terminator */
420 outbuf[msglen] = '\0';
421 if (strlen(outbuf) > 0) {
422 /* If non-empty msg, trim CRLF */
423 char *lastc = &outbuf[ strlen(outbuf)-1 ];
424 while (lastc > outbuf && isspace(*lastc)) {
425 /* Trim trailing whitespace (CRLF) */
426 *lastc-- = '\0';
427 }
428 }
429 v = Py_BuildValue("(is)", myerrorcode, outbuf);
430 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000431 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000432 Py_DECREF(v);
433 }
434 return NULL;
435 }
436 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000437#endif
438
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000439 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000440}
441
Guido van Rossum30a685f1991-06-27 15:51:29 +0000442
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000443static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000444set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000445{
446 PyObject *v;
447
448#ifdef HAVE_HSTRERROR
449 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
450#else
451 v = Py_BuildValue("(is)", h_error, "host not found");
452#endif
453 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000454 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000455 Py_DECREF(v);
456 }
457
458 return NULL;
459}
460
461
462static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000463set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000464{
465 PyObject *v;
466
Martin v. Löwis272cb402002-03-01 08:31:07 +0000467#ifdef EAI_SYSTEM
468 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000469 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000470 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000471#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000472
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000473#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000474 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000475#else
476 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
477#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000478 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000479 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000480 Py_DECREF(v);
481 }
482
483 return NULL;
484}
485
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000486/* Function to perform the setting of socket blocking mode
487 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000488static int
489internal_setblocking(PySocketSockObject *s, int block)
490{
491#ifndef RISCOS
492#ifndef MS_WINDOWS
493 int delay_flag;
494#endif
495#endif
496
497 Py_BEGIN_ALLOW_THREADS
498#ifdef __BEOS__
499 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000500 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
501 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000502#else
503#ifndef RISCOS
504#ifndef MS_WINDOWS
505#if defined(PYOS_OS2) && !defined(PYCC_GCC)
506 block = !block;
507 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000508#elif defined(__VMS)
509 block = !block;
510 ioctl(s->sock_fd, FIONBIO, (char *)&block);
511#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000512 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
513 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000514 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000515 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000516 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000517 fcntl(s->sock_fd, F_SETFL, delay_flag);
518#endif /* !PYOS_OS2 */
519#else /* MS_WINDOWS */
520 block = !block;
521 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
522#endif /* MS_WINDOWS */
523#endif /* __BEOS__ */
524#endif /* RISCOS */
525 Py_END_ALLOW_THREADS
526
527 /* Since these don't return anything */
528 return 1;
529}
530
Guido van Rossum11ba0942002-06-13 15:07:44 +0000531/* Do a select() on the socket, if necessary (sock_timeout > 0).
532 The argument writing indicates the direction.
533 This does not raise an exception or return a success indicator;
534 we'll let the actual socket call do that. */
535static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000536internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000537{
538 fd_set fds;
539 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000540
Guido van Rossumad654902002-07-19 12:44:59 +0000541 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000542 if (s->sock_timeout <= 0.0)
543 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000544
Guido van Rossumad654902002-07-19 12:44:59 +0000545 /* Guard against closed socket */
546 if (s->sock_fd < 0)
547 return;
548
Guido van Rossum67f7a382002-06-06 21:08:16 +0000549 /* Construct the arguments to select */
550 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000551 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000552 FD_ZERO(&fds);
553 FD_SET(s->sock_fd, &fds);
554
555 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000556 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000557 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000558 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000559 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000560}
561
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000562/* Initialize a new socket object. */
563
Tim Petersa12b4cf2002-07-18 22:38:44 +0000564static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000565
Mark Hammond62b1ab12002-07-23 06:31:15 +0000566PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000567init_sockobject(PySocketSockObject *s,
568 SOCKET_T fd, int family, int type, int proto)
569{
570#ifdef RISCOS
571 int block = 1;
572#endif
573 s->sock_fd = fd;
574 s->sock_family = family;
575 s->sock_type = type;
576 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000577 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000578
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000579 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000580
581 if (defaulttimeout >= 0.0)
582 internal_setblocking(s, 0);
583
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000584#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000585 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000586 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000587#endif
588}
589
590
Guido van Rossum30a685f1991-06-27 15:51:29 +0000591/* Create a new socket object.
592 This just creates the object and initializes it.
593 If the creation fails, return NULL and set an exception (implicit
594 in NEWOBJ()). */
595
Guido van Rossum73624e91994-10-10 17:59:00 +0000596static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000597new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000598{
Guido van Rossum73624e91994-10-10 17:59:00 +0000599 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000600 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000601 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000602 if (s != NULL)
603 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604 return s;
605}
606
Guido van Rossum30a685f1991-06-27 15:51:29 +0000607
Guido van Rossum48a680c2001-03-02 06:34:14 +0000608/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000609 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000610#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000611PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000612#endif
613
614
Guido van Rossum30a685f1991-06-27 15:51:29 +0000615/* Convert a string specifying a host name or one of a few symbolic
616 names to a numeric IP address. This usually calls gethostbyname()
617 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000619 an error occurred; then an exception is raised. */
620
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000621static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000622setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000623{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000624 struct addrinfo hints, *res;
625 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626
Guido van Rossuma376cc51996-12-05 23:43:35 +0000627 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000628 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000629 int siz;
630 memset(&hints, 0, sizeof(hints));
631 hints.ai_family = af;
632 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
633 hints.ai_flags = AI_PASSIVE;
634 error = getaddrinfo(NULL, "0", &hints, &res);
635 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000636 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000637 return -1;
638 }
639 switch (res->ai_family) {
640 case AF_INET:
641 siz = 4;
642 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000643#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000644 case AF_INET6:
645 siz = 16;
646 break;
647#endif
648 default:
649 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000650 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000651 "unsupported address family");
652 return -1;
653 }
654 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000655 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000656 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000657 "wildcard resolved to multiple address");
658 return -1;
659 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000660 if (res->ai_addrlen < addr_ret_size)
661 addr_ret_size = res->ai_addrlen;
662 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000663 freeaddrinfo(res);
664 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000665 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000666 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000667 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000668 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000669 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000670 "address family mismatched");
671 return -1;
672 }
673 sin = (struct sockaddr_in *)addr_ret;
674 memset((void *) sin, '\0', sizeof(*sin));
675 sin->sin_family = AF_INET;
676#ifdef HAVE_SOCKADDR_SA_LEN
677 sin->sin_len = sizeof(*sin);
678#endif
679 sin->sin_addr.s_addr = INADDR_BROADCAST;
680 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000681 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000682 memset(&hints, 0, sizeof(hints));
683 hints.ai_family = af;
684 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000685#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000686 if (error == EAI_NONAME && af == AF_UNSPEC) {
687 /* On Tru64 V5.1, numeric-to-addr conversion fails
688 if no address family is given. Assume IPv4 for now.*/
689 hints.ai_family = AF_INET;
690 error = getaddrinfo(name, NULL, &hints, &res);
691 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000692#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000693 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000694 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000695 return -1;
696 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000697 if (res->ai_addrlen < addr_ret_size)
698 addr_ret_size = res->ai_addrlen;
699 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000700 freeaddrinfo(res);
701 switch (addr_ret->sa_family) {
702 case AF_INET:
703 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000704#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000705 case AF_INET6:
706 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000707#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000708 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000709 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000710 return -1;
711 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000712}
713
Guido van Rossum30a685f1991-06-27 15:51:29 +0000714
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715/* Create a string object representing an IP address.
716 This is always a string of the form 'dd.dd.dd.dd' (with variable
717 size numbers). */
718
Guido van Rossum73624e91994-10-10 17:59:00 +0000719static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000720makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000721{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000722 char buf[NI_MAXHOST];
723 int error;
724
725 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
726 NI_NUMERICHOST);
727 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000728 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000729 return NULL;
730 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000731 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000732}
733
734
735/* Create an object representing the given socket address,
736 suitable for passing it back to bind(), connect() etc.
737 The family field of the sockaddr structure is inspected
738 to determine what kind of address it really is. */
739
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000740/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000741static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000742makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000743{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000744 if (addrlen == 0) {
745 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000746 Py_INCREF(Py_None);
747 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000748 }
749
Guido van Rossumbcc20741998-08-04 22:53:56 +0000750#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000751 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000752 addr->sa_family = AF_INET;
753#endif
754
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755 switch (addr->sa_family) {
756
757 case AF_INET:
758 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000759 struct sockaddr_in *a;
760 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000761 PyObject *ret = NULL;
762 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000763 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000764 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
765 Py_DECREF(addrobj);
766 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000767 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000768 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000769
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000770#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000771 case AF_UNIX:
772 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000773 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000774 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000776#endif /* AF_UNIX */
777
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000778#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000779 case AF_INET6:
780 {
781 struct sockaddr_in6 *a;
782 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
783 PyObject *ret = NULL;
784 if (addrobj) {
785 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000786 ret = Py_BuildValue("Oiii",
787 addrobj,
788 ntohs(a->sin6_port),
789 a->sin6_flowinfo,
790 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000791 Py_DECREF(addrobj);
792 }
793 return ret;
794 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000795#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000796
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000797#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000798 case AF_PACKET:
799 {
800 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
801 char *ifname = "";
802 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000803 /* need to look up interface name give index */
804 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000805 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000806 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000807 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000808 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000809 return Py_BuildValue("shbhs#",
810 ifname,
811 ntohs(a->sll_protocol),
812 a->sll_pkttype,
813 a->sll_hatype,
814 a->sll_addr,
815 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000816 }
817#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000818
Guido van Rossum30a685f1991-06-27 15:51:29 +0000819 /* More cases here... */
820
821 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000822 /* If we don't know the address family, don't raise an
823 exception -- return it as a tuple. */
824 return Py_BuildValue("is#",
825 addr->sa_family,
826 addr->sa_data,
827 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000828
Guido van Rossum30a685f1991-06-27 15:51:29 +0000829 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830}
831
Guido van Rossum30a685f1991-06-27 15:51:29 +0000832
833/* Parse a socket address argument according to the socket object's
834 address family. Return 1 if the address was in the proper format,
835 0 of not. The address is returned through addr_ret, its length
836 through len_ret. */
837
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000838static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000839getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000840 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000841{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000842 switch (s->sock_family) {
843
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000844#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845 case AF_UNIX:
846 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000847 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000848 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000850 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000851 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000853 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000854 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000855 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000856 return 0;
857 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000858 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000859 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000860 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000861 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000862 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000863 return 1;
864 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000865#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000866
Guido van Rossum30a685f1991-06-27 15:51:29 +0000867 case AF_INET:
868 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000869 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000870 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000871 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000872 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000873 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000874 PyErr_Format(
875 PyExc_TypeError,
876 "getsockaddrarg: "
877 "AF_INET address must be tuple, not %.500s",
878 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000879 return 0;
880 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000881 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
882 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000883 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000884 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000885 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000886 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000887 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000888 *addr_ret = (struct sockaddr *) addr;
889 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000890 return 1;
891 }
892
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000893#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000894 case AF_INET6:
895 {
896 struct sockaddr_in6* addr;
897 char *host;
898 int port, flowinfo, scope_id;
899 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
900 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +0000901 if (!PyArg_ParseTuple(args, "eti|ii",
902 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000903 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000904 return 0;
905 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000906 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000907 return 0;
908 addr->sin6_family = s->sock_family;
909 addr->sin6_port = htons((short)port);
910 addr->sin6_flowinfo = flowinfo;
911 addr->sin6_scope_id = scope_id;
912 *addr_ret = (struct sockaddr *) addr;
913 *len_ret = sizeof *addr;
914 return 1;
915 }
916#endif
917
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000918#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000919 case AF_PACKET:
920 {
921 struct sockaddr_ll* addr;
922 struct ifreq ifr;
923 char *interfaceName;
924 int protoNumber;
925 int hatype = 0;
926 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000927 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000928
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000929 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
930 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000931 return 0;
932 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
933 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000934 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000935 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000936 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000937 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000938 addr = &(s->sock_addr.ll);
939 addr->sll_family = AF_PACKET;
940 addr->sll_protocol = htons((short)protoNumber);
941 addr->sll_ifindex = ifr.ifr_ifindex;
942 addr->sll_pkttype = pkttype;
943 addr->sll_hatype = hatype;
944 *addr_ret = (struct sockaddr *) addr;
945 *len_ret = sizeof *addr;
946 return 1;
947 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000948#endif
949
Guido van Rossum30a685f1991-06-27 15:51:29 +0000950 /* More cases here... */
951
952 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000953 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000954 return 0;
955
956 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000957}
958
Guido van Rossum30a685f1991-06-27 15:51:29 +0000959
Guido van Rossum48a680c2001-03-02 06:34:14 +0000960/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000961 Return 1 if the family is known, 0 otherwise. The length is returned
962 through len_ret. */
963
964static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000965getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000966{
967 switch (s->sock_family) {
968
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000969#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000970 case AF_UNIX:
971 {
972 *len_ret = sizeof (struct sockaddr_un);
973 return 1;
974 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000975#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000976
977 case AF_INET:
978 {
979 *len_ret = sizeof (struct sockaddr_in);
980 return 1;
981 }
982
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000983#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000984 case AF_INET6:
985 {
986 *len_ret = sizeof (struct sockaddr_in6);
987 return 1;
988 }
989#endif
990
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000991#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000992 case AF_PACKET:
993 {
994 *len_ret = sizeof (struct sockaddr_ll);
995 return 1;
996 }
997#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000998
Guido van Rossum710e1df1992-06-12 10:39:36 +0000999 /* More cases here... */
1000
1001 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001002 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001003 return 0;
1004
1005 }
1006}
1007
1008
Guido van Rossum30a685f1991-06-27 15:51:29 +00001009/* s.accept() method */
1010
Guido van Rossum73624e91994-10-10 17:59:00 +00001011static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001012sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013{
1014 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001015 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001016 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001017 PyObject *sock = NULL;
1018 PyObject *addr = NULL;
1019 PyObject *res = NULL;
1020
Guido van Rossum710e1df1992-06-12 10:39:36 +00001021 if (!getsockaddrlen(s, &addrlen))
1022 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001023 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001024
Guido van Rossum73624e91994-10-10 17:59:00 +00001025 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001026 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001027 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001028 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001029
Fred Drakea04eaad2000-06-30 02:46:07 +00001030#ifdef MS_WINDOWS
1031 if (newfd == INVALID_SOCKET)
1032#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001033 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001034#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001035 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001036
Guido van Rossum30a685f1991-06-27 15:51:29 +00001037 /* Create the new object with unspecified family,
1038 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001039 sock = (PyObject *) new_sockobject(newfd,
1040 s->sock_family,
1041 s->sock_type,
1042 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001043
Barry Warsaw752300b1997-01-03 17:18:10 +00001044 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001045 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001046 goto finally;
1047 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001048 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001049 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001050 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001051 goto finally;
1052
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001053 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001054
Guido van Rossum67f7a382002-06-06 21:08:16 +00001055finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001056 Py_XDECREF(sock);
1057 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001058 return res;
1059}
1060
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001061PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001062"accept() -> (socket object, address info)\n\
1063\n\
1064Wait for an incoming connection. Return a new socket representing the\n\
1065connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001066info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001067
Guido van Rossum11ba0942002-06-13 15:07:44 +00001068/* s.setblocking(flag) method. Argument:
1069 False -- non-blocking mode; same as settimeout(0)
1070 True -- blocking mode; same as settimeout(None)
1071*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001072
Guido van Rossum73624e91994-10-10 17:59:00 +00001073static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001074sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001075{
1076 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001077
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001078 block = PyInt_AsLong(arg);
1079 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001080 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001081
Guido van Rossum11ba0942002-06-13 15:07:44 +00001082 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001083 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001084
Guido van Rossum73624e91994-10-10 17:59:00 +00001085 Py_INCREF(Py_None);
1086 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001087}
Guido van Rossume4485b01994-09-07 14:32:49 +00001088
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001089PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001090"setblocking(flag)\n\
1091\n\
1092Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001093setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001094setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001095
Guido van Rossum11ba0942002-06-13 15:07:44 +00001096/* s.settimeout(timeout) method. Argument:
1097 None -- no timeout, blocking mode; same as setblocking(True)
1098 0.0 -- non-blocking mode; same as setblocking(False)
1099 > 0 -- timeout mode; operations time out after timeout seconds
1100 < 0 -- illegal; raises an exception
1101*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001102static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001103sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001104{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001105 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001106
1107 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001108 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001109 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001110 timeout = PyFloat_AsDouble(arg);
1111 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001112 if (!PyErr_Occurred())
1113 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001114 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001115 return NULL;
1116 }
1117 }
1118
Guido van Rossum11ba0942002-06-13 15:07:44 +00001119 s->sock_timeout = timeout;
1120 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001121
1122 Py_INCREF(Py_None);
1123 return Py_None;
1124}
1125
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001126PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001127"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001128\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001129Set a timeout on socket operations. 'timeout' can be a float,\n\
1130giving in seconds, or None. Setting a timeout of None disables\n\
1131the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001132Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001133
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001134/* s.gettimeout() method.
1135 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001136static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001137sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001138{
1139 if (s->sock_timeout < 0.0) {
1140 Py_INCREF(Py_None);
1141 return Py_None;
1142 }
1143 else
1144 return PyFloat_FromDouble(s->sock_timeout);
1145}
1146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001147PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001148"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001149\n\
1150Returns the timeout in floating seconds associated with socket \n\
1151operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001152operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001153
Guido van Rossum48a680c2001-03-02 06:34:14 +00001154#ifdef RISCOS
1155/* s.sleeptaskw(1 | 0) method */
1156
1157static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001158sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001159{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001160 int block;
1161 int delay_flag;
1162 if (!PyArg_Parse(args, "i", &block))
1163 return NULL;
1164 Py_BEGIN_ALLOW_THREADS
1165 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1166 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001167
Guido van Rossum67f7a382002-06-06 21:08:16 +00001168 Py_INCREF(Py_None);
1169 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001170}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001171PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001172"sleeptaskw(flag)\n\
1173\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001174Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001175#endif
1176
1177
Guido van Rossumaee08791992-09-08 09:05:33 +00001178/* s.setsockopt() method.
1179 With an integer third argument, sets an integer option.
1180 With a string third argument, sets an option from a buffer;
1181 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001182
Guido van Rossum73624e91994-10-10 17:59:00 +00001183static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001184sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001185{
1186 int level;
1187 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001188 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001189 char *buf;
1190 int buflen;
1191 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001192
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001193 if (PyArg_ParseTuple(args, "iii:setsockopt",
1194 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001195 buf = (char *) &flag;
1196 buflen = sizeof flag;
1197 }
1198 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001199 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001200 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1201 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001202 return NULL;
1203 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001204 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001205 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001206 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001207 Py_INCREF(Py_None);
1208 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001209}
1210
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001211PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001212"setsockopt(level, option, value)\n\
1213\n\
1214Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001215The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001216
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001217
Guido van Rossumaee08791992-09-08 09:05:33 +00001218/* s.getsockopt() method.
1219 With two arguments, retrieves an integer option.
1220 With a third integer argument, retrieves a string buffer of that size;
1221 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001222
Guido van Rossum73624e91994-10-10 17:59:00 +00001223static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001224sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001225{
1226 int level;
1227 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001228 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001229 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001230 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001231
Guido van Rossumbcc20741998-08-04 22:53:56 +00001232#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001233 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001234 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001235 return NULL;
1236#else
1237
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001238 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1239 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001240 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001241
Guido van Rossumbe32c891996-06-20 16:25:29 +00001242 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001243 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001244 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001245 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001246 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001247 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001248 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001249 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001250 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001251#ifdef __VMS
1252 if (buflen > 1024) {
1253#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001254 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001255#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001256 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001257 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001258 return NULL;
1259 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001260 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001261 if (buf == NULL)
1262 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001263 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001264 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001265 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001266 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001267 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001268 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001269 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001270 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001271#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001272}
1273
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001274PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001275"getsockopt(level, option[, buffersize]) -> value\n\
1276\n\
1277Get a socket option. See the Unix manual for level and option.\n\
1278If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001279string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001280
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001281
Fred Drake728819a2000-07-01 03:40:12 +00001282/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001283
Guido van Rossum73624e91994-10-10 17:59:00 +00001284static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001285sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286{
1287 struct sockaddr *addr;
1288 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001289 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001290
Fred Drake728819a2000-07-01 03:40:12 +00001291 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001292 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001293 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001294 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001295 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001296 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001297 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001298 Py_INCREF(Py_None);
1299 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001300}
1301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001302PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001303"bind(address)\n\
1304\n\
1305Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001306pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001307sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001308
Guido van Rossum30a685f1991-06-27 15:51:29 +00001309
1310/* s.close() method.
1311 Set the file descriptor to -1 so operations tried subsequently
1312 will surely fail. */
1313
Guido van Rossum73624e91994-10-10 17:59:00 +00001314static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001315sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001316{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001317 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001318
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001319 if ((fd = s->sock_fd) != -1) {
1320 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001321 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001322 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001323 Py_END_ALLOW_THREADS
1324 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001325 Py_INCREF(Py_None);
1326 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001327}
1328
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001329PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001330"close()\n\
1331\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001332Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001333
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001334static int
1335internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1336{
1337 int res;
1338
1339 res = connect(s->sock_fd, addr, addrlen);
1340
1341#ifdef MS_WINDOWS
1342
1343 if (s->sock_timeout > 0.0) {
1344 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001345 /* This is a mess. Best solution: trust select */
1346 fd_set fds;
1347 struct timeval tv;
1348 tv.tv_sec = (int)s->sock_timeout;
1349 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1350 FD_ZERO(&fds);
1351 FD_SET(s->sock_fd, &fds);
1352 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1353 if (res == 0)
1354 res = WSAEWOULDBLOCK;
1355 else if (res > 0)
1356 res = 0;
1357 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001358 }
1359 }
1360
1361 if (res < 0)
1362 res = WSAGetLastError();
1363
1364#else
1365
1366 if (s->sock_timeout > 0.0) {
1367 if (res < 0 && errno == EINPROGRESS) {
1368 internal_select(s, 1);
1369 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001370 if (res < 0 && errno == EISCONN)
1371 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001372 }
1373 }
1374
1375 if (res < 0)
1376 res = errno;
1377
1378#endif
1379
1380 return res;
1381}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001382
Fred Drake728819a2000-07-01 03:40:12 +00001383/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001384
Guido van Rossum73624e91994-10-10 17:59:00 +00001385static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001386sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001387{
1388 struct sockaddr *addr;
1389 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001390 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001391
Fred Drake728819a2000-07-01 03:40:12 +00001392 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001394
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001396 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001397 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001398
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001399 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001400 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001401 Py_INCREF(Py_None);
1402 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001403}
1404
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001405PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001406"connect(address)\n\
1407\n\
1408Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001409is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001410
Guido van Rossum30a685f1991-06-27 15:51:29 +00001411
Fred Drake728819a2000-07-01 03:40:12 +00001412/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001413
1414static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001415sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001416{
1417 struct sockaddr *addr;
1418 int addrlen;
1419 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001420
Fred Drake728819a2000-07-01 03:40:12 +00001421 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001422 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001423
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001424 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001425 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001426 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001427
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001428 return PyInt_FromLong((long) res);
1429}
1430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001431PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001432"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001433\n\
1434This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001435instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001436
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001437
Guido van Rossumed233a51992-06-23 09:07:03 +00001438/* s.fileno() method */
1439
Guido van Rossum73624e91994-10-10 17:59:00 +00001440static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001441sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001442{
Fred Drakea04eaad2000-06-30 02:46:07 +00001443#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001444 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001445#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001446 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001447#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001448}
1449
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001450PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001451"fileno() -> integer\n\
1452\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001453Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001454
Guido van Rossumed233a51992-06-23 09:07:03 +00001455
Guido van Rossumbe32c891996-06-20 16:25:29 +00001456#ifndef NO_DUP
1457/* s.dup() method */
1458
1459static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001460sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001461{
Fred Drakea04eaad2000-06-30 02:46:07 +00001462 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001463 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001464
Guido van Rossumbe32c891996-06-20 16:25:29 +00001465 newfd = dup(s->sock_fd);
1466 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001467 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001468 sock = (PyObject *) new_sockobject(newfd,
1469 s->sock_family,
1470 s->sock_type,
1471 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001472 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001473 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001474 return sock;
1475}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001476
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001477PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001478"dup() -> socket object\n\
1479\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001480Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001481
Guido van Rossumbe32c891996-06-20 16:25:29 +00001482#endif
1483
1484
Guido van Rossumc89705d1992-11-26 08:54:07 +00001485/* s.getsockname() method */
1486
Guido van Rossum73624e91994-10-10 17:59:00 +00001487static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001488sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001489{
1490 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001491 int res;
1492 socklen_t addrlen;
1493
Guido van Rossumc89705d1992-11-26 08:54:07 +00001494 if (!getsockaddrlen(s, &addrlen))
1495 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001496 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001497 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001498 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001499 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001500 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001501 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001502 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001503}
1504
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001505PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001506"getsockname() -> address info\n\
1507\n\
1508Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001509info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001510
Guido van Rossumc89705d1992-11-26 08:54:07 +00001511
Guido van Rossumb6775db1994-08-01 11:34:53 +00001512#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001513/* s.getpeername() method */
1514
Guido van Rossum73624e91994-10-10 17:59:00 +00001515static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001516sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001517{
1518 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001519 int res;
1520 socklen_t addrlen;
1521
Guido van Rossumc89705d1992-11-26 08:54:07 +00001522 if (!getsockaddrlen(s, &addrlen))
1523 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001524 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001525 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001526 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001527 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001528 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001529 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001530 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001531}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001533PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001534"getpeername() -> address info\n\
1535\n\
1536Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001537info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001538
Guido van Rossumb6775db1994-08-01 11:34:53 +00001539#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001540
1541
Guido van Rossum30a685f1991-06-27 15:51:29 +00001542/* s.listen(n) method */
1543
Guido van Rossum73624e91994-10-10 17:59:00 +00001544static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001545sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001546{
1547 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001548 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001549
1550 backlog = PyInt_AsLong(arg);
1551 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001552 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001553 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001554 if (backlog < 1)
1555 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001556 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001557 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001558 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001559 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001560 Py_INCREF(Py_None);
1561 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001562}
1563
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001564PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001565"listen(backlog)\n\
1566\n\
1567Enable a server to accept connections. The backlog argument must be at\n\
1568least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001569will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001570
1571
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001572#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001573/* s.makefile(mode) method.
1574 Create a new open file object referring to a dupped version of
1575 the socket's file descriptor. (The dup() call is necessary so
1576 that the open file and socket objects may be closed independent
1577 of each other.)
1578 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1579
Guido van Rossum73624e91994-10-10 17:59:00 +00001580static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001581sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001582{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001583 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001584 char *mode = "r";
1585 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001586#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001587 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001588#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001589 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001590#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001591 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001592 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001593#ifdef __VMS
1594 char *mode_r = "r";
1595 char *mode_w = "w";
1596#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001597
Guido van Rossum43713e52000-02-29 13:59:29 +00001598 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001599 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001600#ifdef __VMS
1601 if (strcmp(mode,"rb") == 0) {
1602 mode = mode_r;
1603 }
1604 else {
1605 if (strcmp(mode,"wb") == 0) {
1606 mode = mode_w;
1607 }
1608 }
1609#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001610#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001611 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1612 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001613#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001614 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001615#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001616 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001617 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001618 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001619 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001620 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001621#ifdef USE_GUSI2
1622 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001623 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001624 bufsize = 0;
1625#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001626 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1627 if (f != NULL)
1628 PyFile_SetBufSize(f, bufsize);
1629 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001630}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001631
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001632PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001633"makefile([mode[, buffersize]]) -> file object\n\
1634\n\
1635Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001636The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001637
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001638#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001639
Guido van Rossum48a680c2001-03-02 06:34:14 +00001640
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001641/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001642
Guido van Rossum73624e91994-10-10 17:59:00 +00001643static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001644sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001645{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001646 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001647 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001648#ifdef __VMS
1649 int read_length;
1650 char *read_buf;
1651#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001652
Guido van Rossum43713e52000-02-29 13:59:29 +00001653 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001654 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001655
1656 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001657 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001658 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001659 return NULL;
1660 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001661
Guido van Rossum73624e91994-10-10 17:59:00 +00001662 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001663 if (buf == NULL)
1664 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001665
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001666#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001667 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001668 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001669 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001670 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001671
Guido van Rossum7c53b771995-09-13 18:39:47 +00001672 if (n < 0) {
1673 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001674 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001675 }
Tim Peters5de98422002-04-27 18:44:32 +00001676 if (n != len)
1677 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001678#else
1679 read_buf = PyString_AsString(buf);
1680 read_length = len;
1681 while (read_length != 0) {
1682 unsigned int segment;
1683
1684 segment = read_length /SEGMENT_SIZE;
1685 if (segment != 0) {
1686 segment = SEGMENT_SIZE;
1687 }
1688 else {
1689 segment = read_length;
1690 }
1691
1692 Py_BEGIN_ALLOW_THREADS
1693 internal_select(s, 0);
1694 n = recv(s->sock_fd, read_buf, segment, flags);
1695 Py_END_ALLOW_THREADS
1696
1697 if (n < 0) {
1698 Py_DECREF(buf);
1699 return s->errorhandler();
1700 }
1701 if (n != read_length) {
1702 read_buf += n;
1703 break;
1704 }
1705
1706 read_length -= segment;
1707 read_buf += segment;
1708 }
1709 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1710 {
1711 return NULL;
1712 }
1713#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001714 return buf;
1715}
1716
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001717PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001718"recv(buffersize[, flags]) -> data\n\
1719\n\
1720Receive up to buffersize bytes from the socket. For the optional flags\n\
1721argument, see the Unix manual. When no data is available, block until\n\
1722at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001723the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001724
Guido van Rossum30a685f1991-06-27 15:51:29 +00001725
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001726/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001727
Guido van Rossum73624e91994-10-10 17:59:00 +00001728static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001729sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001730{
1731 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001732 PyObject *buf = NULL;
1733 PyObject *addr = NULL;
1734 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001735 int len, n, flags = 0;
1736 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001737
Guido van Rossum43713e52000-02-29 13:59:29 +00001738 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001739 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001740
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001741 if (!getsockaddrlen(s, &addrlen))
1742 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001743 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001744 if (buf == NULL)
1745 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001746
Guido van Rossum73624e91994-10-10 17:59:00 +00001747 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001748 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001749 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001750 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001751#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001752#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001753 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001754#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001755 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001756#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001757#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001758 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001759#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001760 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001761 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001762
Guido van Rossum7c53b771995-09-13 18:39:47 +00001763 if (n < 0) {
1764 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001765 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001766 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001767
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001768 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001769 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001770
Guido van Rossum67f7a382002-06-06 21:08:16 +00001771 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001772 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001773 goto finally;
1774
Guido van Rossum73624e91994-10-10 17:59:00 +00001775 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001776
1777finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001778 Py_XDECREF(addr);
1779 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001780 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001781}
1782
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001783PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001784"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1785\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001786Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001787
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001788/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001789
Guido van Rossum73624e91994-10-10 17:59:00 +00001790static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001791sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001792{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001793 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001794 int len, n, flags = 0;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001795#ifdef __VMS
1796 int send_length;
1797#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001798
Guido van Rossum43713e52000-02-29 13:59:29 +00001799 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001800 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001801
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001802#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001803 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001804 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001805 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001806 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001807
Guido van Rossum30a685f1991-06-27 15:51:29 +00001808 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001809 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001810#else
1811 /* Divide packet into smaller segments for */
1812 /* TCP/IP Services for OpenVMS */
1813 send_length = len;
1814 while (send_length != 0) {
1815 unsigned int segment;
1816
1817 segment = send_length / SEGMENT_SIZE;
1818 if (segment != 0) {
1819 segment = SEGMENT_SIZE;
1820 }
1821 else {
1822 segment = send_length;
1823 }
1824 Py_BEGIN_ALLOW_THREADS
1825 internal_select(s, 1);
1826 n = send(s->sock_fd, buf, segment, flags);
1827 Py_END_ALLOW_THREADS
1828 if (n < 0) {
1829 return s->errorhandler();
1830 }
1831 send_length -= segment;
1832 buf += segment;
1833 } /* end while */
1834#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001835 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001836}
1837
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001838PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001839"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001840\n\
1841Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001842argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001843sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001844
1845
1846/* s.sendall(data [,flags]) method */
1847
1848static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001849sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001850{
1851 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001852 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001853
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001854 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1855 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001856
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001857 Py_BEGIN_ALLOW_THREADS
1858 do {
Guido van Rossum8f24cdc2003-01-31 18:15:58 +00001859 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001860 n = send(s->sock_fd, buf, len, flags);
1861 if (n < 0)
1862 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001863 buf += n;
1864 len -= n;
1865 } while (len > 0);
1866 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001867
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001868 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001869 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001870
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001871 Py_INCREF(Py_None);
1872 return Py_None;
1873}
1874
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001875PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001876"sendall(data[, flags])\n\
1877\n\
1878Send a data string to the socket. For the optional flags\n\
1879argument, see the Unix manual. This calls send() repeatedly\n\
1880until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001881to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001882
Guido van Rossum30a685f1991-06-27 15:51:29 +00001883
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001884/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001885
Guido van Rossum73624e91994-10-10 17:59:00 +00001886static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001887sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001888{
Guido van Rossum73624e91994-10-10 17:59:00 +00001889 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001890 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001891 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001892 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001893
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001894 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001895 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001896 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001897 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1898 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001899 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001900 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001901
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001902 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001903 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001904
Guido van Rossum73624e91994-10-10 17:59:00 +00001905 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001906 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001907 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001908 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001909
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001910 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001911 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001912 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001913}
1914
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001915PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001916"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001917\n\
1918Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001919For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001920
Guido van Rossum30a685f1991-06-27 15:51:29 +00001921
1922/* s.shutdown(how) method */
1923
Guido van Rossum73624e91994-10-10 17:59:00 +00001924static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001925sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001926{
1927 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001928 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001929
1930 how = PyInt_AsLong(arg);
1931 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001932 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001933 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001934 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001935 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001936 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001937 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001938 Py_INCREF(Py_None);
1939 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001940}
1941
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001942PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001943"shutdown(flag)\n\
1944\n\
1945Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001946of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001947
Guido van Rossum30a685f1991-06-27 15:51:29 +00001948
1949/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001950
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001951static PyMethodDef sock_methods[] = {
1952 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001953 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001954 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001955 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001956 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001957 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001958 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001959 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001960 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001961 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001962#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001963 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001964 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001965#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001966 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001967 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001968#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001969 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001970 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001971#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001972 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001973 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001974 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001975 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001976 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001977 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001978#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001979 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001980 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001981#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001982 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001983 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001984 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001985 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001986 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001987 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001988 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001989 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001990 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001991 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001992 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001993 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001994 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001995 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001996 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001997 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001998 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001999 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002000 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002001 shutdown_doc},
2002#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002003 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002004 sleeptaskw_doc},
2005#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002006 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002007};
2008
Guido van Rossum30a685f1991-06-27 15:51:29 +00002009
Guido van Rossum73624e91994-10-10 17:59:00 +00002010/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002011 First close the file description. */
2012
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002013static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002014sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002015{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002016 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002017 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002018 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002019}
2020
Guido van Rossum30a685f1991-06-27 15:51:29 +00002021
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002022static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002023sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002024{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002025 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002026#if SIZEOF_SOCKET_T > SIZEOF_LONG
2027 if (s->sock_fd > LONG_MAX) {
2028 /* this can occur on Win64, and actually there is a special
2029 ugly printf formatter for decimal pointer length integer
2030 printing, only bother if necessary*/
2031 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002032 "no printf formatter to display "
2033 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002034 return NULL;
2035 }
2036#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002037 PyOS_snprintf(
2038 buf, sizeof(buf),
2039 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2040 (long)s->sock_fd, s->sock_family,
2041 s->sock_type,
2042 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002043 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002044}
2045
2046
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002047/* Create a new, uninitialized socket object. */
2048
2049static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002050sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002051{
2052 PyObject *new;
2053
2054 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002055 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002056 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002057 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002058 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002059 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002060 return new;
2061}
2062
2063
2064/* Initialize a new socket object. */
2065
2066/*ARGSUSED*/
2067static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002068sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002069{
2070 PySocketSockObject *s = (PySocketSockObject *)self;
2071 SOCKET_T fd;
2072 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2073 static char *keywords[] = {"family", "type", "proto", 0};
2074
2075 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2076 "|iii:socket", keywords,
2077 &family, &type, &proto))
2078 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002079
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002080 Py_BEGIN_ALLOW_THREADS
2081 fd = socket(family, type, proto);
2082 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002083
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002084#ifdef MS_WINDOWS
2085 if (fd == INVALID_SOCKET)
2086#else
2087 if (fd < 0)
2088#endif
2089 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002090 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002091 return -1;
2092 }
2093 init_sockobject(s, fd, family, type, proto);
2094 /* From now on, ignore SIGPIPE and let the error checking
2095 do the work. */
2096#ifdef SIGPIPE
2097 (void) signal(SIGPIPE, SIG_IGN);
2098#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002099
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002100 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002101
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002102}
2103
2104
Guido van Rossumb6775db1994-08-01 11:34:53 +00002105/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002106
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002107static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002108 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002109 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002110 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002111 sizeof(PySocketSockObject), /* tp_basicsize */
2112 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002113 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002114 0, /* tp_print */
2115 0, /* tp_getattr */
2116 0, /* tp_setattr */
2117 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002118 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002119 0, /* tp_as_number */
2120 0, /* tp_as_sequence */
2121 0, /* tp_as_mapping */
2122 0, /* tp_hash */
2123 0, /* tp_call */
2124 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002125 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002126 0, /* tp_setattro */
2127 0, /* tp_as_buffer */
2128 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002129 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002130 0, /* tp_traverse */
2131 0, /* tp_clear */
2132 0, /* tp_richcompare */
2133 0, /* tp_weaklistoffset */
2134 0, /* tp_iter */
2135 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002136 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002137 0, /* tp_members */
2138 0, /* tp_getset */
2139 0, /* tp_base */
2140 0, /* tp_dict */
2141 0, /* tp_descr_get */
2142 0, /* tp_descr_set */
2143 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002144 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002145 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002146 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002147 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002148};
2149
Guido van Rossum30a685f1991-06-27 15:51:29 +00002150
Guido van Rossum81194471991-07-27 21:42:02 +00002151/* Python interface to gethostname(). */
2152
2153/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002154static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002155socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002156{
2157 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002158 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002159 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002160 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002161 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002162 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002163 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002164 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002165 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002166 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002167 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002168}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002169
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002170PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002171"gethostname() -> string\n\
2172\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002173Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002174
Guido van Rossumff4949e1992-08-05 19:58:53 +00002175
Guido van Rossum30a685f1991-06-27 15:51:29 +00002176/* Python interface to gethostbyname(name). */
2177
2178/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002179static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002180socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002181{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002182 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002183 struct sockaddr_storage addrbuf;
2184
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002185 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002186 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002187 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002188 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002189 return makeipaddr((struct sockaddr *)&addrbuf,
2190 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002191}
2192
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002193PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002194"gethostbyname(host) -> address\n\
2195\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002196Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002197
2198
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002199/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2200
2201static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002202gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002203{
2204 char **pch;
2205 PyObject *rtn_tuple = (PyObject *)NULL;
2206 PyObject *name_list = (PyObject *)NULL;
2207 PyObject *addr_list = (PyObject *)NULL;
2208 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002209
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002210 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002211 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002212#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002213 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002214#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002215 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002216#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002217 return NULL;
2218 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002219
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002220 if (h->h_addrtype != af) {
2221#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002222 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002223 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002224 (char *)strerror(EAFNOSUPPORT));
2225#else
2226 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002227 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002228 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002229#endif
2230 return NULL;
2231 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002232
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002233 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002234
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002235 case AF_INET:
2236 if (alen < sizeof(struct sockaddr_in))
2237 return NULL;
2238 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002239
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002240#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002241 case AF_INET6:
2242 if (alen < sizeof(struct sockaddr_in6))
2243 return NULL;
2244 break;
2245#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002246
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002247 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002248
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002249 if ((name_list = PyList_New(0)) == NULL)
2250 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002251
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002252 if ((addr_list = PyList_New(0)) == NULL)
2253 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002254
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002255 for (pch = h->h_aliases; *pch != NULL; pch++) {
2256 int status;
2257 tmp = PyString_FromString(*pch);
2258 if (tmp == NULL)
2259 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002260
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002261 status = PyList_Append(name_list, tmp);
2262 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002263
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002264 if (status)
2265 goto err;
2266 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002267
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002268 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2269 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002270
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002271 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002272
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002273 case AF_INET:
2274 {
2275 struct sockaddr_in sin;
2276 memset(&sin, 0, sizeof(sin));
2277 sin.sin_family = af;
2278#ifdef HAVE_SOCKADDR_SA_LEN
2279 sin.sin_len = sizeof(sin);
2280#endif
2281 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2282 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002283
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002284 if (pch == h->h_addr_list && alen >= sizeof(sin))
2285 memcpy((char *) addr, &sin, sizeof(sin));
2286 break;
2287 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002288
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002289#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002290 case AF_INET6:
2291 {
2292 struct sockaddr_in6 sin6;
2293 memset(&sin6, 0, sizeof(sin6));
2294 sin6.sin6_family = af;
2295#ifdef HAVE_SOCKADDR_SA_LEN
2296 sin6.sin6_len = sizeof(sin6);
2297#endif
2298 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2299 tmp = makeipaddr((struct sockaddr *)&sin6,
2300 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002301
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002302 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2303 memcpy((char *) addr, &sin6, sizeof(sin6));
2304 break;
2305 }
2306#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002307
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002308 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002309 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002310 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002311 return NULL;
2312 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002313
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002314 if (tmp == NULL)
2315 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002316
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002317 status = PyList_Append(addr_list, tmp);
2318 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002319
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002320 if (status)
2321 goto err;
2322 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002323
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002324 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002325
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002326 err:
2327 Py_XDECREF(name_list);
2328 Py_XDECREF(addr_list);
2329 return rtn_tuple;
2330}
2331
2332
2333/* Python interface to gethostbyname_ex(name). */
2334
2335/*ARGSUSED*/
2336static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002337socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002338{
2339 char *name;
2340 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002341 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002342 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002343 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002344#ifdef HAVE_GETHOSTBYNAME_R
2345 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002346#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2347 struct hostent_data data;
2348#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002349 char buf[16384];
2350 int buf_len = (sizeof buf) - 1;
2351 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002352#endif
2353#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002354 int result;
2355#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002356#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002357
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002358 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002359 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002360 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002361 return NULL;
2362 Py_BEGIN_ALLOW_THREADS
2363#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002364#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002365 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2366 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002367#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002368 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002369#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002370 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002371 result = gethostbyname_r(name, &hp_allocated, &data);
2372 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002373#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002374#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002375#ifdef USE_GETHOSTBYNAME_LOCK
2376 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002377#endif
2378 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002379#endif /* HAVE_GETHOSTBYNAME_R */
2380 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002381 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002382 addr.ss_family.
2383 Therefore, we cast the sockaddr_storage into sockaddr to
2384 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002385 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002386 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002387 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002388#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002389 PyThread_release_lock(gethostbyname_lock);
2390#endif
2391 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002392}
2393
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002394PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002395"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2396\n\
2397Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002398for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002399
2400
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002401/* Python interface to gethostbyaddr(IP). */
2402
2403/*ARGSUSED*/
2404static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002405socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002406{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002407#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002408 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002409#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002410 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002411#endif
2412 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002413 char *ip_num;
2414 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002415 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002416#ifdef HAVE_GETHOSTBYNAME_R
2417 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002418#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2419 struct hostent_data data;
2420#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002421 char buf[16384];
2422 int buf_len = (sizeof buf) - 1;
2423 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002424#endif
2425#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002426 int result;
2427#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002428#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002429 char *ap;
2430 int al;
2431 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002432
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002433 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002434 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002435 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002436 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002437 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002438 af = sa->sa_family;
2439 ap = NULL;
2440 al = 0;
2441 switch (af) {
2442 case AF_INET:
2443 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2444 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2445 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002446#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002447 case AF_INET6:
2448 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2449 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2450 break;
2451#endif
2452 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002453 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002454 return NULL;
2455 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002456 Py_BEGIN_ALLOW_THREADS
2457#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002458#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002459 result = gethostbyaddr_r(ap, al, af,
2460 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002461 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002462#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002463 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002464 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002465#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002466 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002467 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002468 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002469#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002470#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002471#ifdef USE_GETHOSTBYNAME_LOCK
2472 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002473#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002474 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002475#endif /* HAVE_GETHOSTBYNAME_R */
2476 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002477 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002478#ifdef USE_GETHOSTBYNAME_LOCK
2479 PyThread_release_lock(gethostbyname_lock);
2480#endif
2481 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002482}
2483
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002484PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002485"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2486\n\
2487Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002488for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002489
Guido van Rossum30a685f1991-06-27 15:51:29 +00002490
2491/* Python interface to getservbyname(name).
2492 This only returns the port number, since the other info is already
2493 known or not useful (like the list of aliases). */
2494
2495/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002496static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002497socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002498{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002499 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002500 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002501 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002502 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002503 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002504 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002505 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002506 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002507 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002508 return NULL;
2509 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002510 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002511}
2512
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002513PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002514"getservbyname(servicename, protocolname) -> integer\n\
2515\n\
2516Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002517The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002518
Guido van Rossum30a685f1991-06-27 15:51:29 +00002519
Guido van Rossum3901d851996-12-19 16:35:04 +00002520/* Python interface to getprotobyname(name).
2521 This only returns the protocol number, since the other info is
2522 already known or not useful (like the list of aliases). */
2523
2524/*ARGSUSED*/
2525static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002526socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002527{
2528 char *name;
2529 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002530#ifdef __BEOS__
2531/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002532 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002533 return NULL;
2534#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002535 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002536 return NULL;
2537 Py_BEGIN_ALLOW_THREADS
2538 sp = getprotobyname(name);
2539 Py_END_ALLOW_THREADS
2540 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002541 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002542 return NULL;
2543 }
2544 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002545#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002546}
2547
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002548PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002549"getprotobyname(name) -> integer\n\
2550\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002551Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002552
Guido van Rossum3901d851996-12-19 16:35:04 +00002553
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002554#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002555/* Create a socket object from a numeric file description.
2556 Useful e.g. if stdin is a socket.
2557 Additional arguments as for socket(). */
2558
2559/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002560static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002561socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002562{
Guido van Rossum73624e91994-10-10 17:59:00 +00002563 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002564 SOCKET_T fd;
2565 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002566 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2567 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002568 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002569 /* Dup the fd so it and the socket can be closed independently */
2570 fd = dup(fd);
2571 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002572 return set_error();
2573 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002574 /* From now on, ignore SIGPIPE and let the error checking
2575 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002576#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002577 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002578#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002579 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002580}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002581
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002582PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002583"fromfd(fd, family, type[, proto]) -> socket object\n\
2584\n\
2585Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002586The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002587
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002588#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002589
Guido van Rossum82a5c661998-07-07 20:45:43 +00002590
Guido van Rossum006bf911996-06-12 04:04:55 +00002591static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002592socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002593{
2594 int x1, x2;
2595
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002596 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002597 return NULL;
2598 }
2599 x2 = (int)ntohs((short)x1);
2600 return PyInt_FromLong(x2);
2601}
2602
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002603PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002604"ntohs(integer) -> integer\n\
2605\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002606Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002607
2608
Guido van Rossum006bf911996-06-12 04:04:55 +00002609static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002610socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002611{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002612 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002613
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002614 if (PyInt_Check(arg)) {
2615 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002616 if (x == (unsigned long) -1 && PyErr_Occurred())
2617 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002618 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002619 else if (PyLong_Check(arg)) {
2620 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002621 if (x == (unsigned long) -1 && PyErr_Occurred())
2622 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002623#if SIZEOF_LONG > 4
2624 {
2625 unsigned long y;
2626 /* only want the trailing 32 bits */
2627 y = x & 0xFFFFFFFFUL;
2628 if (y ^ x)
2629 return PyErr_Format(PyExc_OverflowError,
2630 "long int larger than 32 bits");
2631 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002632 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002633#endif
2634 }
2635 else
Tim Peters58141872002-08-06 22:25:02 +00002636 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002637 "expected int/long, %s found",
2638 arg->ob_type->tp_name);
2639 if (x == (unsigned long) -1 && PyErr_Occurred())
2640 return NULL;
2641 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002642}
2643
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002644PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002645"ntohl(integer) -> integer\n\
2646\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002647Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002648
2649
Guido van Rossum006bf911996-06-12 04:04:55 +00002650static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002651socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002652{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002653 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002654
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002655 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002656 return NULL;
2657 }
2658 x2 = (int)htons((short)x1);
2659 return PyInt_FromLong(x2);
2660}
2661
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002662PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002663"htons(integer) -> integer\n\
2664\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002665Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002666
2667
Guido van Rossum006bf911996-06-12 04:04:55 +00002668static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002669socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002670{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002671 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002672
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002673 if (PyInt_Check(arg)) {
2674 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002675 if (x == (unsigned long) -1 && PyErr_Occurred())
2676 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002677 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002678 else if (PyLong_Check(arg)) {
2679 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002680 if (x == (unsigned long) -1 && PyErr_Occurred())
2681 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002682#if SIZEOF_LONG > 4
2683 {
2684 unsigned long y;
2685 /* only want the trailing 32 bits */
2686 y = x & 0xFFFFFFFFUL;
2687 if (y ^ x)
2688 return PyErr_Format(PyExc_OverflowError,
2689 "long int larger than 32 bits");
2690 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002691 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002692#endif
2693 }
2694 else
Tim Peters58141872002-08-06 22:25:02 +00002695 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002696 "expected int/long, %s found",
2697 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002698 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002699}
2700
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002701PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002702"htonl(integer) -> integer\n\
2703\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002704Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002705
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002706/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002707
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002708PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002709"inet_aton(string) -> packed 32-bit IP representation\n\
2710\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002711Convert 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 +00002712binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002713
2714static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002715socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002716{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002717#ifndef INADDR_NONE
2718#define INADDR_NONE (-1)
2719#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002720#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002721 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002722#else
2723 /* Have to use inet_addr() instead */
2724 unsigned long packed_addr;
2725#endif
2726 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002727
Tim Peters1df9fdd2003-02-13 03:13:40 +00002728 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002729 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002730
Tim Peters1df9fdd2003-02-13 03:13:40 +00002731
2732#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002733 if (inet_aton(ip_addr, &buf))
2734 return PyString_FromStringAndSize((char *)(&buf),
2735 sizeof(buf));
2736
2737 PyErr_SetString(socket_error,
2738 "illegal IP address string passed to inet_aton");
2739 return NULL;
2740
Tim Peters1df9fdd2003-02-13 03:13:40 +00002741#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002742 /* XXX Problem here: inet_aton('255.255.255.255') raises
2743 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002744 packed_addr = inet_addr(ip_addr);
2745
2746 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002747 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002748 "illegal IP address string passed to inet_aton");
2749 return NULL;
2750 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002751 return PyString_FromStringAndSize((char *) &packed_addr,
2752 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002753#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002754}
2755
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002756PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002757"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002758\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002759Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002760
2761static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002762socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002763{
2764 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002765 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002766 struct in_addr packed_addr;
2767
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002768 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002769 return NULL;
2770 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002771
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002772 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002773 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002774 "packed IP wrong length for inet_ntoa");
2775 return NULL;
2776 }
2777
2778 memcpy(&packed_addr, packed_str, addr_len);
2779
2780 return PyString_FromString(inet_ntoa(packed_addr));
2781}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002782
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002783#ifdef HAVE_INET_PTON
2784
2785PyDoc_STRVAR(inet_pton_doc,
2786"inet_pton(af, ip) -> packed IP address string\n\
2787\n\
2788Convert an IP address from string format to a packed string suitable\n\
2789for use with low-level network functions.");
2790
2791static PyObject *
2792socket_inet_pton(PyObject *self, PyObject *args)
2793{
2794 int af;
2795 char* ip;
2796 int retval;
2797 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
2798
2799 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
2800 return NULL;
2801 }
2802
2803 retval = inet_pton(af, ip, packed);
2804 if (retval < 0) {
2805 PyErr_SetFromErrno(socket_error);
2806 return NULL;
2807 } else if (retval == 0) {
2808 PyErr_SetString(socket_error,
2809 "illegal IP address string passed to inet_pton");
2810 return NULL;
2811 } else if (af == AF_INET) {
2812 return PyString_FromStringAndSize(packed,
2813 sizeof(struct in_addr));
2814 } else if (af == AF_INET6) {
2815 return PyString_FromStringAndSize(packed,
2816 sizeof(struct in6_addr));
2817 } else {
2818 PyErr_SetString(socket_error, "unknown address family");
2819 return NULL;
2820 }
2821}
2822
2823PyDoc_STRVAR(inet_ntop_doc,
2824"inet_ntop(af, packed_ip) -> string formatted IP address\n\
2825\n\
2826Convert a packed IP address of the given family to string format.");
2827
2828static PyObject *
2829socket_inet_ntop(PyObject *self, PyObject *args)
2830{
2831 int af;
2832 char* packed;
2833 int len;
2834 const char* retval;
2835 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
2836
2837 /* Guarantee NUL-termination for PyString_FromString() below */
2838 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
2839
2840 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
2841 return NULL;
2842 }
2843
2844 if (af == AF_INET) {
2845 if (len != sizeof(struct in_addr)) {
2846 PyErr_SetString(PyExc_ValueError,
2847 "invalid length of packed IP address string");
2848 return NULL;
2849 }
2850 } else if (af == AF_INET6) {
2851 if (len != sizeof(struct in6_addr)) {
2852 PyErr_SetString(PyExc_ValueError,
2853 "invalid length of packed IP address string");
2854 return NULL;
2855 }
2856 } else {
2857 PyErr_Format(PyExc_ValueError,
2858 "unknown address family %d", af);
2859 return NULL;
2860 }
2861
2862 retval = inet_ntop(af, packed, ip, sizeof(ip));
2863 if (!retval) {
2864 PyErr_SetFromErrno(socket_error);
2865 return NULL;
2866 } else {
2867 return PyString_FromString(retval);
2868 }
2869
2870 /* NOTREACHED */
2871 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
2872 return NULL;
2873}
2874
2875#endif /* HAVE_INET_PTON */
2876
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002877/* Python interface to getaddrinfo(host, port). */
2878
2879/*ARGSUSED*/
2880static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002881socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002882{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002883 struct addrinfo hints, *res;
2884 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002885 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002886 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002887 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002888 char *hptr, *pptr;
2889 int family, socktype, protocol, flags;
2890 int error;
2891 PyObject *all = (PyObject *)NULL;
2892 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002893 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002894
2895 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002896 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002897 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
2898 &hobj, &pobj, &family, &socktype,
2899 &protocol, &flags)) {
2900 return NULL;
2901 }
2902 if (hobj == Py_None) {
2903 hptr = NULL;
2904 } else if (PyUnicode_Check(hobj)) {
2905 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
2906 if (!idna)
2907 return NULL;
2908 hptr = PyString_AsString(idna);
2909 } else if (PyString_Check(hobj)) {
2910 hptr = PyString_AsString(hobj);
2911 } else {
2912 PyErr_SetString(PyExc_TypeError,
2913 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002914 return NULL;
2915 }
2916 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002917 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002918 pptr = pbuf;
2919 } else if (PyString_Check(pobj)) {
2920 pptr = PyString_AsString(pobj);
2921 } else if (pobj == Py_None) {
2922 pptr = (char *)NULL;
2923 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002924 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002925 return NULL;
2926 }
2927 memset(&hints, 0, sizeof(hints));
2928 hints.ai_family = family;
2929 hints.ai_socktype = socktype;
2930 hints.ai_protocol = protocol;
2931 hints.ai_flags = flags;
2932 error = getaddrinfo(hptr, pptr, &hints, &res0);
2933 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002934 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002935 return NULL;
2936 }
2937
2938 if ((all = PyList_New(0)) == NULL)
2939 goto err;
2940 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002941 PyObject *addr =
2942 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2943 if (addr == NULL)
2944 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002945 single = Py_BuildValue("iiisO", res->ai_family,
2946 res->ai_socktype, res->ai_protocol,
2947 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002948 addr);
2949 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002950 if (single == NULL)
2951 goto err;
2952
2953 if (PyList_Append(all, single))
2954 goto err;
2955 Py_XDECREF(single);
2956 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00002957 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00002958 if (res0)
2959 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002960 return all;
2961 err:
2962 Py_XDECREF(single);
2963 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00002964 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002965 if (res0)
2966 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002967 return (PyObject *)NULL;
2968}
2969
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002970PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002971"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2972 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002973\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002974Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002975
2976/* Python interface to getnameinfo(sa, flags). */
2977
2978/*ARGSUSED*/
2979static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002980socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002981{
2982 PyObject *sa = (PyObject *)NULL;
2983 int flags;
2984 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002985 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002986 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2987 struct addrinfo hints, *res = NULL;
2988 int error;
2989 PyObject *ret = (PyObject *)NULL;
2990
2991 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002992 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002993 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002994 if (!PyArg_ParseTuple(sa, "si|ii",
2995 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002996 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002997 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002998 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002999 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003000 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003001 error = getaddrinfo(hostp, pbuf, &hints, &res);
3002 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003003 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003004 goto fail;
3005 }
3006 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003007 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003008 "sockaddr resolved to multiple addresses");
3009 goto fail;
3010 }
3011 switch (res->ai_family) {
3012 case AF_INET:
3013 {
3014 char *t1;
3015 int t2;
3016 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003017 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003018 "IPv4 sockaddr must be 2 tuple");
3019 goto fail;
3020 }
3021 break;
3022 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003023#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003024 case AF_INET6:
3025 {
3026 struct sockaddr_in6 *sin6;
3027 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3028 sin6->sin6_flowinfo = flowinfo;
3029 sin6->sin6_scope_id = scope_id;
3030 break;
3031 }
3032#endif
3033 }
3034 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3035 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3036 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003037 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003038 goto fail;
3039 }
3040 ret = Py_BuildValue("ss", hbuf, pbuf);
3041
3042fail:
3043 if (res)
3044 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003045 return ret;
3046}
3047
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003048PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003049"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003050\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003051Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003052
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003053
3054/* Python API to getting and setting the default timeout value. */
3055
3056static PyObject *
3057socket_getdefaulttimeout(PyObject *self)
3058{
3059 if (defaulttimeout < 0.0) {
3060 Py_INCREF(Py_None);
3061 return Py_None;
3062 }
3063 else
3064 return PyFloat_FromDouble(defaulttimeout);
3065}
3066
3067PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003068"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003069\n\
3070Returns the default timeout in floating seconds for new socket objects.\n\
3071A value of None indicates that new socket objects have no timeout.\n\
3072When the socket module is first imported, the default is None.");
3073
3074static PyObject *
3075socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3076{
3077 double timeout;
3078
3079 if (arg == Py_None)
3080 timeout = -1.0;
3081 else {
3082 timeout = PyFloat_AsDouble(arg);
3083 if (timeout < 0.0) {
3084 if (!PyErr_Occurred())
3085 PyErr_SetString(PyExc_ValueError,
3086 "Timeout value out of range");
3087 return NULL;
3088 }
3089 }
3090
3091 defaulttimeout = timeout;
3092
3093 Py_INCREF(Py_None);
3094 return Py_None;
3095}
3096
3097PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003098"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003099\n\
3100Set the default timeout in floating seconds for new socket objects.\n\
3101A value of None indicates that new socket objects have no timeout.\n\
3102When the socket module is first imported, the default is None.");
3103
3104
Guido van Rossum30a685f1991-06-27 15:51:29 +00003105/* List of functions exported by this module. */
3106
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003107static PyMethodDef socket_methods[] = {
3108 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003109 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003110 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003111 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003112 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003113 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003114 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003115 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003116 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003117 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003118 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003119 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003120#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003121 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003122 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003123#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003124 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003125 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003126 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003127 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003128 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003129 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003130 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003131 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003132 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003133 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003134 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003135 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003136#ifdef HAVE_INET_PTON
3137 {"inet_pton", socket_inet_pton,
3138 METH_VARARGS, inet_pton_doc},
3139 {"inet_ntop", socket_inet_ntop,
3140 METH_VARARGS, inet_ntop_doc},
3141#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003142 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003143 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003144 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003145 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003146 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003147 METH_NOARGS, getdefaulttimeout_doc},
3148 {"setdefaulttimeout", socket_setdefaulttimeout,
3149 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003150 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003151};
3152
Guido van Rossum30a685f1991-06-27 15:51:29 +00003153
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003154#ifdef RISCOS
3155#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003156
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003157static int
3158os_init(void)
3159{
3160 _kernel_swi_regs r;
3161
3162 r.r[0] = 0;
3163 _kernel_swi(0x43380, &r, &r);
3164 taskwindow = r.r[0];
3165
3166 return 0;
3167}
3168
3169#endif /* RISCOS */
3170
3171
3172#ifdef MS_WINDOWS
3173#define OS_INIT_DEFINED
3174
3175/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003176
3177static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003178os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003179{
3180 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003181}
3182
3183static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003184os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003185{
3186 WSADATA WSAData;
3187 int ret;
3188 char buf[100];
3189 ret = WSAStartup(0x0101, &WSAData);
3190 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003191 case 0: /* No error */
3192 atexit(os_cleanup);
3193 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003194 case WSASYSNOTREADY:
3195 PyErr_SetString(PyExc_ImportError,
3196 "WSAStartup failed: network not ready");
3197 break;
3198 case WSAVERNOTSUPPORTED:
3199 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003200 PyErr_SetString(
3201 PyExc_ImportError,
3202 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003203 break;
3204 default:
Tim Peters885d4572001-11-28 20:27:42 +00003205 PyOS_snprintf(buf, sizeof(buf),
3206 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003207 PyErr_SetString(PyExc_ImportError, buf);
3208 break;
3209 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003210 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003211}
3212
Guido van Rossum8d665e61996-06-26 18:22:49 +00003213#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003214
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003215
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003216#ifdef PYOS_OS2
3217#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003218
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003219/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003220
3221static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003222os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003223{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003224#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003225 char reason[64];
3226 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003227
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003228 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003229 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003230 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003231
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003232 PyOS_snprintf(reason, sizeof(reason),
3233 "OS/2 TCP/IP Error# %d", sock_errno());
3234 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003235
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003236 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003237#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003238 /* No need to initialise sockets with GCC/EMX */
3239 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003240#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003241}
3242
3243#endif /* PYOS_OS2 */
3244
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003245
3246#ifndef OS_INIT_DEFINED
3247static int
3248os_init(void)
3249{
3250 return 1; /* Success */
3251}
3252#endif
3253
3254
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003255/* C API table - always add new things to the end for binary
3256 compatibility. */
3257static
3258PySocketModule_APIObject PySocketModuleAPI =
3259{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003260 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003261};
3262
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003263
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003264/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003265
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003266 This module is actually called "_socket", and there's a wrapper
3267 "socket.py" which implements some additional functionality. On some
3268 platforms (e.g. Windows and OS/2), socket.py also implements a
3269 wrapper for the socket type that provides missing functionality such
3270 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3271 with an ImportError exception if os-specific initialization fails.
3272 On Windows, this does WINSOCK initialization. When WINSOCK is
3273 initialized succesfully, a call to WSACleanup() is scheduled to be
3274 made at exit time.
3275*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003276
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003277PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003278"Implementation module for socket operations.\n\
3279\n\
3280See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003281
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003282PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003283init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003284{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003285 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003286
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003287 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003288 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003289
3290 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003291 m = Py_InitModule3(PySocket_MODULE_NAME,
3292 socket_methods,
3293 socket_doc);
3294
3295 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3296 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003297 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003298 Py_INCREF(socket_error);
3299 PyModule_AddObject(m, "error", socket_error);
3300 socket_herror = PyErr_NewException("socket.herror",
3301 socket_error, NULL);
3302 if (socket_herror == NULL)
3303 return;
3304 Py_INCREF(socket_herror);
3305 PyModule_AddObject(m, "herror", socket_herror);
3306 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003307 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003308 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003309 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003310 Py_INCREF(socket_gaierror);
3311 PyModule_AddObject(m, "gaierror", socket_gaierror);
3312 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003313 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003314 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003315 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003316 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003317 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003318 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003319 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003320
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003321#ifdef ENABLE_IPV6
3322 has_ipv6 = Py_True;
3323#else
3324 has_ipv6 = Py_False;
3325#endif
3326 Py_INCREF(has_ipv6);
3327 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3328
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003329 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003330 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003331 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3332 ) != 0)
3333 return;
3334
Guido van Rossum09be4091999-08-09 14:40:40 +00003335 /* Address families (we only support AF_INET and AF_UNIX) */
3336#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003337 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003338#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003339 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003340#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003341 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003342#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003343#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003344 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003345#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003346#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003347 /* Amateur Radio AX.25 */
3348 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003349#endif
3350#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003351 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003352#endif
3353#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003354 /* Appletalk DDP */
3355 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003356#endif
3357#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003358 /* Amateur radio NetROM */
3359 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003360#endif
3361#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003362 /* Multiprotocol bridge */
3363 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003364#endif
3365#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003366 /* Reserved for Werner's ATM */
3367 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003368#endif
3369#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003370 /* Reserved for X.25 project */
3371 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003372#endif
3373#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003374 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003375#endif
3376#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003377 /* Amateur Radio X.25 PLP */
3378 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003379#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003380#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003381 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3382 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3383 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3384 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3385 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3386 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3387 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3388 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3389 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003390#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003391
3392 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003393 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3394 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003395#ifndef __BEOS__
3396/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003397 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3398 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003399#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003400 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003401#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003402#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003403
3404#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003405 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003406#endif
3407#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003408 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003409#endif
3410#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003411 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003412#endif
3413#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003414 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003415#endif
3416#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003417 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003418#endif
3419#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003420 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003421#endif
3422#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003424#endif
3425#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003426 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003427#endif
3428#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003429 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003430#endif
3431#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003432 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003433#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003434#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003435 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003436#endif
3437#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003438 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003439#endif
3440#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003441 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003442#endif
3443#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003444 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003445#endif
3446#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003447 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003448#endif
3449#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003450 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003451#endif
3452#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003453 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003454#endif
3455#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003456 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003457#endif
3458
3459 /* Maximum number of connections for "listen" */
3460#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003461 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003462#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003463 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003464#endif
3465
3466 /* Flags for send, recv */
3467#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003468 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003469#endif
3470#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003471 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003472#endif
3473#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003474 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003475#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003476#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003477 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003478#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003479#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003480 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003481#endif
3482#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003483 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003484#endif
3485#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003486 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003487#endif
3488#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003489 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003490#endif
3491#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003492 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003493#endif
3494#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003495 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003496#endif
3497
3498 /* Protocol level and numbers, usable for [gs]etsockopt */
3499#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003500 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003501#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003502#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003503 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003504#else
Fred Drake4baedc12002-04-01 14:53:37 +00003505 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003506#endif
3507#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003508 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003509#endif
3510#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003511 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003512#endif
3513#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003514 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003515#endif
3516#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003517 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003518#endif
3519#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003520 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003521#endif
3522#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003523 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003524#else
Fred Drake4baedc12002-04-01 14:53:37 +00003525 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003526#endif
3527#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003528 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003529#else
Fred Drake4baedc12002-04-01 14:53:37 +00003530 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003531#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003532#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003533 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003534#else
Fred Drake4baedc12002-04-01 14:53:37 +00003535 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003536#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003537#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003538 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003539#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003540#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003541 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003542#else
Fred Drake4baedc12002-04-01 14:53:37 +00003543 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003544#endif
3545#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003546 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003547#endif
3548#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003549 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003550#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003551#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003552 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003553#endif
3554#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003555 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003556#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003557#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003558 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003559#else
Fred Drake4baedc12002-04-01 14:53:37 +00003560 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003561#endif
3562#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003563 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003564#endif
3565#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003566 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003567#endif
3568#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003569 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003570#else
Fred Drake4baedc12002-04-01 14:53:37 +00003571 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003572#endif
3573#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003574 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003575#endif
3576#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003577 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003578#endif
3579#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003580 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003581#endif
3582#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003583 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003584#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003585#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003586 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003587#endif
3588#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003589 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003590#endif
3591#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003592 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003593#endif
3594#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003595 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003596#endif
3597#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003598 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003599#endif
3600#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003601 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003602#endif
3603#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003604 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003605#endif
3606#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003607 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003608#endif
3609#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003610 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003611#endif
3612#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003613 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003614#endif
3615#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003616 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003617#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003618#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003619 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003620#endif
3621#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003622 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003623#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003624#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003625 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003626#endif
3627#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003628 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003629#endif
3630#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003631 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003632#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003633#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003634 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003635#endif
3636/**/
3637#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003638 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003639#else
Fred Drake4baedc12002-04-01 14:53:37 +00003640 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003641#endif
3642#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003643 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003644#endif
3645
3646 /* Some port configuration */
3647#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003648 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003649#else
Fred Drake4baedc12002-04-01 14:53:37 +00003650 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003651#endif
3652#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003653 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003654#else
Fred Drake4baedc12002-04-01 14:53:37 +00003655 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003656#endif
3657
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003658 /* Some reserved IP v.4 addresses */
3659#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003660 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003661#else
Fred Drake4baedc12002-04-01 14:53:37 +00003662 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003663#endif
3664#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003665 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003666#else
Fred Drake4baedc12002-04-01 14:53:37 +00003667 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003668#endif
3669#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003670 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003671#else
Fred Drake4baedc12002-04-01 14:53:37 +00003672 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003673#endif
3674#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003675 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003676#else
Fred Drake4baedc12002-04-01 14:53:37 +00003677 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003678#endif
3679#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003680 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3681 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003682#else
Fred Drake4baedc12002-04-01 14:53:37 +00003683 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003684#endif
3685#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003686 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3687 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003688#else
Fred Drake4baedc12002-04-01 14:53:37 +00003689 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003690#endif
3691#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003692 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003693#else
Fred Drake4baedc12002-04-01 14:53:37 +00003694 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003695#endif
3696
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003697 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003698#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003699 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003700#endif
3701#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003702 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003703#endif
3704#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003705 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003706#endif
3707#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003708 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003709#endif
3710#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003711 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003712#endif
3713#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003714 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003715#endif
3716#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003717 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003718#endif
3719#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003720 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003721#endif
3722#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003723 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003724#endif
3725#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003726 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003727#endif
3728#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003729 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003730#endif
3731#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003732 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003733#endif
3734#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003735 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003736#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003737#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003738 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3739 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003740#endif
3741#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003742 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3743 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003744#endif
3745#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003746 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003747#endif
3748
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003749 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3750#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003751 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003752#endif
3753#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003754 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003755#endif
3756#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003757 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003758#endif
3759#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003760 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003761#endif
3762#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003763 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003764#endif
3765#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003766 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003767#endif
3768
Guido van Rossum09be4091999-08-09 14:40:40 +00003769 /* TCP options */
3770#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003771 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003772#endif
3773#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003774 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003775#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003776#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003777 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003778#endif
3779#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003780 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003781#endif
3782#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003783 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003784#endif
3785#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003786 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003787#endif
3788#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003789 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003790#endif
3791#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003792 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003793#endif
3794#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003795 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003796#endif
3797#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003798 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003799#endif
3800#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003801 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003802#endif
3803#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003804 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003805#endif
3806
Guido van Rossum09be4091999-08-09 14:40:40 +00003807
3808 /* IPX options */
3809#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003810 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003811#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003812
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003813 /* get{addr,name}info parameters */
3814#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003815 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003816#endif
3817#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003818 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003819#endif
3820#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003821 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003822#endif
3823#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003824 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003825#endif
3826#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003827 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003828#endif
3829#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003830 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003831#endif
3832#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003833 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003834#endif
3835#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003836 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003837#endif
3838#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003839 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003840#endif
3841#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003842 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003843#endif
3844#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003845 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003846#endif
3847#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003848 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003849#endif
3850#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003851 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003852#endif
3853#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003854 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003855#endif
3856#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003857 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003858#endif
3859#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003860 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003861#endif
3862#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003863 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003864#endif
3865#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003866 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003867#endif
3868#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003869 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003870#endif
3871#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003872 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003873#endif
3874#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003875 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003876#endif
3877#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003878 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003879#endif
3880#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003881 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003882#endif
3883#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003884 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003885#endif
3886#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003887 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003888#endif
3889#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003890 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003891#endif
3892#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003893 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003894#endif
3895#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003896 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003897#endif
3898#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003899 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003900#endif
3901#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003902 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003903#endif
3904
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003905 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003906#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003907 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003908#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003909}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003910
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003911
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003912#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003913
3914/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003915/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003916
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003917int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003918inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003919{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003920 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003921 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003922 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003923 if (packed_addr == INADDR_NONE)
3924 return 0;
3925 memcpy(dst, &packed_addr, 4);
3926 return 1;
3927 }
3928 /* Should set errno to EAFNOSUPPORT */
3929 return -1;
3930}
3931
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003932const char *
3933inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003934{
3935 if (af == AF_INET) {
3936 struct in_addr packed_addr;
3937 if (size < 16)
3938 /* Should set errno to ENOSPC. */
3939 return NULL;
3940 memcpy(&packed_addr, src, sizeof(packed_addr));
3941 return strncpy(dst, inet_ntoa(packed_addr), size);
3942 }
3943 /* Should set errno to EAFNOSUPPORT */
3944 return NULL;
3945}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003946
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003947#endif