blob: 2f24034f66002145d36fbd98104adbd8fcdd7d90 [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
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000254#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000255#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000256
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000257/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000258#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000259/* avoid clashes with the C library definition of the symbol. */
260#define getaddrinfo fake_getaddrinfo
261#define gai_strerror fake_gai_strerror
262#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000263#include "getaddrinfo.c"
264#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000265#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000266#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000267#include "getnameinfo.c"
268#endif
269
Guido van Rossumbcc20741998-08-04 22:53:56 +0000270#if defined(MS_WINDOWS) || defined(__BEOS__)
271/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000272/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000273#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000274#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000275#endif
276
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000277#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000278#define EAFNOSUPPORT WSAEAFNOSUPPORT
279#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000280#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000281
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000282#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000283#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000284#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000285#endif
286
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000287#ifndef SOCKETCLOSE
288#define SOCKETCLOSE close
289#endif
290
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000291#ifdef __VMS
292/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
293#define SEGMENT_SIZE 65535
294#endif
295
Martin v. Löwise9416172003-05-03 10:12:45 +0000296/*
297 * Constants for getnameinfo()
298 */
299#if !defined(NI_MAXHOST)
300#define NI_MAXHOST 1025
301#endif
302#if !defined(NI_MAXSERV)
303#define NI_MAXSERV 32
304#endif
305
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000306/* XXX There's a problem here: *static* functions are not supposed to have
307 a Py prefix (or use CapitalizedWords). Later... */
308
Guido van Rossum30a685f1991-06-27 15:51:29 +0000309/* Global variable holding the exception type for errors detected
310 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000311static PyObject *socket_error;
312static PyObject *socket_herror;
313static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000314
Guido van Rossum48a680c2001-03-02 06:34:14 +0000315#ifdef RISCOS
316/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
317static int taskwindow;
318#endif
319
Tim Peters643a7fc2002-02-17 04:13:21 +0000320/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000321 The sock_type variable contains pointers to various functions,
322 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000323 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000324static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000325
Guido van Rossum30a685f1991-06-27 15:51:29 +0000326/* Convenience function to raise an error according to errno
327 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000328
Guido van Rossum73624e91994-10-10 17:59:00 +0000329static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000330set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000331{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000332#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000333 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000334 static struct {
335 int no;
336 const char *msg;
337 } *msgp, msgs[] = {
338 {WSAEINTR, "Interrupted system call"},
339 {WSAEBADF, "Bad file descriptor"},
340 {WSAEACCES, "Permission denied"},
341 {WSAEFAULT, "Bad address"},
342 {WSAEINVAL, "Invalid argument"},
343 {WSAEMFILE, "Too many open files"},
344 {WSAEWOULDBLOCK,
345 "The socket operation could not complete "
346 "without blocking"},
347 {WSAEINPROGRESS, "Operation now in progress"},
348 {WSAEALREADY, "Operation already in progress"},
349 {WSAENOTSOCK, "Socket operation on non-socket"},
350 {WSAEDESTADDRREQ, "Destination address required"},
351 {WSAEMSGSIZE, "Message too long"},
352 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
353 {WSAENOPROTOOPT, "Protocol not available"},
354 {WSAEPROTONOSUPPORT, "Protocol not supported"},
355 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
356 {WSAEOPNOTSUPP, "Operation not supported"},
357 {WSAEPFNOSUPPORT, "Protocol family not supported"},
358 {WSAEAFNOSUPPORT, "Address family not supported"},
359 {WSAEADDRINUSE, "Address already in use"},
360 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
361 {WSAENETDOWN, "Network is down"},
362 {WSAENETUNREACH, "Network is unreachable"},
363 {WSAENETRESET, "Network dropped connection on reset"},
364 {WSAECONNABORTED, "Software caused connection abort"},
365 {WSAECONNRESET, "Connection reset by peer"},
366 {WSAENOBUFS, "No buffer space available"},
367 {WSAEISCONN, "Socket is already connected"},
368 {WSAENOTCONN, "Socket is not connected"},
369 {WSAESHUTDOWN, "Can't send after socket shutdown"},
370 {WSAETOOMANYREFS, "Too many references: can't splice"},
371 {WSAETIMEDOUT, "Operation timed out"},
372 {WSAECONNREFUSED, "Connection refused"},
373 {WSAELOOP, "Too many levels of symbolic links"},
374 {WSAENAMETOOLONG, "File name too long"},
375 {WSAEHOSTDOWN, "Host is down"},
376 {WSAEHOSTUNREACH, "No route to host"},
377 {WSAENOTEMPTY, "Directory not empty"},
378 {WSAEPROCLIM, "Too many processes"},
379 {WSAEUSERS, "Too many users"},
380 {WSAEDQUOT, "Disc quota exceeded"},
381 {WSAESTALE, "Stale NFS file handle"},
382 {WSAEREMOTE, "Too many levels of remote in path"},
383 {WSASYSNOTREADY, "Network subsystem is unvailable"},
384 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
385 {WSANOTINITIALISED,
386 "Successful WSAStartup() not yet performed"},
387 {WSAEDISCON, "Graceful shutdown in progress"},
388 /* Resolver errors */
389 {WSAHOST_NOT_FOUND, "No such host is known"},
390 {WSATRY_AGAIN, "Host not found, or server failed"},
391 {WSANO_RECOVERY, "Unexpected server error encountered"},
392 {WSANO_DATA, "Valid name without requested data"},
393 {WSANO_ADDRESS, "No address, look for MX record"},
394 {0, NULL}
395 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000396 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000397 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000398 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000399
Mark Hammond46a733d2000-07-24 01:45:11 +0000400 for (msgp = msgs; msgp->msg; msgp++) {
401 if (err_no == msgp->no) {
402 msg = msgp->msg;
403 break;
404 }
405 }
406
407 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000408 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000409 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000410 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000411 }
412 return NULL;
413 }
414 else
415#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000416
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000417#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000418 if (sock_errno() != NO_ERROR) {
419 APIRET rc;
420 ULONG msglen;
421 char outbuf[100];
422 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000423
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000424 /* Retrieve socket-related error message from MPTN.MSG file */
425 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
426 myerrorcode - SOCBASEERR + 26,
427 "mptn.msg",
428 &msglen);
429 if (rc == NO_ERROR) {
430 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000431
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000432 /* OS/2 doesn't guarantee a terminator */
433 outbuf[msglen] = '\0';
434 if (strlen(outbuf) > 0) {
435 /* If non-empty msg, trim CRLF */
436 char *lastc = &outbuf[ strlen(outbuf)-1 ];
437 while (lastc > outbuf && isspace(*lastc)) {
438 /* Trim trailing whitespace (CRLF) */
439 *lastc-- = '\0';
440 }
441 }
442 v = Py_BuildValue("(is)", myerrorcode, outbuf);
443 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000444 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000445 Py_DECREF(v);
446 }
447 return NULL;
448 }
449 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000450#endif
451
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000452 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000453}
454
Guido van Rossum30a685f1991-06-27 15:51:29 +0000455
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000456static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000457set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000458{
459 PyObject *v;
460
461#ifdef HAVE_HSTRERROR
462 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
463#else
464 v = Py_BuildValue("(is)", h_error, "host not found");
465#endif
466 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000467 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000468 Py_DECREF(v);
469 }
470
471 return NULL;
472}
473
474
475static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000476set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000477{
478 PyObject *v;
479
Martin v. Löwis272cb402002-03-01 08:31:07 +0000480#ifdef EAI_SYSTEM
481 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000482 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000483 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000484#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000485
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000486#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000487 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000488#else
489 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
490#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000491 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000492 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000493 Py_DECREF(v);
494 }
495
496 return NULL;
497}
498
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000499/* Function to perform the setting of socket blocking mode
500 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000501static int
502internal_setblocking(PySocketSockObject *s, int block)
503{
504#ifndef RISCOS
505#ifndef MS_WINDOWS
506 int delay_flag;
507#endif
508#endif
509
510 Py_BEGIN_ALLOW_THREADS
511#ifdef __BEOS__
512 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000513 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
514 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000515#else
516#ifndef RISCOS
517#ifndef MS_WINDOWS
518#if defined(PYOS_OS2) && !defined(PYCC_GCC)
519 block = !block;
520 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000521#elif defined(__VMS)
522 block = !block;
523 ioctl(s->sock_fd, FIONBIO, (char *)&block);
524#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000525 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
526 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000527 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000528 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000529 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000530 fcntl(s->sock_fd, F_SETFL, delay_flag);
531#endif /* !PYOS_OS2 */
532#else /* MS_WINDOWS */
533 block = !block;
534 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
535#endif /* MS_WINDOWS */
536#endif /* __BEOS__ */
537#endif /* RISCOS */
538 Py_END_ALLOW_THREADS
539
540 /* Since these don't return anything */
541 return 1;
542}
543
Guido van Rossum11ba0942002-06-13 15:07:44 +0000544/* Do a select() on the socket, if necessary (sock_timeout > 0).
545 The argument writing indicates the direction.
546 This does not raise an exception or return a success indicator;
547 we'll let the actual socket call do that. */
548static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000549internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000550{
551 fd_set fds;
552 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000553
Guido van Rossumad654902002-07-19 12:44:59 +0000554 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000555 if (s->sock_timeout <= 0.0)
556 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000557
Guido van Rossumad654902002-07-19 12:44:59 +0000558 /* Guard against closed socket */
559 if (s->sock_fd < 0)
560 return;
561
Guido van Rossum67f7a382002-06-06 21:08:16 +0000562 /* Construct the arguments to select */
563 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000564 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000565 FD_ZERO(&fds);
566 FD_SET(s->sock_fd, &fds);
567
568 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000569 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000570 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000571 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000572 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000573}
574
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000575/* Initialize a new socket object. */
576
Tim Petersa12b4cf2002-07-18 22:38:44 +0000577static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000578
Mark Hammond62b1ab12002-07-23 06:31:15 +0000579PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000580init_sockobject(PySocketSockObject *s,
581 SOCKET_T fd, int family, int type, int proto)
582{
583#ifdef RISCOS
584 int block = 1;
585#endif
586 s->sock_fd = fd;
587 s->sock_family = family;
588 s->sock_type = type;
589 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000590 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000591
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000592 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000593
594 if (defaulttimeout >= 0.0)
595 internal_setblocking(s, 0);
596
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000597#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000598 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000599 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000600#endif
601}
602
603
Guido van Rossum30a685f1991-06-27 15:51:29 +0000604/* Create a new socket object.
605 This just creates the object and initializes it.
606 If the creation fails, return NULL and set an exception (implicit
607 in NEWOBJ()). */
608
Guido van Rossum73624e91994-10-10 17:59:00 +0000609static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000610new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000611{
Guido van Rossum73624e91994-10-10 17:59:00 +0000612 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000613 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000614 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000615 if (s != NULL)
616 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617 return s;
618}
619
Guido van Rossum30a685f1991-06-27 15:51:29 +0000620
Guido van Rossum48a680c2001-03-02 06:34:14 +0000621/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000622 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000623#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000624PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000625#endif
626
627
Guido van Rossum30a685f1991-06-27 15:51:29 +0000628/* Convert a string specifying a host name or one of a few symbolic
629 names to a numeric IP address. This usually calls gethostbyname()
630 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000631 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000632 an error occurred; then an exception is raised. */
633
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000634static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000635setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000636{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000637 struct addrinfo hints, *res;
638 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000639 int d1, d2, d3, d4;
640 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641
Guido van Rossuma376cc51996-12-05 23:43:35 +0000642 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000643 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000644 int siz;
645 memset(&hints, 0, sizeof(hints));
646 hints.ai_family = af;
647 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
648 hints.ai_flags = AI_PASSIVE;
649 error = getaddrinfo(NULL, "0", &hints, &res);
650 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000651 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000652 return -1;
653 }
654 switch (res->ai_family) {
655 case AF_INET:
656 siz = 4;
657 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000658#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000659 case AF_INET6:
660 siz = 16;
661 break;
662#endif
663 default:
664 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000665 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000666 "unsupported address family");
667 return -1;
668 }
669 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000670 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000671 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000672 "wildcard resolved to multiple address");
673 return -1;
674 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000675 if (res->ai_addrlen < addr_ret_size)
676 addr_ret_size = res->ai_addrlen;
677 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000678 freeaddrinfo(res);
679 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000680 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000681 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000682 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000683 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000684 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000685 "address family mismatched");
686 return -1;
687 }
688 sin = (struct sockaddr_in *)addr_ret;
689 memset((void *) sin, '\0', sizeof(*sin));
690 sin->sin_family = AF_INET;
691#ifdef HAVE_SOCKADDR_SA_LEN
692 sin->sin_len = sizeof(*sin);
693#endif
694 sin->sin_addr.s_addr = INADDR_BROADCAST;
695 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000696 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000697 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
698 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
699 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
700 struct sockaddr_in *sin;
701 sin = (struct sockaddr_in *)addr_ret;
702 sin->sin_addr.s_addr = htonl(
703 ((long) d1 << 24) | ((long) d2 << 16) |
704 ((long) d3 << 8) | ((long) d4 << 0));
705 sin->sin_family = AF_INET;
706#ifdef HAVE_SOCKADDR_SA_LEN
707 sin->sin_len = sizeof(*sin);
708#endif
709 return 4;
710 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000711 memset(&hints, 0, sizeof(hints));
712 hints.ai_family = af;
713 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000714#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000715 if (error == EAI_NONAME && af == AF_UNSPEC) {
716 /* On Tru64 V5.1, numeric-to-addr conversion fails
717 if no address family is given. Assume IPv4 for now.*/
718 hints.ai_family = AF_INET;
719 error = getaddrinfo(name, NULL, &hints, &res);
720 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000721#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000722 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000723 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000724 return -1;
725 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000726 if (res->ai_addrlen < addr_ret_size)
727 addr_ret_size = res->ai_addrlen;
728 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000729 freeaddrinfo(res);
730 switch (addr_ret->sa_family) {
731 case AF_INET:
732 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000733#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000734 case AF_INET6:
735 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000736#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000737 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000738 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000739 return -1;
740 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000741}
742
Guido van Rossum30a685f1991-06-27 15:51:29 +0000743
Guido van Rossum30a685f1991-06-27 15:51:29 +0000744/* Create a string object representing an IP address.
745 This is always a string of the form 'dd.dd.dd.dd' (with variable
746 size numbers). */
747
Guido van Rossum73624e91994-10-10 17:59:00 +0000748static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000749makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000750{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000751 char buf[NI_MAXHOST];
752 int error;
753
754 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
755 NI_NUMERICHOST);
756 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000757 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000758 return NULL;
759 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000760 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000761}
762
763
764/* Create an object representing the given socket address,
765 suitable for passing it back to bind(), connect() etc.
766 The family field of the sockaddr structure is inspected
767 to determine what kind of address it really is. */
768
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000770static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000771makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000773 if (addrlen == 0) {
774 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000775 Py_INCREF(Py_None);
776 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000777 }
778
Guido van Rossumbcc20741998-08-04 22:53:56 +0000779#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000780 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000781 addr->sa_family = AF_INET;
782#endif
783
Guido van Rossum30a685f1991-06-27 15:51:29 +0000784 switch (addr->sa_family) {
785
786 case AF_INET:
787 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000788 struct sockaddr_in *a;
789 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000790 PyObject *ret = NULL;
791 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000792 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000793 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
794 Py_DECREF(addrobj);
795 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000796 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000797 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000799#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000800 case AF_UNIX:
801 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000803 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000805#endif /* AF_UNIX */
806
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000807#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000808 case AF_INET6:
809 {
810 struct sockaddr_in6 *a;
811 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
812 PyObject *ret = NULL;
813 if (addrobj) {
814 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000815 ret = Py_BuildValue("Oiii",
816 addrobj,
817 ntohs(a->sin6_port),
818 a->sin6_flowinfo,
819 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000820 Py_DECREF(addrobj);
821 }
822 return ret;
823 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000824#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000825
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000826#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000827 case AF_PACKET:
828 {
829 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
830 char *ifname = "";
831 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000832 /* need to look up interface name give index */
833 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000834 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000835 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000836 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000837 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000838 return Py_BuildValue("shbhs#",
839 ifname,
840 ntohs(a->sll_protocol),
841 a->sll_pkttype,
842 a->sll_hatype,
843 a->sll_addr,
844 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000845 }
846#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000847
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848 /* More cases here... */
849
850 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000851 /* If we don't know the address family, don't raise an
852 exception -- return it as a tuple. */
853 return Py_BuildValue("is#",
854 addr->sa_family,
855 addr->sa_data,
856 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000857
Guido van Rossum30a685f1991-06-27 15:51:29 +0000858 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859}
860
Guido van Rossum30a685f1991-06-27 15:51:29 +0000861
862/* Parse a socket address argument according to the socket object's
863 address family. Return 1 if the address was in the proper format,
864 0 of not. The address is returned through addr_ret, its length
865 through len_ret. */
866
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000867static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000868getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000869 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000870{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000871 switch (s->sock_family) {
872
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000873#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000874 case AF_UNIX:
875 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000876 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000877 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000878 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000879 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000880 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000881 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000882 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000883 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000884 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000885 return 0;
886 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000887 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000888 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000889 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000890 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000891 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000892 return 1;
893 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000894#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000895
Guido van Rossum30a685f1991-06-27 15:51:29 +0000896 case AF_INET:
897 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000898 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000899 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000900 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000901 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000902 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000903 PyErr_Format(
904 PyExc_TypeError,
905 "getsockaddrarg: "
906 "AF_INET address must be tuple, not %.500s",
907 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000908 return 0;
909 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000910 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
911 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000912 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000913 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000915 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000916 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000917 *addr_ret = (struct sockaddr *) addr;
918 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919 return 1;
920 }
921
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000922#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000923 case AF_INET6:
924 {
925 struct sockaddr_in6* addr;
926 char *host;
927 int port, flowinfo, scope_id;
928 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
929 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +0000930 if (!PyArg_ParseTuple(args, "eti|ii",
931 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000932 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000933 return 0;
934 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000935 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000936 return 0;
937 addr->sin6_family = s->sock_family;
938 addr->sin6_port = htons((short)port);
939 addr->sin6_flowinfo = flowinfo;
940 addr->sin6_scope_id = scope_id;
941 *addr_ret = (struct sockaddr *) addr;
942 *len_ret = sizeof *addr;
943 return 1;
944 }
945#endif
946
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000947#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000948 case AF_PACKET:
949 {
950 struct sockaddr_ll* addr;
951 struct ifreq ifr;
952 char *interfaceName;
953 int protoNumber;
954 int hatype = 0;
955 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000956 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000957
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000958 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
959 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000960 return 0;
961 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
962 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000963 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000964 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000965 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000966 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000967 addr = &(s->sock_addr.ll);
968 addr->sll_family = AF_PACKET;
969 addr->sll_protocol = htons((short)protoNumber);
970 addr->sll_ifindex = ifr.ifr_ifindex;
971 addr->sll_pkttype = pkttype;
972 addr->sll_hatype = hatype;
973 *addr_ret = (struct sockaddr *) addr;
974 *len_ret = sizeof *addr;
975 return 1;
976 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000977#endif
978
Guido van Rossum30a685f1991-06-27 15:51:29 +0000979 /* More cases here... */
980
981 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000982 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000983 return 0;
984
985 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000986}
987
Guido van Rossum30a685f1991-06-27 15:51:29 +0000988
Guido van Rossum48a680c2001-03-02 06:34:14 +0000989/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000990 Return 1 if the family is known, 0 otherwise. The length is returned
991 through len_ret. */
992
993static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000994getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000995{
996 switch (s->sock_family) {
997
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000998#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000999 case AF_UNIX:
1000 {
1001 *len_ret = sizeof (struct sockaddr_un);
1002 return 1;
1003 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001004#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001005
1006 case AF_INET:
1007 {
1008 *len_ret = sizeof (struct sockaddr_in);
1009 return 1;
1010 }
1011
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001012#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001013 case AF_INET6:
1014 {
1015 *len_ret = sizeof (struct sockaddr_in6);
1016 return 1;
1017 }
1018#endif
1019
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001020#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001021 case AF_PACKET:
1022 {
1023 *len_ret = sizeof (struct sockaddr_ll);
1024 return 1;
1025 }
1026#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001027
Guido van Rossum710e1df1992-06-12 10:39:36 +00001028 /* More cases here... */
1029
1030 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001031 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001032 return 0;
1033
1034 }
1035}
1036
1037
Guido van Rossum30a685f1991-06-27 15:51:29 +00001038/* s.accept() method */
1039
Guido van Rossum73624e91994-10-10 17:59:00 +00001040static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001041sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001042{
1043 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001044 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001045 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001046 PyObject *sock = NULL;
1047 PyObject *addr = NULL;
1048 PyObject *res = NULL;
1049
Guido van Rossum710e1df1992-06-12 10:39:36 +00001050 if (!getsockaddrlen(s, &addrlen))
1051 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001052 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001053
Guido van Rossum73624e91994-10-10 17:59:00 +00001054 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001055 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001056 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001057 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001058
Fred Drakea04eaad2000-06-30 02:46:07 +00001059#ifdef MS_WINDOWS
1060 if (newfd == INVALID_SOCKET)
1061#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001062 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001063#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001064 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001065
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066 /* Create the new object with unspecified family,
1067 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001068 sock = (PyObject *) new_sockobject(newfd,
1069 s->sock_family,
1070 s->sock_type,
1071 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001072
Barry Warsaw752300b1997-01-03 17:18:10 +00001073 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001074 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001075 goto finally;
1076 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001077 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001078 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001079 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001080 goto finally;
1081
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001082 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001083
Guido van Rossum67f7a382002-06-06 21:08:16 +00001084finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001085 Py_XDECREF(sock);
1086 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001087 return res;
1088}
1089
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001090PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001091"accept() -> (socket object, address info)\n\
1092\n\
1093Wait for an incoming connection. Return a new socket representing the\n\
1094connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001095info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001096
Guido van Rossum11ba0942002-06-13 15:07:44 +00001097/* s.setblocking(flag) method. Argument:
1098 False -- non-blocking mode; same as settimeout(0)
1099 True -- blocking mode; same as settimeout(None)
1100*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001101
Guido van Rossum73624e91994-10-10 17:59:00 +00001102static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001103sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001104{
1105 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001106
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001107 block = PyInt_AsLong(arg);
1108 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001109 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001110
Guido van Rossum11ba0942002-06-13 15:07:44 +00001111 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001112 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001113
Guido van Rossum73624e91994-10-10 17:59:00 +00001114 Py_INCREF(Py_None);
1115 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001116}
Guido van Rossume4485b01994-09-07 14:32:49 +00001117
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001118PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001119"setblocking(flag)\n\
1120\n\
1121Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001122setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001123setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001124
Guido van Rossum11ba0942002-06-13 15:07:44 +00001125/* s.settimeout(timeout) method. Argument:
1126 None -- no timeout, blocking mode; same as setblocking(True)
1127 0.0 -- non-blocking mode; same as setblocking(False)
1128 > 0 -- timeout mode; operations time out after timeout seconds
1129 < 0 -- illegal; raises an exception
1130*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001131static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001132sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001133{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001134 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001135
1136 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001137 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001138 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001139 timeout = PyFloat_AsDouble(arg);
1140 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001141 if (!PyErr_Occurred())
1142 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001143 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001144 return NULL;
1145 }
1146 }
1147
Guido van Rossum11ba0942002-06-13 15:07:44 +00001148 s->sock_timeout = timeout;
1149 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001150
1151 Py_INCREF(Py_None);
1152 return Py_None;
1153}
1154
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001155PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001156"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001157\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001158Set a timeout on socket operations. 'timeout' can be a float,\n\
1159giving in seconds, or None. Setting a timeout of None disables\n\
1160the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001161Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001162
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001163/* s.gettimeout() method.
1164 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001165static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001166sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001167{
1168 if (s->sock_timeout < 0.0) {
1169 Py_INCREF(Py_None);
1170 return Py_None;
1171 }
1172 else
1173 return PyFloat_FromDouble(s->sock_timeout);
1174}
1175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001176PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001177"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001178\n\
1179Returns the timeout in floating seconds associated with socket \n\
1180operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001181operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001182
Guido van Rossum48a680c2001-03-02 06:34:14 +00001183#ifdef RISCOS
1184/* s.sleeptaskw(1 | 0) method */
1185
1186static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001187sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001188{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001189 int block;
1190 int delay_flag;
1191 if (!PyArg_Parse(args, "i", &block))
1192 return NULL;
1193 Py_BEGIN_ALLOW_THREADS
1194 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1195 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001196
Guido van Rossum67f7a382002-06-06 21:08:16 +00001197 Py_INCREF(Py_None);
1198 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001199}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001200PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001201"sleeptaskw(flag)\n\
1202\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001203Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001204#endif
1205
1206
Guido van Rossumaee08791992-09-08 09:05:33 +00001207/* s.setsockopt() method.
1208 With an integer third argument, sets an integer option.
1209 With a string third argument, sets an option from a buffer;
1210 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001211
Guido van Rossum73624e91994-10-10 17:59:00 +00001212static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001213sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001214{
1215 int level;
1216 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001217 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001218 char *buf;
1219 int buflen;
1220 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001221
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001222 if (PyArg_ParseTuple(args, "iii:setsockopt",
1223 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001224 buf = (char *) &flag;
1225 buflen = sizeof flag;
1226 }
1227 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001228 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001229 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1230 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001231 return NULL;
1232 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001233 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001234 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001235 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001236 Py_INCREF(Py_None);
1237 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001238}
1239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001240PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001241"setsockopt(level, option, value)\n\
1242\n\
1243Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001244The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001245
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001246
Guido van Rossumaee08791992-09-08 09:05:33 +00001247/* s.getsockopt() method.
1248 With two arguments, retrieves an integer option.
1249 With a third integer argument, retrieves a string buffer of that size;
1250 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001251
Guido van Rossum73624e91994-10-10 17:59:00 +00001252static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001253sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001254{
1255 int level;
1256 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001257 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001258 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001259 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001260
Guido van Rossumbcc20741998-08-04 22:53:56 +00001261#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001262 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001263 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001264 return NULL;
1265#else
1266
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001267 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1268 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001269 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001270
Guido van Rossumbe32c891996-06-20 16:25:29 +00001271 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001272 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001273 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001274 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001275 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001276 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001277 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001278 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001279 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001280#ifdef __VMS
1281 if (buflen > 1024) {
1282#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001283 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001284#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001285 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001286 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001287 return NULL;
1288 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001289 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001290 if (buf == NULL)
1291 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001292 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001293 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001294 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001295 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001296 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001297 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001298 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001299 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001300#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001301}
1302
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001303PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001304"getsockopt(level, option[, buffersize]) -> value\n\
1305\n\
1306Get a socket option. See the Unix manual for level and option.\n\
1307If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001308string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001309
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001310
Fred Drake728819a2000-07-01 03:40:12 +00001311/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001312
Guido van Rossum73624e91994-10-10 17:59:00 +00001313static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001314sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001315{
1316 struct sockaddr *addr;
1317 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001318 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001319
Fred Drake728819a2000-07-01 03:40:12 +00001320 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001321 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001323 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001324 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001325 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001326 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001327 Py_INCREF(Py_None);
1328 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001329}
1330
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001331PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001332"bind(address)\n\
1333\n\
1334Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001335pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001336sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001337
Guido van Rossum30a685f1991-06-27 15:51:29 +00001338
1339/* s.close() method.
1340 Set the file descriptor to -1 so operations tried subsequently
1341 will surely fail. */
1342
Guido van Rossum73624e91994-10-10 17:59:00 +00001343static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001344sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001345{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001346 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001347
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001348 if ((fd = s->sock_fd) != -1) {
1349 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001350 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001351 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001352 Py_END_ALLOW_THREADS
1353 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 Py_INCREF(Py_None);
1355 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001356}
1357
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001358PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359"close()\n\
1360\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001361Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001362
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001363static int
1364internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1365{
1366 int res;
1367
1368 res = connect(s->sock_fd, addr, addrlen);
1369
1370#ifdef MS_WINDOWS
1371
1372 if (s->sock_timeout > 0.0) {
1373 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001374 /* This is a mess. Best solution: trust select */
1375 fd_set fds;
1376 struct timeval tv;
1377 tv.tv_sec = (int)s->sock_timeout;
1378 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1379 FD_ZERO(&fds);
1380 FD_SET(s->sock_fd, &fds);
1381 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1382 if (res == 0)
1383 res = WSAEWOULDBLOCK;
1384 else if (res > 0)
1385 res = 0;
1386 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001387 }
1388 }
1389
1390 if (res < 0)
1391 res = WSAGetLastError();
1392
1393#else
1394
1395 if (s->sock_timeout > 0.0) {
1396 if (res < 0 && errno == EINPROGRESS) {
1397 internal_select(s, 1);
1398 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001399 if (res < 0 && errno == EISCONN)
1400 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001401 }
1402 }
1403
1404 if (res < 0)
1405 res = errno;
1406
1407#endif
1408
1409 return res;
1410}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001411
Fred Drake728819a2000-07-01 03:40:12 +00001412/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001413
Guido van Rossum73624e91994-10-10 17:59:00 +00001414static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001415sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001416{
1417 struct sockaddr *addr;
1418 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001419 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 Rossum6574b3e1991-06-25 21:36:08 +00001422 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001423
Guido van Rossum73624e91994-10-10 17:59:00 +00001424 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001425 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001426 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001427
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001428 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001429 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001430 Py_INCREF(Py_None);
1431 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001432}
1433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001434PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001435"connect(address)\n\
1436\n\
1437Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001438is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001439
Guido van Rossum30a685f1991-06-27 15:51:29 +00001440
Fred Drake728819a2000-07-01 03:40:12 +00001441/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001442
1443static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001444sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001445{
1446 struct sockaddr *addr;
1447 int addrlen;
1448 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001449
Fred Drake728819a2000-07-01 03:40:12 +00001450 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001451 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001452
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001453 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001454 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001455 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001456
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001457 return PyInt_FromLong((long) res);
1458}
1459
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001460PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001461"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001462\n\
1463This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001464instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001465
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001466
Guido van Rossumed233a51992-06-23 09:07:03 +00001467/* s.fileno() method */
1468
Guido van Rossum73624e91994-10-10 17:59:00 +00001469static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001470sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001471{
Fred Drakea04eaad2000-06-30 02:46:07 +00001472#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001473 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001474#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001475 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001476#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001477}
1478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001479PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001480"fileno() -> integer\n\
1481\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001482Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001483
Guido van Rossumed233a51992-06-23 09:07:03 +00001484
Guido van Rossumbe32c891996-06-20 16:25:29 +00001485#ifndef NO_DUP
1486/* s.dup() method */
1487
1488static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001489sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001490{
Fred Drakea04eaad2000-06-30 02:46:07 +00001491 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001492 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001493
Guido van Rossumbe32c891996-06-20 16:25:29 +00001494 newfd = dup(s->sock_fd);
1495 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001496 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001497 sock = (PyObject *) new_sockobject(newfd,
1498 s->sock_family,
1499 s->sock_type,
1500 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001501 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001502 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001503 return sock;
1504}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001505
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001506PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001507"dup() -> socket object\n\
1508\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001509Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001510
Guido van Rossumbe32c891996-06-20 16:25:29 +00001511#endif
1512
1513
Guido van Rossumc89705d1992-11-26 08:54:07 +00001514/* s.getsockname() method */
1515
Guido van Rossum73624e91994-10-10 17:59:00 +00001516static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001517sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001518{
1519 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001520 int res;
1521 socklen_t addrlen;
1522
Guido van Rossumc89705d1992-11-26 08:54:07 +00001523 if (!getsockaddrlen(s, &addrlen))
1524 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001525 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001526 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001527 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001528 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001529 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001530 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001531 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001532}
1533
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001534PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001535"getsockname() -> address info\n\
1536\n\
1537Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001538info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001539
Guido van Rossumc89705d1992-11-26 08:54:07 +00001540
Guido van Rossumb6775db1994-08-01 11:34:53 +00001541#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001542/* s.getpeername() method */
1543
Guido van Rossum73624e91994-10-10 17:59:00 +00001544static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001545sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001546{
1547 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001548 int res;
1549 socklen_t addrlen;
1550
Guido van Rossumc89705d1992-11-26 08:54:07 +00001551 if (!getsockaddrlen(s, &addrlen))
1552 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001553 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001554 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001555 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001556 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001557 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001558 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001559 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001560}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001561
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001562PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001563"getpeername() -> address info\n\
1564\n\
1565Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001566info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001567
Guido van Rossumb6775db1994-08-01 11:34:53 +00001568#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001569
1570
Guido van Rossum30a685f1991-06-27 15:51:29 +00001571/* s.listen(n) method */
1572
Guido van Rossum73624e91994-10-10 17:59:00 +00001573static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001574sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001575{
1576 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001577 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001578
1579 backlog = PyInt_AsLong(arg);
1580 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001583 if (backlog < 1)
1584 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001585 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001586 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001587 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001588 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001589 Py_INCREF(Py_None);
1590 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001591}
1592
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001593PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001594"listen(backlog)\n\
1595\n\
1596Enable a server to accept connections. The backlog argument must be at\n\
1597least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001598will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001599
1600
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001601#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001602/* s.makefile(mode) method.
1603 Create a new open file object referring to a dupped version of
1604 the socket's file descriptor. (The dup() call is necessary so
1605 that the open file and socket objects may be closed independent
1606 of each other.)
1607 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1608
Guido van Rossum73624e91994-10-10 17:59:00 +00001609static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001610sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001611{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001612 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001613 char *mode = "r";
1614 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001615#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001616 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001617#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001618 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001619#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001620 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001621 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001622#ifdef __VMS
1623 char *mode_r = "r";
1624 char *mode_w = "w";
1625#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001626
Guido van Rossum43713e52000-02-29 13:59:29 +00001627 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001628 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001629#ifdef __VMS
1630 if (strcmp(mode,"rb") == 0) {
1631 mode = mode_r;
1632 }
1633 else {
1634 if (strcmp(mode,"wb") == 0) {
1635 mode = mode_w;
1636 }
1637 }
1638#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001639#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001640 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1641 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001642#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001643 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001644#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001645 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001646 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001647 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001648 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001649 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001650#ifdef USE_GUSI2
1651 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001652 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001653 bufsize = 0;
1654#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001655 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1656 if (f != NULL)
1657 PyFile_SetBufSize(f, bufsize);
1658 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001659}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001660
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001661PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001662"makefile([mode[, buffersize]]) -> file object\n\
1663\n\
1664Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001665The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001666
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001667#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001668
Guido van Rossum48a680c2001-03-02 06:34:14 +00001669
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001670/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001671
Guido van Rossum73624e91994-10-10 17:59:00 +00001672static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001673sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001674{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001675 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001676 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001677#ifdef __VMS
1678 int read_length;
1679 char *read_buf;
1680#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001681
Guido van Rossum43713e52000-02-29 13:59:29 +00001682 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001683 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001684
1685 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001686 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001687 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001688 return NULL;
1689 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001690
Guido van Rossum73624e91994-10-10 17:59:00 +00001691 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001692 if (buf == NULL)
1693 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001694
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001695#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001696 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001697 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001698 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001699 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001700
Guido van Rossum7c53b771995-09-13 18:39:47 +00001701 if (n < 0) {
1702 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001703 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001704 }
Tim Peters5de98422002-04-27 18:44:32 +00001705 if (n != len)
1706 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001707#else
1708 read_buf = PyString_AsString(buf);
1709 read_length = len;
1710 while (read_length != 0) {
1711 unsigned int segment;
1712
1713 segment = read_length /SEGMENT_SIZE;
1714 if (segment != 0) {
1715 segment = SEGMENT_SIZE;
1716 }
1717 else {
1718 segment = read_length;
1719 }
1720
1721 Py_BEGIN_ALLOW_THREADS
1722 internal_select(s, 0);
1723 n = recv(s->sock_fd, read_buf, segment, flags);
1724 Py_END_ALLOW_THREADS
1725
1726 if (n < 0) {
1727 Py_DECREF(buf);
1728 return s->errorhandler();
1729 }
1730 if (n != read_length) {
1731 read_buf += n;
1732 break;
1733 }
1734
1735 read_length -= segment;
1736 read_buf += segment;
1737 }
1738 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1739 {
1740 return NULL;
1741 }
1742#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001743 return buf;
1744}
1745
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001746PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001747"recv(buffersize[, flags]) -> data\n\
1748\n\
1749Receive up to buffersize bytes from the socket. For the optional flags\n\
1750argument, see the Unix manual. When no data is available, block until\n\
1751at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001752the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001753
Guido van Rossum30a685f1991-06-27 15:51:29 +00001754
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001755/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001756
Guido van Rossum73624e91994-10-10 17:59:00 +00001757static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001758sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001759{
1760 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001761 PyObject *buf = NULL;
1762 PyObject *addr = NULL;
1763 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001764 int len, n, flags = 0;
1765 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001766
Guido van Rossum43713e52000-02-29 13:59:29 +00001767 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001768 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001769
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001770 if (!getsockaddrlen(s, &addrlen))
1771 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001772 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001773 if (buf == NULL)
1774 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001775
Guido van Rossum73624e91994-10-10 17:59:00 +00001776 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001777 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001778 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001779 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001780#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001781#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001782 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001783#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001784 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001785#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001786#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001787 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001788#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001789 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001790 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001791
Guido van Rossum7c53b771995-09-13 18:39:47 +00001792 if (n < 0) {
1793 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001794 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001795 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001796
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001797 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001798 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001799
Guido van Rossum67f7a382002-06-06 21:08:16 +00001800 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001801 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001802 goto finally;
1803
Guido van Rossum73624e91994-10-10 17:59:00 +00001804 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001805
1806finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001807 Py_XDECREF(addr);
1808 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001809 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001810}
1811
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001812PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001813"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1814\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001815Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001816
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001817/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001818
Guido van Rossum73624e91994-10-10 17:59:00 +00001819static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001820sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001821{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001822 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001823 int len, n, flags = 0;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001824#ifdef __VMS
1825 int send_length;
1826#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001827
Guido van Rossum43713e52000-02-29 13:59:29 +00001828 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001829 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001830
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001831#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001832 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001833 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001834 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001835 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001836
Guido van Rossum30a685f1991-06-27 15:51:29 +00001837 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001838 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001839#else
1840 /* Divide packet into smaller segments for */
1841 /* TCP/IP Services for OpenVMS */
1842 send_length = len;
1843 while (send_length != 0) {
1844 unsigned int segment;
1845
1846 segment = send_length / SEGMENT_SIZE;
1847 if (segment != 0) {
1848 segment = SEGMENT_SIZE;
1849 }
1850 else {
1851 segment = send_length;
1852 }
1853 Py_BEGIN_ALLOW_THREADS
1854 internal_select(s, 1);
1855 n = send(s->sock_fd, buf, segment, flags);
1856 Py_END_ALLOW_THREADS
1857 if (n < 0) {
1858 return s->errorhandler();
1859 }
1860 send_length -= segment;
1861 buf += segment;
1862 } /* end while */
1863#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001864 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001865}
1866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001867PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001868"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001869\n\
1870Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001871argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001872sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001873
1874
1875/* s.sendall(data [,flags]) method */
1876
1877static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001878sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001879{
1880 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001881 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001882
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001883 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1884 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001885
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001886 Py_BEGIN_ALLOW_THREADS
1887 do {
Guido van Rossum8f24cdc2003-01-31 18:15:58 +00001888 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001889 n = send(s->sock_fd, buf, len, flags);
1890 if (n < 0)
1891 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001892 buf += n;
1893 len -= n;
1894 } while (len > 0);
1895 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001896
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001897 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001898 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001899
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001900 Py_INCREF(Py_None);
1901 return Py_None;
1902}
1903
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001904PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001905"sendall(data[, flags])\n\
1906\n\
1907Send a data string to the socket. For the optional flags\n\
1908argument, see the Unix manual. This calls send() repeatedly\n\
1909until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001910to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001911
Guido van Rossum30a685f1991-06-27 15:51:29 +00001912
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001913/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001914
Guido van Rossum73624e91994-10-10 17:59:00 +00001915static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001916sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001917{
Guido van Rossum73624e91994-10-10 17:59:00 +00001918 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001919 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001920 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001921 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001922
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001923 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001924 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001925 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001926 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1927 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001928 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001929 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001930
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001931 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001932 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001933
Guido van Rossum73624e91994-10-10 17:59:00 +00001934 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001935 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001936 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001937 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001938
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001939 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001940 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001941 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001942}
1943
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001944PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001945"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001946\n\
1947Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001948For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001949
Guido van Rossum30a685f1991-06-27 15:51:29 +00001950
1951/* s.shutdown(how) method */
1952
Guido van Rossum73624e91994-10-10 17:59:00 +00001953static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001954sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001955{
1956 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001957 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001958
1959 how = PyInt_AsLong(arg);
1960 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001961 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001962 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001963 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001964 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001965 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001966 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001967 Py_INCREF(Py_None);
1968 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001969}
1970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001971PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001972"shutdown(flag)\n\
1973\n\
1974Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001975of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001976
Guido van Rossum30a685f1991-06-27 15:51:29 +00001977
1978/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001979
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001980static PyMethodDef sock_methods[] = {
1981 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001982 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001983 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001984 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001985 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001986 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001987 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001988 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001989 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001990 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001991#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001992 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001993 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001994#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001995 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001996 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001997#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001998 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001999 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002000#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002001 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002002 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002003 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002004 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002005 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002006 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002007#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002008 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002009 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002010#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002011 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002012 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002013 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002014 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002015 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002016 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002017 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002018 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002019 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002020 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002021 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002022 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002023 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002024 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002025 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002026 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002027 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002028 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002029 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002030 shutdown_doc},
2031#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002032 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002033 sleeptaskw_doc},
2034#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002035 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002036};
2037
Guido van Rossum30a685f1991-06-27 15:51:29 +00002038
Guido van Rossum73624e91994-10-10 17:59:00 +00002039/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002040 First close the file description. */
2041
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002042static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002043sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002044{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002045 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002046 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002047 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002048}
2049
Guido van Rossum30a685f1991-06-27 15:51:29 +00002050
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002051static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002052sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002053{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002054 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002055#if SIZEOF_SOCKET_T > SIZEOF_LONG
2056 if (s->sock_fd > LONG_MAX) {
2057 /* this can occur on Win64, and actually there is a special
2058 ugly printf formatter for decimal pointer length integer
2059 printing, only bother if necessary*/
2060 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002061 "no printf formatter to display "
2062 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002063 return NULL;
2064 }
2065#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002066 PyOS_snprintf(
2067 buf, sizeof(buf),
2068 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2069 (long)s->sock_fd, s->sock_family,
2070 s->sock_type,
2071 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002072 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002073}
2074
2075
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002076/* Create a new, uninitialized socket object. */
2077
2078static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002079sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002080{
2081 PyObject *new;
2082
2083 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002084 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002085 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002086 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002087 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002088 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002089 return new;
2090}
2091
2092
2093/* Initialize a new socket object. */
2094
2095/*ARGSUSED*/
2096static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002097sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002098{
2099 PySocketSockObject *s = (PySocketSockObject *)self;
2100 SOCKET_T fd;
2101 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2102 static char *keywords[] = {"family", "type", "proto", 0};
2103
2104 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2105 "|iii:socket", keywords,
2106 &family, &type, &proto))
2107 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002108
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002109 Py_BEGIN_ALLOW_THREADS
2110 fd = socket(family, type, proto);
2111 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002112
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002113#ifdef MS_WINDOWS
2114 if (fd == INVALID_SOCKET)
2115#else
2116 if (fd < 0)
2117#endif
2118 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002119 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002120 return -1;
2121 }
2122 init_sockobject(s, fd, family, type, proto);
2123 /* From now on, ignore SIGPIPE and let the error checking
2124 do the work. */
2125#ifdef SIGPIPE
2126 (void) signal(SIGPIPE, SIG_IGN);
2127#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002128
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002129 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002130
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002131}
2132
2133
Guido van Rossumb6775db1994-08-01 11:34:53 +00002134/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002135
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002136static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002137 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002138 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002139 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002140 sizeof(PySocketSockObject), /* tp_basicsize */
2141 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002142 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002143 0, /* tp_print */
2144 0, /* tp_getattr */
2145 0, /* tp_setattr */
2146 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002147 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002148 0, /* tp_as_number */
2149 0, /* tp_as_sequence */
2150 0, /* tp_as_mapping */
2151 0, /* tp_hash */
2152 0, /* tp_call */
2153 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002154 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002155 0, /* tp_setattro */
2156 0, /* tp_as_buffer */
2157 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002158 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002159 0, /* tp_traverse */
2160 0, /* tp_clear */
2161 0, /* tp_richcompare */
2162 0, /* tp_weaklistoffset */
2163 0, /* tp_iter */
2164 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002165 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002166 0, /* tp_members */
2167 0, /* tp_getset */
2168 0, /* tp_base */
2169 0, /* tp_dict */
2170 0, /* tp_descr_get */
2171 0, /* tp_descr_set */
2172 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002173 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002174 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002175 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002176 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002177};
2178
Guido van Rossum30a685f1991-06-27 15:51:29 +00002179
Guido van Rossum81194471991-07-27 21:42:02 +00002180/* Python interface to gethostname(). */
2181
2182/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002183static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002184socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002185{
2186 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002187 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002188 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002189 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002190 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002191 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002192 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002193 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002194 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002195 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002196 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002197}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002198
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002199PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002200"gethostname() -> string\n\
2201\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002202Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002203
Guido van Rossumff4949e1992-08-05 19:58:53 +00002204
Guido van Rossum30a685f1991-06-27 15:51:29 +00002205/* Python interface to gethostbyname(name). */
2206
2207/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002208static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002209socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002210{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002211 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002212#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002213 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002214#else
2215 struct sockaddr_in addrbuf;
2216#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002217
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002218 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002219 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002220 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002221 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002222 return makeipaddr((struct sockaddr *)&addrbuf,
2223 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002224}
2225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002226PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002227"gethostbyname(host) -> address\n\
2228\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002229Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002230
2231
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002232/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2233
2234static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002235gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002236{
2237 char **pch;
2238 PyObject *rtn_tuple = (PyObject *)NULL;
2239 PyObject *name_list = (PyObject *)NULL;
2240 PyObject *addr_list = (PyObject *)NULL;
2241 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002242
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002243 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002244 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002245#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002246 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002247#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002248 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002249#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002250 return NULL;
2251 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002252
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002253 if (h->h_addrtype != af) {
2254#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002255 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002256 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002257 (char *)strerror(EAFNOSUPPORT));
2258#else
2259 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002260 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002261 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002262#endif
2263 return NULL;
2264 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002265
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002266 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002267
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002268 case AF_INET:
2269 if (alen < sizeof(struct sockaddr_in))
2270 return NULL;
2271 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002272
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002273#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002274 case AF_INET6:
2275 if (alen < sizeof(struct sockaddr_in6))
2276 return NULL;
2277 break;
2278#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002279
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002280 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002281
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002282 if ((name_list = PyList_New(0)) == NULL)
2283 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002284
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002285 if ((addr_list = PyList_New(0)) == NULL)
2286 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002287
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002288 for (pch = h->h_aliases; *pch != NULL; pch++) {
2289 int status;
2290 tmp = PyString_FromString(*pch);
2291 if (tmp == NULL)
2292 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002293
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002294 status = PyList_Append(name_list, tmp);
2295 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002296
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002297 if (status)
2298 goto err;
2299 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002300
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002301 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2302 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002303
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002304 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002305
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002306 case AF_INET:
2307 {
2308 struct sockaddr_in sin;
2309 memset(&sin, 0, sizeof(sin));
2310 sin.sin_family = af;
2311#ifdef HAVE_SOCKADDR_SA_LEN
2312 sin.sin_len = sizeof(sin);
2313#endif
2314 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2315 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002316
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002317 if (pch == h->h_addr_list && alen >= sizeof(sin))
2318 memcpy((char *) addr, &sin, sizeof(sin));
2319 break;
2320 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002321
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002322#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002323 case AF_INET6:
2324 {
2325 struct sockaddr_in6 sin6;
2326 memset(&sin6, 0, sizeof(sin6));
2327 sin6.sin6_family = af;
2328#ifdef HAVE_SOCKADDR_SA_LEN
2329 sin6.sin6_len = sizeof(sin6);
2330#endif
2331 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2332 tmp = makeipaddr((struct sockaddr *)&sin6,
2333 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002334
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002335 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2336 memcpy((char *) addr, &sin6, sizeof(sin6));
2337 break;
2338 }
2339#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002340
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002341 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002342 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002343 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002344 return NULL;
2345 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002346
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002347 if (tmp == NULL)
2348 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002349
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002350 status = PyList_Append(addr_list, tmp);
2351 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002352
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002353 if (status)
2354 goto err;
2355 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002356
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002357 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002358
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002359 err:
2360 Py_XDECREF(name_list);
2361 Py_XDECREF(addr_list);
2362 return rtn_tuple;
2363}
2364
2365
2366/* Python interface to gethostbyname_ex(name). */
2367
2368/*ARGSUSED*/
2369static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002370socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002371{
2372 char *name;
2373 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002374#ifdef ENABLE_IPV6
2375 struct sockaddr_storage addr;
2376#else
2377 struct sockaddr_in addr;
2378#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002379 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002380 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002381#ifdef HAVE_GETHOSTBYNAME_R
2382 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002383#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2384 struct hostent_data data;
2385#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002386 char buf[16384];
2387 int buf_len = (sizeof buf) - 1;
2388 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002389#endif
2390#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002391 int result;
2392#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002393#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002394
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002395 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002396 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002397 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002398 return NULL;
2399 Py_BEGIN_ALLOW_THREADS
2400#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002401#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002402 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2403 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002404#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002405 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002406#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002407 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002408 result = gethostbyname_r(name, &hp_allocated, &data);
2409 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002410#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002411#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002412#ifdef USE_GETHOSTBYNAME_LOCK
2413 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002414#endif
2415 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002416#endif /* HAVE_GETHOSTBYNAME_R */
2417 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002418 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002419 addr.ss_family.
2420 Therefore, we cast the sockaddr_storage into sockaddr to
2421 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002422 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002423 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002424 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002425#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002426 PyThread_release_lock(gethostbyname_lock);
2427#endif
2428 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002429}
2430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002431PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002432"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2433\n\
2434Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002435for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002436
2437
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002438/* Python interface to gethostbyaddr(IP). */
2439
2440/*ARGSUSED*/
2441static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002442socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002443{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002444#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002445 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002446#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002447 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002448#endif
2449 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002450 char *ip_num;
2451 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002452 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002453#ifdef HAVE_GETHOSTBYNAME_R
2454 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002455#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2456 struct hostent_data data;
2457#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002458 char buf[16384];
2459 int buf_len = (sizeof buf) - 1;
2460 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002461#endif
2462#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002463 int result;
2464#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002465#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002466 char *ap;
2467 int al;
2468 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002469
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002470 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002471 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002472 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002473 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002474 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002475 af = sa->sa_family;
2476 ap = NULL;
2477 al = 0;
2478 switch (af) {
2479 case AF_INET:
2480 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2481 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2482 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002483#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002484 case AF_INET6:
2485 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2486 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2487 break;
2488#endif
2489 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002490 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002491 return NULL;
2492 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002493 Py_BEGIN_ALLOW_THREADS
2494#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002495#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002496 result = gethostbyaddr_r(ap, al, af,
2497 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002498 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002499#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002500 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002501 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002502#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002503 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002504 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002505 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002506#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002507#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002508#ifdef USE_GETHOSTBYNAME_LOCK
2509 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002510#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002511 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002512#endif /* HAVE_GETHOSTBYNAME_R */
2513 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002514 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002515#ifdef USE_GETHOSTBYNAME_LOCK
2516 PyThread_release_lock(gethostbyname_lock);
2517#endif
2518 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002519}
2520
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002521PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002522"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2523\n\
2524Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002526
Guido van Rossum30a685f1991-06-27 15:51:29 +00002527
2528/* Python interface to getservbyname(name).
2529 This only returns the port number, since the other info is already
2530 known or not useful (like the list of aliases). */
2531
2532/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002533static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002534socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002535{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002536 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002537 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002538 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002539 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002540 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002541 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002542 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002543 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002544 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002545 return NULL;
2546 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002547 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002548}
2549
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002550PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002551"getservbyname(servicename, protocolname) -> integer\n\
2552\n\
2553Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002554The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002555
Guido van Rossum30a685f1991-06-27 15:51:29 +00002556
Guido van Rossum3901d851996-12-19 16:35:04 +00002557/* Python interface to getprotobyname(name).
2558 This only returns the protocol number, since the other info is
2559 already known or not useful (like the list of aliases). */
2560
2561/*ARGSUSED*/
2562static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002563socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002564{
2565 char *name;
2566 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002567#ifdef __BEOS__
2568/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002569 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002570 return NULL;
2571#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002572 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002573 return NULL;
2574 Py_BEGIN_ALLOW_THREADS
2575 sp = getprotobyname(name);
2576 Py_END_ALLOW_THREADS
2577 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002578 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002579 return NULL;
2580 }
2581 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002582#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002583}
2584
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002585PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002586"getprotobyname(name) -> integer\n\
2587\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002588Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002589
Guido van Rossum3901d851996-12-19 16:35:04 +00002590
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002591#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002592/* Create a socket object from a numeric file description.
2593 Useful e.g. if stdin is a socket.
2594 Additional arguments as for socket(). */
2595
2596/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002597static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002598socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002599{
Guido van Rossum73624e91994-10-10 17:59:00 +00002600 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002601 SOCKET_T fd;
2602 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002603 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2604 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002605 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002606 /* Dup the fd so it and the socket can be closed independently */
2607 fd = dup(fd);
2608 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002609 return set_error();
2610 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002611 /* From now on, ignore SIGPIPE and let the error checking
2612 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002613#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002614 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002615#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002616 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002617}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002618
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002619PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002620"fromfd(fd, family, type[, proto]) -> socket object\n\
2621\n\
2622Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002623The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002624
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002625#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002626
Guido van Rossum82a5c661998-07-07 20:45:43 +00002627
Guido van Rossum006bf911996-06-12 04:04:55 +00002628static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002629socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002630{
2631 int x1, x2;
2632
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002633 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002634 return NULL;
2635 }
2636 x2 = (int)ntohs((short)x1);
2637 return PyInt_FromLong(x2);
2638}
2639
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002640PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002641"ntohs(integer) -> integer\n\
2642\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002643Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002644
2645
Guido van Rossum006bf911996-06-12 04:04:55 +00002646static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002647socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002648{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002649 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002650
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002651 if (PyInt_Check(arg)) {
2652 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002653 if (x == (unsigned long) -1 && PyErr_Occurred())
2654 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002655 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002656 else if (PyLong_Check(arg)) {
2657 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002658 if (x == (unsigned long) -1 && PyErr_Occurred())
2659 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002660#if SIZEOF_LONG > 4
2661 {
2662 unsigned long y;
2663 /* only want the trailing 32 bits */
2664 y = x & 0xFFFFFFFFUL;
2665 if (y ^ x)
2666 return PyErr_Format(PyExc_OverflowError,
2667 "long int larger than 32 bits");
2668 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002669 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002670#endif
2671 }
2672 else
Tim Peters58141872002-08-06 22:25:02 +00002673 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002674 "expected int/long, %s found",
2675 arg->ob_type->tp_name);
2676 if (x == (unsigned long) -1 && PyErr_Occurred())
2677 return NULL;
2678 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002679}
2680
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002681PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002682"ntohl(integer) -> integer\n\
2683\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002684Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002685
2686
Guido van Rossum006bf911996-06-12 04:04:55 +00002687static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002688socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002689{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002690 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002691
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002692 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002693 return NULL;
2694 }
2695 x2 = (int)htons((short)x1);
2696 return PyInt_FromLong(x2);
2697}
2698
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002699PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002700"htons(integer) -> integer\n\
2701\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002702Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002703
2704
Guido van Rossum006bf911996-06-12 04:04:55 +00002705static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002706socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002707{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002708 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002709
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002710 if (PyInt_Check(arg)) {
2711 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002712 if (x == (unsigned long) -1 && PyErr_Occurred())
2713 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002714 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002715 else if (PyLong_Check(arg)) {
2716 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002717 if (x == (unsigned long) -1 && PyErr_Occurred())
2718 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002719#if SIZEOF_LONG > 4
2720 {
2721 unsigned long y;
2722 /* only want the trailing 32 bits */
2723 y = x & 0xFFFFFFFFUL;
2724 if (y ^ x)
2725 return PyErr_Format(PyExc_OverflowError,
2726 "long int larger than 32 bits");
2727 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002728 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002729#endif
2730 }
2731 else
Tim Peters58141872002-08-06 22:25:02 +00002732 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002733 "expected int/long, %s found",
2734 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002735 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002736}
2737
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002738PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002739"htonl(integer) -> integer\n\
2740\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002741Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002742
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002743/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002745PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002746"inet_aton(string) -> packed 32-bit IP representation\n\
2747\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002748Convert 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 +00002749binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002750
2751static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002752socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002753{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002754#ifndef INADDR_NONE
2755#define INADDR_NONE (-1)
2756#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002757#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002758 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002759#else
2760 /* Have to use inet_addr() instead */
2761 unsigned long packed_addr;
2762#endif
2763 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002764
Tim Peters1df9fdd2003-02-13 03:13:40 +00002765 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002766 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002767
Tim Peters1df9fdd2003-02-13 03:13:40 +00002768
2769#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002770 if (inet_aton(ip_addr, &buf))
2771 return PyString_FromStringAndSize((char *)(&buf),
2772 sizeof(buf));
2773
2774 PyErr_SetString(socket_error,
2775 "illegal IP address string passed to inet_aton");
2776 return NULL;
2777
Tim Peters1df9fdd2003-02-13 03:13:40 +00002778#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002779 /* XXX Problem here: inet_aton('255.255.255.255') raises
2780 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002781 packed_addr = inet_addr(ip_addr);
2782
2783 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002784 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002785 "illegal IP address string passed to inet_aton");
2786 return NULL;
2787 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002788 return PyString_FromStringAndSize((char *) &packed_addr,
2789 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002790#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002791}
2792
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002793PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002794"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002795\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002796Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002797
2798static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002799socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002800{
2801 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002802 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002803 struct in_addr packed_addr;
2804
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002805 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002806 return NULL;
2807 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002808
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002809 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002810 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002811 "packed IP wrong length for inet_ntoa");
2812 return NULL;
2813 }
2814
2815 memcpy(&packed_addr, packed_str, addr_len);
2816
2817 return PyString_FromString(inet_ntoa(packed_addr));
2818}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002819
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002820#ifdef HAVE_INET_PTON
2821
2822PyDoc_STRVAR(inet_pton_doc,
2823"inet_pton(af, ip) -> packed IP address string\n\
2824\n\
2825Convert an IP address from string format to a packed string suitable\n\
2826for use with low-level network functions.");
2827
2828static PyObject *
2829socket_inet_pton(PyObject *self, PyObject *args)
2830{
2831 int af;
2832 char* ip;
2833 int retval;
2834 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
2835
2836 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
2837 return NULL;
2838 }
2839
2840 retval = inet_pton(af, ip, packed);
2841 if (retval < 0) {
2842 PyErr_SetFromErrno(socket_error);
2843 return NULL;
2844 } else if (retval == 0) {
2845 PyErr_SetString(socket_error,
2846 "illegal IP address string passed to inet_pton");
2847 return NULL;
2848 } else if (af == AF_INET) {
2849 return PyString_FromStringAndSize(packed,
2850 sizeof(struct in_addr));
2851 } else if (af == AF_INET6) {
2852 return PyString_FromStringAndSize(packed,
2853 sizeof(struct in6_addr));
2854 } else {
2855 PyErr_SetString(socket_error, "unknown address family");
2856 return NULL;
2857 }
2858}
2859
2860PyDoc_STRVAR(inet_ntop_doc,
2861"inet_ntop(af, packed_ip) -> string formatted IP address\n\
2862\n\
2863Convert a packed IP address of the given family to string format.");
2864
2865static PyObject *
2866socket_inet_ntop(PyObject *self, PyObject *args)
2867{
2868 int af;
2869 char* packed;
2870 int len;
2871 const char* retval;
2872 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
2873
2874 /* Guarantee NUL-termination for PyString_FromString() below */
2875 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
2876
2877 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
2878 return NULL;
2879 }
2880
2881 if (af == AF_INET) {
2882 if (len != sizeof(struct in_addr)) {
2883 PyErr_SetString(PyExc_ValueError,
2884 "invalid length of packed IP address string");
2885 return NULL;
2886 }
2887 } else if (af == AF_INET6) {
2888 if (len != sizeof(struct in6_addr)) {
2889 PyErr_SetString(PyExc_ValueError,
2890 "invalid length of packed IP address string");
2891 return NULL;
2892 }
2893 } else {
2894 PyErr_Format(PyExc_ValueError,
2895 "unknown address family %d", af);
2896 return NULL;
2897 }
2898
2899 retval = inet_ntop(af, packed, ip, sizeof(ip));
2900 if (!retval) {
2901 PyErr_SetFromErrno(socket_error);
2902 return NULL;
2903 } else {
2904 return PyString_FromString(retval);
2905 }
2906
2907 /* NOTREACHED */
2908 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
2909 return NULL;
2910}
2911
2912#endif /* HAVE_INET_PTON */
2913
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002914/* Python interface to getaddrinfo(host, port). */
2915
2916/*ARGSUSED*/
2917static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002918socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002919{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002920 struct addrinfo hints, *res;
2921 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002922 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002923 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002924 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002925 char *hptr, *pptr;
2926 int family, socktype, protocol, flags;
2927 int error;
2928 PyObject *all = (PyObject *)NULL;
2929 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002930 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002931
2932 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002933 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002934 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
2935 &hobj, &pobj, &family, &socktype,
2936 &protocol, &flags)) {
2937 return NULL;
2938 }
2939 if (hobj == Py_None) {
2940 hptr = NULL;
2941 } else if (PyUnicode_Check(hobj)) {
2942 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
2943 if (!idna)
2944 return NULL;
2945 hptr = PyString_AsString(idna);
2946 } else if (PyString_Check(hobj)) {
2947 hptr = PyString_AsString(hobj);
2948 } else {
2949 PyErr_SetString(PyExc_TypeError,
2950 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002951 return NULL;
2952 }
2953 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002954 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002955 pptr = pbuf;
2956 } else if (PyString_Check(pobj)) {
2957 pptr = PyString_AsString(pobj);
2958 } else if (pobj == Py_None) {
2959 pptr = (char *)NULL;
2960 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002961 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002962 return NULL;
2963 }
2964 memset(&hints, 0, sizeof(hints));
2965 hints.ai_family = family;
2966 hints.ai_socktype = socktype;
2967 hints.ai_protocol = protocol;
2968 hints.ai_flags = flags;
2969 error = getaddrinfo(hptr, pptr, &hints, &res0);
2970 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002971 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002972 return NULL;
2973 }
2974
2975 if ((all = PyList_New(0)) == NULL)
2976 goto err;
2977 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002978 PyObject *addr =
2979 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2980 if (addr == NULL)
2981 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002982 single = Py_BuildValue("iiisO", res->ai_family,
2983 res->ai_socktype, res->ai_protocol,
2984 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002985 addr);
2986 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002987 if (single == NULL)
2988 goto err;
2989
2990 if (PyList_Append(all, single))
2991 goto err;
2992 Py_XDECREF(single);
2993 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00002994 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00002995 if (res0)
2996 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002997 return all;
2998 err:
2999 Py_XDECREF(single);
3000 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003001 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003002 if (res0)
3003 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003004 return (PyObject *)NULL;
3005}
3006
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003007PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003008"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3009 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003010\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003011Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003012
3013/* Python interface to getnameinfo(sa, flags). */
3014
3015/*ARGSUSED*/
3016static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003017socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003018{
3019 PyObject *sa = (PyObject *)NULL;
3020 int flags;
3021 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003022 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003023 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3024 struct addrinfo hints, *res = NULL;
3025 int error;
3026 PyObject *ret = (PyObject *)NULL;
3027
3028 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003029 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003030 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003031 if (!PyArg_ParseTuple(sa, "si|ii",
3032 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003033 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003034 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003035 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003036 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003037 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003038 error = getaddrinfo(hostp, pbuf, &hints, &res);
3039 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003040 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003041 goto fail;
3042 }
3043 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003044 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003045 "sockaddr resolved to multiple addresses");
3046 goto fail;
3047 }
3048 switch (res->ai_family) {
3049 case AF_INET:
3050 {
3051 char *t1;
3052 int t2;
3053 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003054 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003055 "IPv4 sockaddr must be 2 tuple");
3056 goto fail;
3057 }
3058 break;
3059 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003060#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003061 case AF_INET6:
3062 {
3063 struct sockaddr_in6 *sin6;
3064 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3065 sin6->sin6_flowinfo = flowinfo;
3066 sin6->sin6_scope_id = scope_id;
3067 break;
3068 }
3069#endif
3070 }
3071 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3072 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3073 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003074 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003075 goto fail;
3076 }
3077 ret = Py_BuildValue("ss", hbuf, pbuf);
3078
3079fail:
3080 if (res)
3081 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003082 return ret;
3083}
3084
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003085PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003086"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003087\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003088Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003089
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003090
3091/* Python API to getting and setting the default timeout value. */
3092
3093static PyObject *
3094socket_getdefaulttimeout(PyObject *self)
3095{
3096 if (defaulttimeout < 0.0) {
3097 Py_INCREF(Py_None);
3098 return Py_None;
3099 }
3100 else
3101 return PyFloat_FromDouble(defaulttimeout);
3102}
3103
3104PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003105"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003106\n\
3107Returns the default timeout in floating seconds for new socket objects.\n\
3108A value of None indicates that new socket objects have no timeout.\n\
3109When the socket module is first imported, the default is None.");
3110
3111static PyObject *
3112socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3113{
3114 double timeout;
3115
3116 if (arg == Py_None)
3117 timeout = -1.0;
3118 else {
3119 timeout = PyFloat_AsDouble(arg);
3120 if (timeout < 0.0) {
3121 if (!PyErr_Occurred())
3122 PyErr_SetString(PyExc_ValueError,
3123 "Timeout value out of range");
3124 return NULL;
3125 }
3126 }
3127
3128 defaulttimeout = timeout;
3129
3130 Py_INCREF(Py_None);
3131 return Py_None;
3132}
3133
3134PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003135"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003136\n\
3137Set the default timeout in floating seconds for new socket objects.\n\
3138A value of None indicates that new socket objects have no timeout.\n\
3139When the socket module is first imported, the default is None.");
3140
3141
Guido van Rossum30a685f1991-06-27 15:51:29 +00003142/* List of functions exported by this module. */
3143
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003144static PyMethodDef socket_methods[] = {
3145 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003146 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003147 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003148 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003149 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003150 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003151 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003152 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003153 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003154 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003155 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003156 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003157#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003158 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003159 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003160#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003161 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003162 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003163 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003164 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003165 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003166 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003167 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003168 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003169 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003170 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003171 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003172 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003173#ifdef HAVE_INET_PTON
3174 {"inet_pton", socket_inet_pton,
3175 METH_VARARGS, inet_pton_doc},
3176 {"inet_ntop", socket_inet_ntop,
3177 METH_VARARGS, inet_ntop_doc},
3178#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003179 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003180 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003181 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003182 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003183 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003184 METH_NOARGS, getdefaulttimeout_doc},
3185 {"setdefaulttimeout", socket_setdefaulttimeout,
3186 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003187 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003188};
3189
Guido van Rossum30a685f1991-06-27 15:51:29 +00003190
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003191#ifdef RISCOS
3192#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003193
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003194static int
3195os_init(void)
3196{
3197 _kernel_swi_regs r;
3198
3199 r.r[0] = 0;
3200 _kernel_swi(0x43380, &r, &r);
3201 taskwindow = r.r[0];
3202
3203 return 0;
3204}
3205
3206#endif /* RISCOS */
3207
3208
3209#ifdef MS_WINDOWS
3210#define OS_INIT_DEFINED
3211
3212/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003213
3214static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003215os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003216{
3217 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003218}
3219
3220static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003221os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003222{
3223 WSADATA WSAData;
3224 int ret;
3225 char buf[100];
3226 ret = WSAStartup(0x0101, &WSAData);
3227 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003228 case 0: /* No error */
3229 atexit(os_cleanup);
3230 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003231 case WSASYSNOTREADY:
3232 PyErr_SetString(PyExc_ImportError,
3233 "WSAStartup failed: network not ready");
3234 break;
3235 case WSAVERNOTSUPPORTED:
3236 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003237 PyErr_SetString(
3238 PyExc_ImportError,
3239 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003240 break;
3241 default:
Tim Peters885d4572001-11-28 20:27:42 +00003242 PyOS_snprintf(buf, sizeof(buf),
3243 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003244 PyErr_SetString(PyExc_ImportError, buf);
3245 break;
3246 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003247 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003248}
3249
Guido van Rossum8d665e61996-06-26 18:22:49 +00003250#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003251
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003252
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003253#ifdef PYOS_OS2
3254#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003255
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003256/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003257
3258static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003259os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003260{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003261#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003262 char reason[64];
3263 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003264
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003265 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003266 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003267 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003268
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003269 PyOS_snprintf(reason, sizeof(reason),
3270 "OS/2 TCP/IP Error# %d", sock_errno());
3271 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003272
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003273 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003274#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003275 /* No need to initialise sockets with GCC/EMX */
3276 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003277#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003278}
3279
3280#endif /* PYOS_OS2 */
3281
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003282
3283#ifndef OS_INIT_DEFINED
3284static int
3285os_init(void)
3286{
3287 return 1; /* Success */
3288}
3289#endif
3290
3291
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003292/* C API table - always add new things to the end for binary
3293 compatibility. */
3294static
3295PySocketModule_APIObject PySocketModuleAPI =
3296{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003297 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003298};
3299
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003300
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003301/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003302
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003303 This module is actually called "_socket", and there's a wrapper
3304 "socket.py" which implements some additional functionality. On some
3305 platforms (e.g. Windows and OS/2), socket.py also implements a
3306 wrapper for the socket type that provides missing functionality such
3307 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3308 with an ImportError exception if os-specific initialization fails.
3309 On Windows, this does WINSOCK initialization. When WINSOCK is
3310 initialized succesfully, a call to WSACleanup() is scheduled to be
3311 made at exit time.
3312*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003313
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003314PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003315"Implementation module for socket operations.\n\
3316\n\
3317See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003318
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003319PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003320init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003321{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003322 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003323
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003324 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003325 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003326
3327 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003328 m = Py_InitModule3(PySocket_MODULE_NAME,
3329 socket_methods,
3330 socket_doc);
3331
3332 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3333 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003334 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003335 Py_INCREF(socket_error);
3336 PyModule_AddObject(m, "error", socket_error);
3337 socket_herror = PyErr_NewException("socket.herror",
3338 socket_error, NULL);
3339 if (socket_herror == NULL)
3340 return;
3341 Py_INCREF(socket_herror);
3342 PyModule_AddObject(m, "herror", socket_herror);
3343 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003344 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003345 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003346 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003347 Py_INCREF(socket_gaierror);
3348 PyModule_AddObject(m, "gaierror", socket_gaierror);
3349 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003350 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003351 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003352 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003353 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003354 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003355 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003356 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003357
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003358#ifdef ENABLE_IPV6
3359 has_ipv6 = Py_True;
3360#else
3361 has_ipv6 = Py_False;
3362#endif
3363 Py_INCREF(has_ipv6);
3364 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3365
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003366 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003367 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003368 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3369 ) != 0)
3370 return;
3371
Guido van Rossum09be4091999-08-09 14:40:40 +00003372 /* Address families (we only support AF_INET and AF_UNIX) */
3373#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003374 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003375#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003376 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003377#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003378 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003379#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003380#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003381 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003382#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003383#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003384 /* Amateur Radio AX.25 */
3385 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003386#endif
3387#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003388 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003389#endif
3390#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003391 /* Appletalk DDP */
3392 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003393#endif
3394#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003395 /* Amateur radio NetROM */
3396 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003397#endif
3398#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003399 /* Multiprotocol bridge */
3400 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003401#endif
3402#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003403 /* Reserved for Werner's ATM */
3404 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003405#endif
3406#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003407 /* Reserved for X.25 project */
3408 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003409#endif
3410#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003411 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003412#endif
3413#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003414 /* Amateur Radio X.25 PLP */
3415 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003416#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003417#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003418 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3419 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3420 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3421 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3422 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3423 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3424 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3425 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3426 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003427#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003428
3429 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003430 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3431 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003432#ifndef __BEOS__
3433/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003434 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3435 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003436#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003437 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003438#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003439#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003440
3441#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003442 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003443#endif
3444#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003445 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003446#endif
3447#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003448 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003449#endif
3450#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003451 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003452#endif
3453#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003454 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003455#endif
3456#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003457 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003458#endif
3459#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003460 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003461#endif
3462#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003463 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003464#endif
3465#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003466 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003467#endif
3468#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003469 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003470#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003471#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003472 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003473#endif
3474#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003475 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003476#endif
3477#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003478 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003479#endif
3480#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003481 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003482#endif
3483#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003484 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003485#endif
3486#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003487 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003488#endif
3489#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003490 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003491#endif
3492#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003493 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003494#endif
3495
3496 /* Maximum number of connections for "listen" */
3497#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003498 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003499#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003500 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003501#endif
3502
3503 /* Flags for send, recv */
3504#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003505 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003506#endif
3507#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003508 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003509#endif
3510#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003511 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003512#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003513#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003514 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003515#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003516#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003517 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003518#endif
3519#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003520 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003521#endif
3522#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003523 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003524#endif
3525#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003526 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003527#endif
3528#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003529 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003530#endif
3531#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003532 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003533#endif
3534
3535 /* Protocol level and numbers, usable for [gs]etsockopt */
3536#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003537 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003538#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003539#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003540 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003541#else
Fred Drake4baedc12002-04-01 14:53:37 +00003542 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003543#endif
3544#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003545 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003546#endif
3547#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003548 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003549#endif
3550#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003551 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003552#endif
3553#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003554 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003555#endif
3556#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003557 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003558#endif
3559#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003560 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003561#else
Fred Drake4baedc12002-04-01 14:53:37 +00003562 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003563#endif
3564#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003565 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003566#else
Fred Drake4baedc12002-04-01 14:53:37 +00003567 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003568#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003569#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003570 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003571#else
Fred Drake4baedc12002-04-01 14:53:37 +00003572 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003573#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003574#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003575 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003576#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003577#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003578 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003579#else
Fred Drake4baedc12002-04-01 14:53:37 +00003580 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003581#endif
3582#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003583 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003584#endif
3585#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003586 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003587#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003588#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003589 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003590#endif
3591#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003592 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003593#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003594#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003595 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003596#else
Fred Drake4baedc12002-04-01 14:53:37 +00003597 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003598#endif
3599#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003600 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003601#endif
3602#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003603 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003604#endif
3605#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003606 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003607#else
Fred Drake4baedc12002-04-01 14:53:37 +00003608 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003609#endif
3610#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003611 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003612#endif
3613#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003614 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003615#endif
3616#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003617 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003618#endif
3619#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003620 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003621#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003622#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003623 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003624#endif
3625#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003626 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003627#endif
3628#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003629 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003630#endif
3631#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003632 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003633#endif
3634#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003635 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003636#endif
3637#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003638 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003639#endif
3640#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003641 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003642#endif
3643#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003644 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003645#endif
3646#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003647 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003648#endif
3649#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003650 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003651#endif
3652#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003653 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003654#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003655#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003656 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003657#endif
3658#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003659 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003660#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003661#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003662 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003663#endif
3664#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003665 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003666#endif
3667#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003668 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003669#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003670#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003671 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003672#endif
3673/**/
3674#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003675 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003676#else
Fred Drake4baedc12002-04-01 14:53:37 +00003677 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003678#endif
3679#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003680 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003681#endif
3682
3683 /* Some port configuration */
3684#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003685 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003686#else
Fred Drake4baedc12002-04-01 14:53:37 +00003687 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003688#endif
3689#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003690 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003691#else
Fred Drake4baedc12002-04-01 14:53:37 +00003692 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003693#endif
3694
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003695 /* Some reserved IP v.4 addresses */
3696#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003697 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003698#else
Fred Drake4baedc12002-04-01 14:53:37 +00003699 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003700#endif
3701#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003702 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003703#else
Fred Drake4baedc12002-04-01 14:53:37 +00003704 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003705#endif
3706#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003707 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003708#else
Fred Drake4baedc12002-04-01 14:53:37 +00003709 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003710#endif
3711#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003712 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003713#else
Fred Drake4baedc12002-04-01 14:53:37 +00003714 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003715#endif
3716#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003717 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3718 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003719#else
Fred Drake4baedc12002-04-01 14:53:37 +00003720 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003721#endif
3722#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003723 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3724 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003725#else
Fred Drake4baedc12002-04-01 14:53:37 +00003726 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003727#endif
3728#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003729 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003730#else
Fred Drake4baedc12002-04-01 14:53:37 +00003731 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003732#endif
3733
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003734 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003735#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003736 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003737#endif
3738#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003739 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003740#endif
3741#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003742 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003743#endif
3744#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003745 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003746#endif
3747#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003748 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003749#endif
3750#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003751 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003752#endif
3753#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003754 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003755#endif
3756#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003757 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003758#endif
3759#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003760 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003761#endif
3762#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003763 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003764#endif
3765#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003766 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003767#endif
3768#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003769 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003770#endif
3771#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003772 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003773#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003774#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003775 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3776 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003777#endif
3778#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003779 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3780 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003781#endif
3782#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003783 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003784#endif
3785
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003786 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3787#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003788 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003789#endif
3790#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003791 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003792#endif
3793#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003794 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003795#endif
3796#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003797 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003798#endif
3799#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003800 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003801#endif
3802#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003803 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003804#endif
3805
Guido van Rossum09be4091999-08-09 14:40:40 +00003806 /* TCP options */
3807#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003808 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003809#endif
3810#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003811 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003812#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003813#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003814 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003815#endif
3816#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003817 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003818#endif
3819#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003820 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003821#endif
3822#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003823 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003824#endif
3825#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003826 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003827#endif
3828#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003829 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003830#endif
3831#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003832 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003833#endif
3834#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003835 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003836#endif
3837#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003838 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003839#endif
3840#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003841 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003842#endif
3843
Guido van Rossum09be4091999-08-09 14:40:40 +00003844
3845 /* IPX options */
3846#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003847 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003848#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003849
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003850 /* get{addr,name}info parameters */
3851#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003852 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003853#endif
3854#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003855 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003856#endif
3857#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003858 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003859#endif
3860#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003861 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003862#endif
3863#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003864 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003865#endif
3866#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003867 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003868#endif
3869#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003870 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003871#endif
3872#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003873 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003874#endif
3875#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003876 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003877#endif
3878#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003879 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003880#endif
3881#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003882 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003883#endif
3884#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003885 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003886#endif
3887#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003888 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003889#endif
3890#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003891 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003892#endif
3893#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003894 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003895#endif
3896#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003897 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003898#endif
3899#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003900 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003901#endif
3902#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003903 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003904#endif
3905#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003906 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003907#endif
3908#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003909 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003910#endif
3911#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003912 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003913#endif
3914#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003915 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003916#endif
3917#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003918 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003919#endif
3920#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003921 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003922#endif
3923#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003924 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003925#endif
3926#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003927 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003928#endif
3929#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003930 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003931#endif
3932#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003933 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003934#endif
3935#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003936 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003937#endif
3938#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003939 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003940#endif
3941
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003942 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003943#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003944 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003945#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003946}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003947
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003948
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003949#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003950
3951/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003952/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003953
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003954int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003955inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003956{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003957 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003958 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003959 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003960 if (packed_addr == INADDR_NONE)
3961 return 0;
3962 memcpy(dst, &packed_addr, 4);
3963 return 1;
3964 }
3965 /* Should set errno to EAFNOSUPPORT */
3966 return -1;
3967}
3968
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003969const char *
3970inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003971{
3972 if (af == AF_INET) {
3973 struct in_addr packed_addr;
3974 if (size < 16)
3975 /* Should set errno to ENOSPC. */
3976 return NULL;
3977 memcpy(&packed_addr, src, sizeof(packed_addr));
3978 return strncpy(dst, inet_ntoa(packed_addr), size);
3979 }
3980 /* Should set errno to EAFNOSUPPORT */
3981 return NULL;
3982}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003983
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003984#endif