blob: f107e0b14fcefc079a2105151fe6e4bb37d225c7 [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
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000296/* XXX There's a problem here: *static* functions are not supposed to have
297 a Py prefix (or use CapitalizedWords). Later... */
298
Guido van Rossum30a685f1991-06-27 15:51:29 +0000299/* Global variable holding the exception type for errors detected
300 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000301static PyObject *socket_error;
302static PyObject *socket_herror;
303static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000304
Guido van Rossum48a680c2001-03-02 06:34:14 +0000305#ifdef RISCOS
306/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
307static int taskwindow;
308#endif
309
Tim Peters643a7fc2002-02-17 04:13:21 +0000310/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000311 The sock_type variable contains pointers to various functions,
312 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000313 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000314static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000315
Guido van Rossum30a685f1991-06-27 15:51:29 +0000316/* Convenience function to raise an error according to errno
317 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000318
Guido van Rossum73624e91994-10-10 17:59:00 +0000319static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000320set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000321{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000322#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000323 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000324 static struct {
325 int no;
326 const char *msg;
327 } *msgp, msgs[] = {
328 {WSAEINTR, "Interrupted system call"},
329 {WSAEBADF, "Bad file descriptor"},
330 {WSAEACCES, "Permission denied"},
331 {WSAEFAULT, "Bad address"},
332 {WSAEINVAL, "Invalid argument"},
333 {WSAEMFILE, "Too many open files"},
334 {WSAEWOULDBLOCK,
335 "The socket operation could not complete "
336 "without blocking"},
337 {WSAEINPROGRESS, "Operation now in progress"},
338 {WSAEALREADY, "Operation already in progress"},
339 {WSAENOTSOCK, "Socket operation on non-socket"},
340 {WSAEDESTADDRREQ, "Destination address required"},
341 {WSAEMSGSIZE, "Message too long"},
342 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
343 {WSAENOPROTOOPT, "Protocol not available"},
344 {WSAEPROTONOSUPPORT, "Protocol not supported"},
345 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
346 {WSAEOPNOTSUPP, "Operation not supported"},
347 {WSAEPFNOSUPPORT, "Protocol family not supported"},
348 {WSAEAFNOSUPPORT, "Address family not supported"},
349 {WSAEADDRINUSE, "Address already in use"},
350 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
351 {WSAENETDOWN, "Network is down"},
352 {WSAENETUNREACH, "Network is unreachable"},
353 {WSAENETRESET, "Network dropped connection on reset"},
354 {WSAECONNABORTED, "Software caused connection abort"},
355 {WSAECONNRESET, "Connection reset by peer"},
356 {WSAENOBUFS, "No buffer space available"},
357 {WSAEISCONN, "Socket is already connected"},
358 {WSAENOTCONN, "Socket is not connected"},
359 {WSAESHUTDOWN, "Can't send after socket shutdown"},
360 {WSAETOOMANYREFS, "Too many references: can't splice"},
361 {WSAETIMEDOUT, "Operation timed out"},
362 {WSAECONNREFUSED, "Connection refused"},
363 {WSAELOOP, "Too many levels of symbolic links"},
364 {WSAENAMETOOLONG, "File name too long"},
365 {WSAEHOSTDOWN, "Host is down"},
366 {WSAEHOSTUNREACH, "No route to host"},
367 {WSAENOTEMPTY, "Directory not empty"},
368 {WSAEPROCLIM, "Too many processes"},
369 {WSAEUSERS, "Too many users"},
370 {WSAEDQUOT, "Disc quota exceeded"},
371 {WSAESTALE, "Stale NFS file handle"},
372 {WSAEREMOTE, "Too many levels of remote in path"},
373 {WSASYSNOTREADY, "Network subsystem is unvailable"},
374 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
375 {WSANOTINITIALISED,
376 "Successful WSAStartup() not yet performed"},
377 {WSAEDISCON, "Graceful shutdown in progress"},
378 /* Resolver errors */
379 {WSAHOST_NOT_FOUND, "No such host is known"},
380 {WSATRY_AGAIN, "Host not found, or server failed"},
381 {WSANO_RECOVERY, "Unexpected server error encountered"},
382 {WSANO_DATA, "Valid name without requested data"},
383 {WSANO_ADDRESS, "No address, look for MX record"},
384 {0, NULL}
385 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000386 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000387 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000388 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000389
Mark Hammond46a733d2000-07-24 01:45:11 +0000390 for (msgp = msgs; msgp->msg; msgp++) {
391 if (err_no == msgp->no) {
392 msg = msgp->msg;
393 break;
394 }
395 }
396
397 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000398 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000399 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000400 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000401 }
402 return NULL;
403 }
404 else
405#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000406
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000407#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000408 if (sock_errno() != NO_ERROR) {
409 APIRET rc;
410 ULONG msglen;
411 char outbuf[100];
412 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000413
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000414 /* Retrieve socket-related error message from MPTN.MSG file */
415 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
416 myerrorcode - SOCBASEERR + 26,
417 "mptn.msg",
418 &msglen);
419 if (rc == NO_ERROR) {
420 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000421
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000422 /* OS/2 doesn't guarantee a terminator */
423 outbuf[msglen] = '\0';
424 if (strlen(outbuf) > 0) {
425 /* If non-empty msg, trim CRLF */
426 char *lastc = &outbuf[ strlen(outbuf)-1 ];
427 while (lastc > outbuf && isspace(*lastc)) {
428 /* Trim trailing whitespace (CRLF) */
429 *lastc-- = '\0';
430 }
431 }
432 v = Py_BuildValue("(is)", myerrorcode, outbuf);
433 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000434 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000435 Py_DECREF(v);
436 }
437 return NULL;
438 }
439 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000440#endif
441
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000442 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000443}
444
Guido van Rossum30a685f1991-06-27 15:51:29 +0000445
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000446static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000447set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000448{
449 PyObject *v;
450
451#ifdef HAVE_HSTRERROR
452 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
453#else
454 v = Py_BuildValue("(is)", h_error, "host not found");
455#endif
456 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000457 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000458 Py_DECREF(v);
459 }
460
461 return NULL;
462}
463
464
465static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000466set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000467{
468 PyObject *v;
469
Martin v. Löwis272cb402002-03-01 08:31:07 +0000470#ifdef EAI_SYSTEM
471 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000472 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000473 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000474#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000475
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000476#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000477 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000478#else
479 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
480#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000481 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000482 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000483 Py_DECREF(v);
484 }
485
486 return NULL;
487}
488
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000489/* Function to perform the setting of socket blocking mode
490 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000491static int
492internal_setblocking(PySocketSockObject *s, int block)
493{
494#ifndef RISCOS
495#ifndef MS_WINDOWS
496 int delay_flag;
497#endif
498#endif
499
500 Py_BEGIN_ALLOW_THREADS
501#ifdef __BEOS__
502 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000503 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
504 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000505#else
506#ifndef RISCOS
507#ifndef MS_WINDOWS
508#if defined(PYOS_OS2) && !defined(PYCC_GCC)
509 block = !block;
510 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000511#elif defined(__VMS)
512 block = !block;
513 ioctl(s->sock_fd, FIONBIO, (char *)&block);
514#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000515 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
516 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000517 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000518 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000519 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000520 fcntl(s->sock_fd, F_SETFL, delay_flag);
521#endif /* !PYOS_OS2 */
522#else /* MS_WINDOWS */
523 block = !block;
524 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
525#endif /* MS_WINDOWS */
526#endif /* __BEOS__ */
527#endif /* RISCOS */
528 Py_END_ALLOW_THREADS
529
530 /* Since these don't return anything */
531 return 1;
532}
533
Guido van Rossum11ba0942002-06-13 15:07:44 +0000534/* Do a select() on the socket, if necessary (sock_timeout > 0).
535 The argument writing indicates the direction.
536 This does not raise an exception or return a success indicator;
537 we'll let the actual socket call do that. */
538static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000539internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000540{
541 fd_set fds;
542 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000543
Guido van Rossumad654902002-07-19 12:44:59 +0000544 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000545 if (s->sock_timeout <= 0.0)
546 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000547
Guido van Rossumad654902002-07-19 12:44:59 +0000548 /* Guard against closed socket */
549 if (s->sock_fd < 0)
550 return;
551
Guido van Rossum67f7a382002-06-06 21:08:16 +0000552 /* Construct the arguments to select */
553 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000554 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000555 FD_ZERO(&fds);
556 FD_SET(s->sock_fd, &fds);
557
558 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000559 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000560 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000561 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000562 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000563}
564
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000565/* Initialize a new socket object. */
566
Tim Petersa12b4cf2002-07-18 22:38:44 +0000567static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000568
Mark Hammond62b1ab12002-07-23 06:31:15 +0000569PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000570init_sockobject(PySocketSockObject *s,
571 SOCKET_T fd, int family, int type, int proto)
572{
573#ifdef RISCOS
574 int block = 1;
575#endif
576 s->sock_fd = fd;
577 s->sock_family = family;
578 s->sock_type = type;
579 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000580 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000581
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000582 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000583
584 if (defaulttimeout >= 0.0)
585 internal_setblocking(s, 0);
586
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000587#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000588 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000589 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000590#endif
591}
592
593
Guido van Rossum30a685f1991-06-27 15:51:29 +0000594/* Create a new socket object.
595 This just creates the object and initializes it.
596 If the creation fails, return NULL and set an exception (implicit
597 in NEWOBJ()). */
598
Guido van Rossum73624e91994-10-10 17:59:00 +0000599static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000600new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000601{
Guido van Rossum73624e91994-10-10 17:59:00 +0000602 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000603 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000604 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000605 if (s != NULL)
606 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000607 return s;
608}
609
Guido van Rossum30a685f1991-06-27 15:51:29 +0000610
Guido van Rossum48a680c2001-03-02 06:34:14 +0000611/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000612 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000613#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000614PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000615#endif
616
617
Guido van Rossum30a685f1991-06-27 15:51:29 +0000618/* Convert a string specifying a host name or one of a few symbolic
619 names to a numeric IP address. This usually calls gethostbyname()
620 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000621 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000622 an error occurred; then an exception is raised. */
623
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000625setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000627 struct addrinfo hints, *res;
628 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000629 int d1, d2, d3, d4;
630 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000631
Guido van Rossuma376cc51996-12-05 23:43:35 +0000632 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000633 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000634 int siz;
635 memset(&hints, 0, sizeof(hints));
636 hints.ai_family = af;
637 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
638 hints.ai_flags = AI_PASSIVE;
639 error = getaddrinfo(NULL, "0", &hints, &res);
640 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000641 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000642 return -1;
643 }
644 switch (res->ai_family) {
645 case AF_INET:
646 siz = 4;
647 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000648#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000649 case AF_INET6:
650 siz = 16;
651 break;
652#endif
653 default:
654 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000655 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000656 "unsupported address family");
657 return -1;
658 }
659 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000660 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000661 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000662 "wildcard resolved to multiple address");
663 return -1;
664 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000665 if (res->ai_addrlen < addr_ret_size)
666 addr_ret_size = res->ai_addrlen;
667 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000668 freeaddrinfo(res);
669 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000670 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000671 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000672 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000673 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000674 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000675 "address family mismatched");
676 return -1;
677 }
678 sin = (struct sockaddr_in *)addr_ret;
679 memset((void *) sin, '\0', sizeof(*sin));
680 sin->sin_family = AF_INET;
681#ifdef HAVE_SOCKADDR_SA_LEN
682 sin->sin_len = sizeof(*sin);
683#endif
684 sin->sin_addr.s_addr = INADDR_BROADCAST;
685 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000686 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000687 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
688 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
689 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
690 struct sockaddr_in *sin;
691 sin = (struct sockaddr_in *)addr_ret;
692 sin->sin_addr.s_addr = htonl(
693 ((long) d1 << 24) | ((long) d2 << 16) |
694 ((long) d3 << 8) | ((long) d4 << 0));
695 sin->sin_family = AF_INET;
696#ifdef HAVE_SOCKADDR_SA_LEN
697 sin->sin_len = sizeof(*sin);
698#endif
699 return 4;
700 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000701 memset(&hints, 0, sizeof(hints));
702 hints.ai_family = af;
703 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000704#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000705 if (error == EAI_NONAME && af == AF_UNSPEC) {
706 /* On Tru64 V5.1, numeric-to-addr conversion fails
707 if no address family is given. Assume IPv4 for now.*/
708 hints.ai_family = AF_INET;
709 error = getaddrinfo(name, NULL, &hints, &res);
710 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000711#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000712 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000713 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000714 return -1;
715 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000716 if (res->ai_addrlen < addr_ret_size)
717 addr_ret_size = res->ai_addrlen;
718 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000719 freeaddrinfo(res);
720 switch (addr_ret->sa_family) {
721 case AF_INET:
722 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000723#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000724 case AF_INET6:
725 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000726#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000727 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000728 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000729 return -1;
730 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731}
732
Guido van Rossum30a685f1991-06-27 15:51:29 +0000733
Guido van Rossum30a685f1991-06-27 15:51:29 +0000734/* Create a string object representing an IP address.
735 This is always a string of the form 'dd.dd.dd.dd' (with variable
736 size numbers). */
737
Guido van Rossum73624e91994-10-10 17:59:00 +0000738static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000739makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000740{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000741 char buf[NI_MAXHOST];
742 int error;
743
744 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
745 NI_NUMERICHOST);
746 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000747 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000748 return NULL;
749 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000750 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751}
752
753
754/* Create an object representing the given socket address,
755 suitable for passing it back to bind(), connect() etc.
756 The family field of the sockaddr structure is inspected
757 to determine what kind of address it really is. */
758
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000759/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000760static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000761makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000763 if (addrlen == 0) {
764 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000765 Py_INCREF(Py_None);
766 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000767 }
768
Guido van Rossumbcc20741998-08-04 22:53:56 +0000769#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000770 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000771 addr->sa_family = AF_INET;
772#endif
773
Guido van Rossum30a685f1991-06-27 15:51:29 +0000774 switch (addr->sa_family) {
775
776 case AF_INET:
777 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000778 struct sockaddr_in *a;
779 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000780 PyObject *ret = NULL;
781 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000782 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000783 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
784 Py_DECREF(addrobj);
785 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000786 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000787 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000789#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000790 case AF_UNIX:
791 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000792 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000793 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000795#endif /* AF_UNIX */
796
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000797#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000798 case AF_INET6:
799 {
800 struct sockaddr_in6 *a;
801 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
802 PyObject *ret = NULL;
803 if (addrobj) {
804 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000805 ret = Py_BuildValue("Oiii",
806 addrobj,
807 ntohs(a->sin6_port),
808 a->sin6_flowinfo,
809 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000810 Py_DECREF(addrobj);
811 }
812 return ret;
813 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000814#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000815
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000816#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000817 case AF_PACKET:
818 {
819 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
820 char *ifname = "";
821 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000822 /* need to look up interface name give index */
823 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000824 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000825 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000826 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000827 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000828 return Py_BuildValue("shbhs#",
829 ifname,
830 ntohs(a->sll_protocol),
831 a->sll_pkttype,
832 a->sll_hatype,
833 a->sll_addr,
834 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000835 }
836#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000837
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838 /* More cases here... */
839
840 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000841 /* If we don't know the address family, don't raise an
842 exception -- return it as a tuple. */
843 return Py_BuildValue("is#",
844 addr->sa_family,
845 addr->sa_data,
846 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000847
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849}
850
Guido van Rossum30a685f1991-06-27 15:51:29 +0000851
852/* Parse a socket address argument according to the socket object's
853 address family. Return 1 if the address was in the proper format,
854 0 of not. The address is returned through addr_ret, its length
855 through len_ret. */
856
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000857static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000858getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000859 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000861 switch (s->sock_family) {
862
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000863#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000864 case AF_UNIX:
865 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000866 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000867 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000868 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000869 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000870 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000871 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000872 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000873 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000874 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000875 return 0;
876 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000877 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000878 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000879 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000880 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000881 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000882 return 1;
883 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000884#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000885
Guido van Rossum30a685f1991-06-27 15:51:29 +0000886 case AF_INET:
887 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000888 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000889 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000890 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000891 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000892 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000893 PyErr_Format(
894 PyExc_TypeError,
895 "getsockaddrarg: "
896 "AF_INET address must be tuple, not %.500s",
897 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000898 return 0;
899 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000900 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
901 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000902 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000903 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000904 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000905 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000906 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000907 *addr_ret = (struct sockaddr *) addr;
908 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000909 return 1;
910 }
911
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000912#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000913 case AF_INET6:
914 {
915 struct sockaddr_in6* addr;
916 char *host;
917 int port, flowinfo, scope_id;
918 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
919 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +0000920 if (!PyArg_ParseTuple(args, "eti|ii",
921 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000922 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000923 return 0;
924 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000925 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000926 return 0;
927 addr->sin6_family = s->sock_family;
928 addr->sin6_port = htons((short)port);
929 addr->sin6_flowinfo = flowinfo;
930 addr->sin6_scope_id = scope_id;
931 *addr_ret = (struct sockaddr *) addr;
932 *len_ret = sizeof *addr;
933 return 1;
934 }
935#endif
936
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000937#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000938 case AF_PACKET:
939 {
940 struct sockaddr_ll* addr;
941 struct ifreq ifr;
942 char *interfaceName;
943 int protoNumber;
944 int hatype = 0;
945 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000946 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000947
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000948 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
949 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000950 return 0;
951 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
952 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000953 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000954 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000955 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000956 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000957 addr = &(s->sock_addr.ll);
958 addr->sll_family = AF_PACKET;
959 addr->sll_protocol = htons((short)protoNumber);
960 addr->sll_ifindex = ifr.ifr_ifindex;
961 addr->sll_pkttype = pkttype;
962 addr->sll_hatype = hatype;
963 *addr_ret = (struct sockaddr *) addr;
964 *len_ret = sizeof *addr;
965 return 1;
966 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000967#endif
968
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969 /* More cases here... */
970
971 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000972 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000973 return 0;
974
975 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000976}
977
Guido van Rossum30a685f1991-06-27 15:51:29 +0000978
Guido van Rossum48a680c2001-03-02 06:34:14 +0000979/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000980 Return 1 if the family is known, 0 otherwise. The length is returned
981 through len_ret. */
982
983static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000984getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000985{
986 switch (s->sock_family) {
987
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000988#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000989 case AF_UNIX:
990 {
991 *len_ret = sizeof (struct sockaddr_un);
992 return 1;
993 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000994#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000995
996 case AF_INET:
997 {
998 *len_ret = sizeof (struct sockaddr_in);
999 return 1;
1000 }
1001
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001002#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001003 case AF_INET6:
1004 {
1005 *len_ret = sizeof (struct sockaddr_in6);
1006 return 1;
1007 }
1008#endif
1009
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001010#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001011 case AF_PACKET:
1012 {
1013 *len_ret = sizeof (struct sockaddr_ll);
1014 return 1;
1015 }
1016#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001017
Guido van Rossum710e1df1992-06-12 10:39:36 +00001018 /* More cases here... */
1019
1020 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001021 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001022 return 0;
1023
1024 }
1025}
1026
1027
Guido van Rossum30a685f1991-06-27 15:51:29 +00001028/* s.accept() method */
1029
Guido van Rossum73624e91994-10-10 17:59:00 +00001030static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001031sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001032{
1033 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001034 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001035 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001036 PyObject *sock = NULL;
1037 PyObject *addr = NULL;
1038 PyObject *res = NULL;
1039
Guido van Rossum710e1df1992-06-12 10:39:36 +00001040 if (!getsockaddrlen(s, &addrlen))
1041 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001042 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001043
Guido van Rossum73624e91994-10-10 17:59:00 +00001044 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001045 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001046 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001047 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001048
Fred Drakea04eaad2000-06-30 02:46:07 +00001049#ifdef MS_WINDOWS
1050 if (newfd == INVALID_SOCKET)
1051#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001052 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001053#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001054 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001055
Guido van Rossum30a685f1991-06-27 15:51:29 +00001056 /* Create the new object with unspecified family,
1057 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001058 sock = (PyObject *) new_sockobject(newfd,
1059 s->sock_family,
1060 s->sock_type,
1061 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001062
Barry Warsaw752300b1997-01-03 17:18:10 +00001063 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001064 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001065 goto finally;
1066 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001067 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001068 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001069 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001070 goto finally;
1071
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001072 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001073
Guido van Rossum67f7a382002-06-06 21:08:16 +00001074finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001075 Py_XDECREF(sock);
1076 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001077 return res;
1078}
1079
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001080PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001081"accept() -> (socket object, address info)\n\
1082\n\
1083Wait for an incoming connection. Return a new socket representing the\n\
1084connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001085info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001086
Guido van Rossum11ba0942002-06-13 15:07:44 +00001087/* s.setblocking(flag) method. Argument:
1088 False -- non-blocking mode; same as settimeout(0)
1089 True -- blocking mode; same as settimeout(None)
1090*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001091
Guido van Rossum73624e91994-10-10 17:59:00 +00001092static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001093sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001094{
1095 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001096
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001097 block = PyInt_AsLong(arg);
1098 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001099 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001100
Guido van Rossum11ba0942002-06-13 15:07:44 +00001101 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001102 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001103
Guido van Rossum73624e91994-10-10 17:59:00 +00001104 Py_INCREF(Py_None);
1105 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001106}
Guido van Rossume4485b01994-09-07 14:32:49 +00001107
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001108PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001109"setblocking(flag)\n\
1110\n\
1111Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001112setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001113setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001114
Guido van Rossum11ba0942002-06-13 15:07:44 +00001115/* s.settimeout(timeout) method. Argument:
1116 None -- no timeout, blocking mode; same as setblocking(True)
1117 0.0 -- non-blocking mode; same as setblocking(False)
1118 > 0 -- timeout mode; operations time out after timeout seconds
1119 < 0 -- illegal; raises an exception
1120*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001121static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001122sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001123{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001124 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001125
1126 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001127 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001128 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001129 timeout = PyFloat_AsDouble(arg);
1130 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001131 if (!PyErr_Occurred())
1132 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001133 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001134 return NULL;
1135 }
1136 }
1137
Guido van Rossum11ba0942002-06-13 15:07:44 +00001138 s->sock_timeout = timeout;
1139 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001140
1141 Py_INCREF(Py_None);
1142 return Py_None;
1143}
1144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001145PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001146"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001147\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001148Set a timeout on socket operations. 'timeout' can be a float,\n\
1149giving in seconds, or None. Setting a timeout of None disables\n\
1150the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001151Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001152
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001153/* s.gettimeout() method.
1154 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001155static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001156sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001157{
1158 if (s->sock_timeout < 0.0) {
1159 Py_INCREF(Py_None);
1160 return Py_None;
1161 }
1162 else
1163 return PyFloat_FromDouble(s->sock_timeout);
1164}
1165
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001166PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001167"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001168\n\
1169Returns the timeout in floating seconds associated with socket \n\
1170operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001171operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001172
Guido van Rossum48a680c2001-03-02 06:34:14 +00001173#ifdef RISCOS
1174/* s.sleeptaskw(1 | 0) method */
1175
1176static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001177sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001178{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001179 int block;
1180 int delay_flag;
1181 if (!PyArg_Parse(args, "i", &block))
1182 return NULL;
1183 Py_BEGIN_ALLOW_THREADS
1184 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1185 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001186
Guido van Rossum67f7a382002-06-06 21:08:16 +00001187 Py_INCREF(Py_None);
1188 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001189}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001190PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001191"sleeptaskw(flag)\n\
1192\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001193Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001194#endif
1195
1196
Guido van Rossumaee08791992-09-08 09:05:33 +00001197/* s.setsockopt() method.
1198 With an integer third argument, sets an integer option.
1199 With a string third argument, sets an option from a buffer;
1200 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001201
Guido van Rossum73624e91994-10-10 17:59:00 +00001202static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001203sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001204{
1205 int level;
1206 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001207 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001208 char *buf;
1209 int buflen;
1210 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001211
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001212 if (PyArg_ParseTuple(args, "iii:setsockopt",
1213 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001214 buf = (char *) &flag;
1215 buflen = sizeof flag;
1216 }
1217 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001218 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001219 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1220 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001221 return NULL;
1222 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001223 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001224 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001225 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001226 Py_INCREF(Py_None);
1227 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001228}
1229
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001230PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001231"setsockopt(level, option, value)\n\
1232\n\
1233Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001234The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001235
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001236
Guido van Rossumaee08791992-09-08 09:05:33 +00001237/* s.getsockopt() method.
1238 With two arguments, retrieves an integer option.
1239 With a third integer argument, retrieves a string buffer of that size;
1240 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001241
Guido van Rossum73624e91994-10-10 17:59:00 +00001242static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001243sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001244{
1245 int level;
1246 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001247 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001248 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001249 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001250
Guido van Rossumbcc20741998-08-04 22:53:56 +00001251#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001252 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001253 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001254 return NULL;
1255#else
1256
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001257 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1258 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001259 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001260
Guido van Rossumbe32c891996-06-20 16:25:29 +00001261 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001262 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001263 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001264 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001265 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001266 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001267 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001268 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001269 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001270#ifdef __VMS
1271 if (buflen > 1024) {
1272#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001273 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001274#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001275 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001276 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001277 return NULL;
1278 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001279 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001280 if (buf == NULL)
1281 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001282 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001283 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001284 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001285 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001286 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001287 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001288 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001289 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001290#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001291}
1292
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001293PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001294"getsockopt(level, option[, buffersize]) -> value\n\
1295\n\
1296Get a socket option. See the Unix manual for level and option.\n\
1297If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001298string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001299
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001300
Fred Drake728819a2000-07-01 03:40:12 +00001301/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001302
Guido van Rossum73624e91994-10-10 17:59:00 +00001303static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001304sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001305{
1306 struct sockaddr *addr;
1307 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001308 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001309
Fred Drake728819a2000-07-01 03:40:12 +00001310 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001311 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001312 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001313 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001314 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001315 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001316 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001317 Py_INCREF(Py_None);
1318 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001319}
1320
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001321PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001322"bind(address)\n\
1323\n\
1324Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001325pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001326sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001327
Guido van Rossum30a685f1991-06-27 15:51:29 +00001328
1329/* s.close() method.
1330 Set the file descriptor to -1 so operations tried subsequently
1331 will surely fail. */
1332
Guido van Rossum73624e91994-10-10 17:59:00 +00001333static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001334sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001335{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001336 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001337
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001338 if ((fd = s->sock_fd) != -1) {
1339 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001340 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001341 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001342 Py_END_ALLOW_THREADS
1343 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001344 Py_INCREF(Py_None);
1345 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001346}
1347
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001348PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001349"close()\n\
1350\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001351Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001352
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001353static int
1354internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1355{
1356 int res;
1357
1358 res = connect(s->sock_fd, addr, addrlen);
1359
1360#ifdef MS_WINDOWS
1361
1362 if (s->sock_timeout > 0.0) {
1363 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001364 /* This is a mess. Best solution: trust select */
1365 fd_set fds;
1366 struct timeval tv;
1367 tv.tv_sec = (int)s->sock_timeout;
1368 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1369 FD_ZERO(&fds);
1370 FD_SET(s->sock_fd, &fds);
1371 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1372 if (res == 0)
1373 res = WSAEWOULDBLOCK;
1374 else if (res > 0)
1375 res = 0;
1376 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001377 }
1378 }
1379
1380 if (res < 0)
1381 res = WSAGetLastError();
1382
1383#else
1384
1385 if (s->sock_timeout > 0.0) {
1386 if (res < 0 && errno == EINPROGRESS) {
1387 internal_select(s, 1);
1388 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001389 if (res < 0 && errno == EISCONN)
1390 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001391 }
1392 }
1393
1394 if (res < 0)
1395 res = errno;
1396
1397#endif
1398
1399 return res;
1400}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001401
Fred Drake728819a2000-07-01 03:40:12 +00001402/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001403
Guido van Rossum73624e91994-10-10 17:59:00 +00001404static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001405sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001406{
1407 struct sockaddr *addr;
1408 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001409 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001410
Fred Drake728819a2000-07-01 03:40:12 +00001411 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001412 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001413
Guido van Rossum73624e91994-10-10 17:59:00 +00001414 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001415 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001416 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001417
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001418 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001419 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001420 Py_INCREF(Py_None);
1421 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001422}
1423
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001424PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001425"connect(address)\n\
1426\n\
1427Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001428is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001429
Guido van Rossum30a685f1991-06-27 15:51:29 +00001430
Fred Drake728819a2000-07-01 03:40:12 +00001431/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001432
1433static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001434sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001435{
1436 struct sockaddr *addr;
1437 int addrlen;
1438 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001439
Fred Drake728819a2000-07-01 03:40:12 +00001440 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001441 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001442
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001443 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001444 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001445 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001446
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001447 return PyInt_FromLong((long) res);
1448}
1449
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001450PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001451"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001452\n\
1453This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001454instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001455
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001456
Guido van Rossumed233a51992-06-23 09:07:03 +00001457/* s.fileno() method */
1458
Guido van Rossum73624e91994-10-10 17:59:00 +00001459static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001460sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001461{
Fred Drakea04eaad2000-06-30 02:46:07 +00001462#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001463 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001464#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001465 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001466#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001467}
1468
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001469PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001470"fileno() -> integer\n\
1471\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001472Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001473
Guido van Rossumed233a51992-06-23 09:07:03 +00001474
Guido van Rossumbe32c891996-06-20 16:25:29 +00001475#ifndef NO_DUP
1476/* s.dup() method */
1477
1478static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001479sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001480{
Fred Drakea04eaad2000-06-30 02:46:07 +00001481 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001482 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001483
Guido van Rossumbe32c891996-06-20 16:25:29 +00001484 newfd = dup(s->sock_fd);
1485 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001486 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001487 sock = (PyObject *) new_sockobject(newfd,
1488 s->sock_family,
1489 s->sock_type,
1490 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001491 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001492 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001493 return sock;
1494}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001495
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001496PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001497"dup() -> socket object\n\
1498\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001499Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001500
Guido van Rossumbe32c891996-06-20 16:25:29 +00001501#endif
1502
1503
Guido van Rossumc89705d1992-11-26 08:54:07 +00001504/* s.getsockname() method */
1505
Guido van Rossum73624e91994-10-10 17:59:00 +00001506static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001507sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001508{
1509 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001510 int res;
1511 socklen_t addrlen;
1512
Guido van Rossumc89705d1992-11-26 08:54:07 +00001513 if (!getsockaddrlen(s, &addrlen))
1514 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001515 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001516 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001517 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001518 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001519 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001520 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001521 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001522}
1523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001524PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001525"getsockname() -> address info\n\
1526\n\
1527Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001528info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001529
Guido van Rossumc89705d1992-11-26 08:54:07 +00001530
Guido van Rossumb6775db1994-08-01 11:34:53 +00001531#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001532/* s.getpeername() method */
1533
Guido van Rossum73624e91994-10-10 17:59:00 +00001534static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001535sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001536{
1537 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001538 int res;
1539 socklen_t addrlen;
1540
Guido van Rossumc89705d1992-11-26 08:54:07 +00001541 if (!getsockaddrlen(s, &addrlen))
1542 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001543 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001544 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001545 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001546 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001547 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001548 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001549 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001550}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001551
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001552PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001553"getpeername() -> address info\n\
1554\n\
1555Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001556info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001557
Guido van Rossumb6775db1994-08-01 11:34:53 +00001558#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001559
1560
Guido van Rossum30a685f1991-06-27 15:51:29 +00001561/* s.listen(n) method */
1562
Guido van Rossum73624e91994-10-10 17:59:00 +00001563static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001564sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001565{
1566 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001567 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001568
1569 backlog = PyInt_AsLong(arg);
1570 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001571 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001572 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001573 if (backlog < 1)
1574 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001575 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001576 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001577 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001578 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001579 Py_INCREF(Py_None);
1580 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581}
1582
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001583PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001584"listen(backlog)\n\
1585\n\
1586Enable a server to accept connections. The backlog argument must be at\n\
1587least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001588will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001589
1590
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001591#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001592/* s.makefile(mode) method.
1593 Create a new open file object referring to a dupped version of
1594 the socket's file descriptor. (The dup() call is necessary so
1595 that the open file and socket objects may be closed independent
1596 of each other.)
1597 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1598
Guido van Rossum73624e91994-10-10 17:59:00 +00001599static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001600sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001601{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001602 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001603 char *mode = "r";
1604 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001605#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001606 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001607#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001608 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001609#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001610 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001611 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001612#ifdef __VMS
1613 char *mode_r = "r";
1614 char *mode_w = "w";
1615#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001616
Guido van Rossum43713e52000-02-29 13:59:29 +00001617 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001618 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001619#ifdef __VMS
1620 if (strcmp(mode,"rb") == 0) {
1621 mode = mode_r;
1622 }
1623 else {
1624 if (strcmp(mode,"wb") == 0) {
1625 mode = mode_w;
1626 }
1627 }
1628#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001629#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001630 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1631 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001632#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001633 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001634#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001635 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001636 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001637 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001638 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001639 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001640#ifdef USE_GUSI2
1641 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001642 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001643 bufsize = 0;
1644#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001645 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1646 if (f != NULL)
1647 PyFile_SetBufSize(f, bufsize);
1648 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001649}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001650
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001651PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001652"makefile([mode[, buffersize]]) -> file object\n\
1653\n\
1654Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001655The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001656
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001657#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001658
Guido van Rossum48a680c2001-03-02 06:34:14 +00001659
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001660/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001661
Guido van Rossum73624e91994-10-10 17:59:00 +00001662static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001663sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001664{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001665 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001666 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001667#ifdef __VMS
1668 int read_length;
1669 char *read_buf;
1670#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001671
Guido van Rossum43713e52000-02-29 13:59:29 +00001672 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001673 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001674
1675 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001676 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001677 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001678 return NULL;
1679 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001680
Guido van Rossum73624e91994-10-10 17:59:00 +00001681 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001682 if (buf == NULL)
1683 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001684
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001685#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001686 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001687 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001688 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001689 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001690
Guido van Rossum7c53b771995-09-13 18:39:47 +00001691 if (n < 0) {
1692 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001693 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001694 }
Tim Peters5de98422002-04-27 18:44:32 +00001695 if (n != len)
1696 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001697#else
1698 read_buf = PyString_AsString(buf);
1699 read_length = len;
1700 while (read_length != 0) {
1701 unsigned int segment;
1702
1703 segment = read_length /SEGMENT_SIZE;
1704 if (segment != 0) {
1705 segment = SEGMENT_SIZE;
1706 }
1707 else {
1708 segment = read_length;
1709 }
1710
1711 Py_BEGIN_ALLOW_THREADS
1712 internal_select(s, 0);
1713 n = recv(s->sock_fd, read_buf, segment, flags);
1714 Py_END_ALLOW_THREADS
1715
1716 if (n < 0) {
1717 Py_DECREF(buf);
1718 return s->errorhandler();
1719 }
1720 if (n != read_length) {
1721 read_buf += n;
1722 break;
1723 }
1724
1725 read_length -= segment;
1726 read_buf += segment;
1727 }
1728 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1729 {
1730 return NULL;
1731 }
1732#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001733 return buf;
1734}
1735
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001736PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001737"recv(buffersize[, flags]) -> data\n\
1738\n\
1739Receive up to buffersize bytes from the socket. For the optional flags\n\
1740argument, see the Unix manual. When no data is available, block until\n\
1741at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001742the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001743
Guido van Rossum30a685f1991-06-27 15:51:29 +00001744
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001745/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001746
Guido van Rossum73624e91994-10-10 17:59:00 +00001747static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001748sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001749{
1750 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001751 PyObject *buf = NULL;
1752 PyObject *addr = NULL;
1753 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001754 int len, n, flags = 0;
1755 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001756
Guido van Rossum43713e52000-02-29 13:59:29 +00001757 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001758 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001759
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001760 if (!getsockaddrlen(s, &addrlen))
1761 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001762 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001763 if (buf == NULL)
1764 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001765
Guido van Rossum73624e91994-10-10 17:59:00 +00001766 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001767 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001768 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001769 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001770#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001771#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001772 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001773#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001774 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001775#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001776#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001777 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001778#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001779 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001780 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001781
Guido van Rossum7c53b771995-09-13 18:39:47 +00001782 if (n < 0) {
1783 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001784 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001785 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001786
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001787 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001788 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001789
Guido van Rossum67f7a382002-06-06 21:08:16 +00001790 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001791 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001792 goto finally;
1793
Guido van Rossum73624e91994-10-10 17:59:00 +00001794 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001795
1796finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001797 Py_XDECREF(addr);
1798 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001799 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001800}
1801
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001802PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001803"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1804\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001805Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001806
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001807/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001808
Guido van Rossum73624e91994-10-10 17:59:00 +00001809static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001810sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001811{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001812 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001813 int len, n, flags = 0;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001814#ifdef __VMS
1815 int send_length;
1816#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001817
Guido van Rossum43713e52000-02-29 13:59:29 +00001818 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001819 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001820
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001821#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001822 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001823 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001824 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001825 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001826
Guido van Rossum30a685f1991-06-27 15:51:29 +00001827 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001828 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001829#else
1830 /* Divide packet into smaller segments for */
1831 /* TCP/IP Services for OpenVMS */
1832 send_length = len;
1833 while (send_length != 0) {
1834 unsigned int segment;
1835
1836 segment = send_length / SEGMENT_SIZE;
1837 if (segment != 0) {
1838 segment = SEGMENT_SIZE;
1839 }
1840 else {
1841 segment = send_length;
1842 }
1843 Py_BEGIN_ALLOW_THREADS
1844 internal_select(s, 1);
1845 n = send(s->sock_fd, buf, segment, flags);
1846 Py_END_ALLOW_THREADS
1847 if (n < 0) {
1848 return s->errorhandler();
1849 }
1850 send_length -= segment;
1851 buf += segment;
1852 } /* end while */
1853#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001854 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001855}
1856
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001857PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001858"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001859\n\
1860Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001861argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001862sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001863
1864
1865/* s.sendall(data [,flags]) method */
1866
1867static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001868sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001869{
1870 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001871 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001872
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001873 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1874 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001875
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001876 Py_BEGIN_ALLOW_THREADS
1877 do {
Guido van Rossum8f24cdc2003-01-31 18:15:58 +00001878 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001879 n = send(s->sock_fd, buf, len, flags);
1880 if (n < 0)
1881 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001882 buf += n;
1883 len -= n;
1884 } while (len > 0);
1885 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001886
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001887 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001888 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001889
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001890 Py_INCREF(Py_None);
1891 return Py_None;
1892}
1893
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001894PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001895"sendall(data[, flags])\n\
1896\n\
1897Send a data string to the socket. For the optional flags\n\
1898argument, see the Unix manual. This calls send() repeatedly\n\
1899until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001900to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001901
Guido van Rossum30a685f1991-06-27 15:51:29 +00001902
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001903/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001904
Guido van Rossum73624e91994-10-10 17:59:00 +00001905static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001906sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001907{
Guido van Rossum73624e91994-10-10 17:59:00 +00001908 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001909 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001910 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001911 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001912
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001913 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001914 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001915 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001916 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1917 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001918 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001919 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001920
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001921 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001922 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001923
Guido van Rossum73624e91994-10-10 17:59:00 +00001924 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001925 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001926 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001927 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001928
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001929 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001930 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001931 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001932}
1933
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001934PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001935"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001936\n\
1937Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001938For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001939
Guido van Rossum30a685f1991-06-27 15:51:29 +00001940
1941/* s.shutdown(how) method */
1942
Guido van Rossum73624e91994-10-10 17:59:00 +00001943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001944sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001945{
1946 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001947 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001948
1949 how = PyInt_AsLong(arg);
1950 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001951 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001952 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001953 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001954 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001955 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001956 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001957 Py_INCREF(Py_None);
1958 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001959}
1960
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001961PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001962"shutdown(flag)\n\
1963\n\
1964Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001965of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001966
Guido van Rossum30a685f1991-06-27 15:51:29 +00001967
1968/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001969
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001970static PyMethodDef sock_methods[] = {
1971 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001972 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001973 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001974 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001975 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001976 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001977 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001978 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001979 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001980 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001981#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001982 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001983 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001984#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001985 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001986 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001987#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001988 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001989 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001990#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001991 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001992 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001993 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001994 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001995 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001996 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001997#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001998 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001999 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002000#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002001 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002002 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002003 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002004 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002005 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002006 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002007 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002008 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002009 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002010 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002011 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002012 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002013 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002014 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002015 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002016 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002017 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002018 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002019 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002020 shutdown_doc},
2021#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002022 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002023 sleeptaskw_doc},
2024#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002025 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002026};
2027
Guido van Rossum30a685f1991-06-27 15:51:29 +00002028
Guido van Rossum73624e91994-10-10 17:59:00 +00002029/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002030 First close the file description. */
2031
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002032static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002033sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002034{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002035 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002036 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002037 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002038}
2039
Guido van Rossum30a685f1991-06-27 15:51:29 +00002040
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002042sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002043{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002044 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002045#if SIZEOF_SOCKET_T > SIZEOF_LONG
2046 if (s->sock_fd > LONG_MAX) {
2047 /* this can occur on Win64, and actually there is a special
2048 ugly printf formatter for decimal pointer length integer
2049 printing, only bother if necessary*/
2050 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002051 "no printf formatter to display "
2052 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002053 return NULL;
2054 }
2055#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002056 PyOS_snprintf(
2057 buf, sizeof(buf),
2058 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2059 (long)s->sock_fd, s->sock_family,
2060 s->sock_type,
2061 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002062 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002063}
2064
2065
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002066/* Create a new, uninitialized socket object. */
2067
2068static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002069sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002070{
2071 PyObject *new;
2072
2073 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002074 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002075 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002076 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002077 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002078 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002079 return new;
2080}
2081
2082
2083/* Initialize a new socket object. */
2084
2085/*ARGSUSED*/
2086static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002087sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002088{
2089 PySocketSockObject *s = (PySocketSockObject *)self;
2090 SOCKET_T fd;
2091 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2092 static char *keywords[] = {"family", "type", "proto", 0};
2093
2094 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2095 "|iii:socket", keywords,
2096 &family, &type, &proto))
2097 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002098
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002099 Py_BEGIN_ALLOW_THREADS
2100 fd = socket(family, type, proto);
2101 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002102
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002103#ifdef MS_WINDOWS
2104 if (fd == INVALID_SOCKET)
2105#else
2106 if (fd < 0)
2107#endif
2108 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002109 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002110 return -1;
2111 }
2112 init_sockobject(s, fd, family, type, proto);
2113 /* From now on, ignore SIGPIPE and let the error checking
2114 do the work. */
2115#ifdef SIGPIPE
2116 (void) signal(SIGPIPE, SIG_IGN);
2117#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002118
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002119 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002120
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002121}
2122
2123
Guido van Rossumb6775db1994-08-01 11:34:53 +00002124/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002125
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002126static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002127 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002128 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002129 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002130 sizeof(PySocketSockObject), /* tp_basicsize */
2131 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002132 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002133 0, /* tp_print */
2134 0, /* tp_getattr */
2135 0, /* tp_setattr */
2136 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002137 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002138 0, /* tp_as_number */
2139 0, /* tp_as_sequence */
2140 0, /* tp_as_mapping */
2141 0, /* tp_hash */
2142 0, /* tp_call */
2143 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002144 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002145 0, /* tp_setattro */
2146 0, /* tp_as_buffer */
2147 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002148 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002149 0, /* tp_traverse */
2150 0, /* tp_clear */
2151 0, /* tp_richcompare */
2152 0, /* tp_weaklistoffset */
2153 0, /* tp_iter */
2154 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002155 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002156 0, /* tp_members */
2157 0, /* tp_getset */
2158 0, /* tp_base */
2159 0, /* tp_dict */
2160 0, /* tp_descr_get */
2161 0, /* tp_descr_set */
2162 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002163 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002164 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002165 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002166 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002167};
2168
Guido van Rossum30a685f1991-06-27 15:51:29 +00002169
Guido van Rossum81194471991-07-27 21:42:02 +00002170/* Python interface to gethostname(). */
2171
2172/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002173static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002174socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002175{
2176 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002177 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002178 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002179 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002180 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002181 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002182 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002183 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002184 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002185 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002186 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002187}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002188
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002189PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002190"gethostname() -> string\n\
2191\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002192Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002193
Guido van Rossumff4949e1992-08-05 19:58:53 +00002194
Guido van Rossum30a685f1991-06-27 15:51:29 +00002195/* Python interface to gethostbyname(name). */
2196
2197/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002198static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002199socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002200{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002201 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002202#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002203 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002204#else
2205 struct sockaddr_in addrbuf;
2206#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002207
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002208 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002209 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002210 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002211 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002212 return makeipaddr((struct sockaddr *)&addrbuf,
2213 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002214}
2215
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002216PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002217"gethostbyname(host) -> address\n\
2218\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002219Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002220
2221
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002222/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2223
2224static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002225gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002226{
2227 char **pch;
2228 PyObject *rtn_tuple = (PyObject *)NULL;
2229 PyObject *name_list = (PyObject *)NULL;
2230 PyObject *addr_list = (PyObject *)NULL;
2231 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002232
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002233 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002234 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002235#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002236 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002237#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002238 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002239#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002240 return NULL;
2241 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002242
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002243 if (h->h_addrtype != af) {
2244#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002245 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002246 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002247 (char *)strerror(EAFNOSUPPORT));
2248#else
2249 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002250 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002251 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002252#endif
2253 return NULL;
2254 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002255
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002256 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002257
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002258 case AF_INET:
2259 if (alen < sizeof(struct sockaddr_in))
2260 return NULL;
2261 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002262
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002263#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002264 case AF_INET6:
2265 if (alen < sizeof(struct sockaddr_in6))
2266 return NULL;
2267 break;
2268#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002269
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002270 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002271
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002272 if ((name_list = PyList_New(0)) == NULL)
2273 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002274
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002275 if ((addr_list = PyList_New(0)) == NULL)
2276 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002277
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002278 for (pch = h->h_aliases; *pch != NULL; pch++) {
2279 int status;
2280 tmp = PyString_FromString(*pch);
2281 if (tmp == NULL)
2282 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002283
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002284 status = PyList_Append(name_list, tmp);
2285 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002286
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002287 if (status)
2288 goto err;
2289 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002290
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002291 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2292 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002293
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002294 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002295
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002296 case AF_INET:
2297 {
2298 struct sockaddr_in sin;
2299 memset(&sin, 0, sizeof(sin));
2300 sin.sin_family = af;
2301#ifdef HAVE_SOCKADDR_SA_LEN
2302 sin.sin_len = sizeof(sin);
2303#endif
2304 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2305 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002306
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002307 if (pch == h->h_addr_list && alen >= sizeof(sin))
2308 memcpy((char *) addr, &sin, sizeof(sin));
2309 break;
2310 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002311
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002312#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002313 case AF_INET6:
2314 {
2315 struct sockaddr_in6 sin6;
2316 memset(&sin6, 0, sizeof(sin6));
2317 sin6.sin6_family = af;
2318#ifdef HAVE_SOCKADDR_SA_LEN
2319 sin6.sin6_len = sizeof(sin6);
2320#endif
2321 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2322 tmp = makeipaddr((struct sockaddr *)&sin6,
2323 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002324
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002325 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2326 memcpy((char *) addr, &sin6, sizeof(sin6));
2327 break;
2328 }
2329#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002330
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002331 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002332 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002333 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002334 return NULL;
2335 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002336
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002337 if (tmp == NULL)
2338 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002339
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002340 status = PyList_Append(addr_list, tmp);
2341 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002342
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002343 if (status)
2344 goto err;
2345 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002346
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002347 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002348
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002349 err:
2350 Py_XDECREF(name_list);
2351 Py_XDECREF(addr_list);
2352 return rtn_tuple;
2353}
2354
2355
2356/* Python interface to gethostbyname_ex(name). */
2357
2358/*ARGSUSED*/
2359static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002360socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002361{
2362 char *name;
2363 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002364#ifdef ENABLE_IPV6
2365 struct sockaddr_storage addr;
2366#else
2367 struct sockaddr_in addr;
2368#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002369 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002370 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002371#ifdef HAVE_GETHOSTBYNAME_R
2372 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002373#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2374 struct hostent_data data;
2375#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002376 char buf[16384];
2377 int buf_len = (sizeof buf) - 1;
2378 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002379#endif
2380#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002381 int result;
2382#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002383#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002384
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002385 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002386 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002387 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002388 return NULL;
2389 Py_BEGIN_ALLOW_THREADS
2390#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002391#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002392 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2393 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002394#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002395 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002396#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002397 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002398 result = gethostbyname_r(name, &hp_allocated, &data);
2399 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002400#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002401#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002402#ifdef USE_GETHOSTBYNAME_LOCK
2403 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002404#endif
2405 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002406#endif /* HAVE_GETHOSTBYNAME_R */
2407 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002408 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002409 addr.ss_family.
2410 Therefore, we cast the sockaddr_storage into sockaddr to
2411 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002412 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002413 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002414 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002415#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002416 PyThread_release_lock(gethostbyname_lock);
2417#endif
2418 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002419}
2420
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002421PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002422"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2423\n\
2424Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002425for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002426
2427
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002428/* Python interface to gethostbyaddr(IP). */
2429
2430/*ARGSUSED*/
2431static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002432socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002433{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002434#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002435 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002436#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002437 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002438#endif
2439 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002440 char *ip_num;
2441 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002442 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002443#ifdef HAVE_GETHOSTBYNAME_R
2444 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002445#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2446 struct hostent_data data;
2447#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002448 char buf[16384];
2449 int buf_len = (sizeof buf) - 1;
2450 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002451#endif
2452#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002453 int result;
2454#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002455#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002456 char *ap;
2457 int al;
2458 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002459
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002460 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002461 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002462 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002463 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002464 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002465 af = sa->sa_family;
2466 ap = NULL;
2467 al = 0;
2468 switch (af) {
2469 case AF_INET:
2470 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2471 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2472 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002473#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002474 case AF_INET6:
2475 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2476 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2477 break;
2478#endif
2479 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002480 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002481 return NULL;
2482 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002483 Py_BEGIN_ALLOW_THREADS
2484#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002485#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002486 result = gethostbyaddr_r(ap, al, af,
2487 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002488 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002489#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002490 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002491 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002492#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002493 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002494 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002495 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002496#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002497#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002498#ifdef USE_GETHOSTBYNAME_LOCK
2499 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002500#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002501 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002502#endif /* HAVE_GETHOSTBYNAME_R */
2503 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002504 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002505#ifdef USE_GETHOSTBYNAME_LOCK
2506 PyThread_release_lock(gethostbyname_lock);
2507#endif
2508 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002509}
2510
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002511PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002512"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2513\n\
2514Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002515for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002516
Guido van Rossum30a685f1991-06-27 15:51:29 +00002517
2518/* Python interface to getservbyname(name).
2519 This only returns the port number, since the other info is already
2520 known or not useful (like the list of aliases). */
2521
2522/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002523static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002524socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002525{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002526 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002527 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002528 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002529 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002530 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002531 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002532 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002533 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002534 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002535 return NULL;
2536 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002537 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002538}
2539
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002540PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002541"getservbyname(servicename, protocolname) -> integer\n\
2542\n\
2543Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002544The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002545
Guido van Rossum30a685f1991-06-27 15:51:29 +00002546
Guido van Rossum3901d851996-12-19 16:35:04 +00002547/* Python interface to getprotobyname(name).
2548 This only returns the protocol number, since the other info is
2549 already known or not useful (like the list of aliases). */
2550
2551/*ARGSUSED*/
2552static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002553socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002554{
2555 char *name;
2556 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002557#ifdef __BEOS__
2558/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002559 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002560 return NULL;
2561#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002562 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002563 return NULL;
2564 Py_BEGIN_ALLOW_THREADS
2565 sp = getprotobyname(name);
2566 Py_END_ALLOW_THREADS
2567 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002568 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002569 return NULL;
2570 }
2571 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002572#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002573}
2574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002575PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002576"getprotobyname(name) -> integer\n\
2577\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002578Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002579
Guido van Rossum3901d851996-12-19 16:35:04 +00002580
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002581#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002582/* Create a socket object from a numeric file description.
2583 Useful e.g. if stdin is a socket.
2584 Additional arguments as for socket(). */
2585
2586/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002587static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002588socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002589{
Guido van Rossum73624e91994-10-10 17:59:00 +00002590 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002591 SOCKET_T fd;
2592 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002593 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2594 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002595 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002596 /* Dup the fd so it and the socket can be closed independently */
2597 fd = dup(fd);
2598 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002599 return set_error();
2600 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002601 /* From now on, ignore SIGPIPE and let the error checking
2602 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002603#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002604 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002605#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002606 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002607}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002608
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002609PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002610"fromfd(fd, family, type[, proto]) -> socket object\n\
2611\n\
2612Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002613The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002614
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002615#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002616
Guido van Rossum82a5c661998-07-07 20:45:43 +00002617
Guido van Rossum006bf911996-06-12 04:04:55 +00002618static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002619socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002620{
2621 int x1, x2;
2622
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002623 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002624 return NULL;
2625 }
2626 x2 = (int)ntohs((short)x1);
2627 return PyInt_FromLong(x2);
2628}
2629
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002630PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002631"ntohs(integer) -> integer\n\
2632\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002633Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002634
2635
Guido van Rossum006bf911996-06-12 04:04:55 +00002636static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002637socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002638{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002639 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002640
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002641 if (PyInt_Check(arg)) {
2642 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002643 if (x == (unsigned long) -1 && PyErr_Occurred())
2644 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002645 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002646 else if (PyLong_Check(arg)) {
2647 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002648 if (x == (unsigned long) -1 && PyErr_Occurred())
2649 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002650#if SIZEOF_LONG > 4
2651 {
2652 unsigned long y;
2653 /* only want the trailing 32 bits */
2654 y = x & 0xFFFFFFFFUL;
2655 if (y ^ x)
2656 return PyErr_Format(PyExc_OverflowError,
2657 "long int larger than 32 bits");
2658 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002659 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002660#endif
2661 }
2662 else
Tim Peters58141872002-08-06 22:25:02 +00002663 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002664 "expected int/long, %s found",
2665 arg->ob_type->tp_name);
2666 if (x == (unsigned long) -1 && PyErr_Occurred())
2667 return NULL;
2668 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002669}
2670
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002671PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002672"ntohl(integer) -> integer\n\
2673\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002674Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002675
2676
Guido van Rossum006bf911996-06-12 04:04:55 +00002677static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002678socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002679{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002680 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002681
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002682 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002683 return NULL;
2684 }
2685 x2 = (int)htons((short)x1);
2686 return PyInt_FromLong(x2);
2687}
2688
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002689PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002690"htons(integer) -> integer\n\
2691\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002692Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002693
2694
Guido van Rossum006bf911996-06-12 04:04:55 +00002695static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002696socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002697{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002698 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002699
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002700 if (PyInt_Check(arg)) {
2701 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002702 if (x == (unsigned long) -1 && PyErr_Occurred())
2703 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002704 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002705 else if (PyLong_Check(arg)) {
2706 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002707 if (x == (unsigned long) -1 && PyErr_Occurred())
2708 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002709#if SIZEOF_LONG > 4
2710 {
2711 unsigned long y;
2712 /* only want the trailing 32 bits */
2713 y = x & 0xFFFFFFFFUL;
2714 if (y ^ x)
2715 return PyErr_Format(PyExc_OverflowError,
2716 "long int larger than 32 bits");
2717 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002718 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002719#endif
2720 }
2721 else
Tim Peters58141872002-08-06 22:25:02 +00002722 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002723 "expected int/long, %s found",
2724 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002725 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002726}
2727
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002728PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002729"htonl(integer) -> integer\n\
2730\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002731Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002732
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002733/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002734
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002735PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002736"inet_aton(string) -> packed 32-bit IP representation\n\
2737\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002738Convert 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 +00002739binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002740
2741static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002742socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002743{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002744#ifndef INADDR_NONE
2745#define INADDR_NONE (-1)
2746#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002747#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002748 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002749#else
2750 /* Have to use inet_addr() instead */
2751 unsigned long packed_addr;
2752#endif
2753 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002754
Tim Peters1df9fdd2003-02-13 03:13:40 +00002755 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002756 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002757
Tim Peters1df9fdd2003-02-13 03:13:40 +00002758
2759#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002760 if (inet_aton(ip_addr, &buf))
2761 return PyString_FromStringAndSize((char *)(&buf),
2762 sizeof(buf));
2763
2764 PyErr_SetString(socket_error,
2765 "illegal IP address string passed to inet_aton");
2766 return NULL;
2767
Tim Peters1df9fdd2003-02-13 03:13:40 +00002768#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002769 /* XXX Problem here: inet_aton('255.255.255.255') raises
2770 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002771 packed_addr = inet_addr(ip_addr);
2772
2773 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002774 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002775 "illegal IP address string passed to inet_aton");
2776 return NULL;
2777 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002778 return PyString_FromStringAndSize((char *) &packed_addr,
2779 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002780#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002781}
2782
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002783PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002784"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002785\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002786Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002787
2788static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002789socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002790{
2791 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002792 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002793 struct in_addr packed_addr;
2794
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002795 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002796 return NULL;
2797 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002798
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002799 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002800 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002801 "packed IP wrong length for inet_ntoa");
2802 return NULL;
2803 }
2804
2805 memcpy(&packed_addr, packed_str, addr_len);
2806
2807 return PyString_FromString(inet_ntoa(packed_addr));
2808}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002809
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002810#ifdef HAVE_INET_PTON
2811
2812PyDoc_STRVAR(inet_pton_doc,
2813"inet_pton(af, ip) -> packed IP address string\n\
2814\n\
2815Convert an IP address from string format to a packed string suitable\n\
2816for use with low-level network functions.");
2817
2818static PyObject *
2819socket_inet_pton(PyObject *self, PyObject *args)
2820{
2821 int af;
2822 char* ip;
2823 int retval;
2824 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
2825
2826 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
2827 return NULL;
2828 }
2829
2830 retval = inet_pton(af, ip, packed);
2831 if (retval < 0) {
2832 PyErr_SetFromErrno(socket_error);
2833 return NULL;
2834 } else if (retval == 0) {
2835 PyErr_SetString(socket_error,
2836 "illegal IP address string passed to inet_pton");
2837 return NULL;
2838 } else if (af == AF_INET) {
2839 return PyString_FromStringAndSize(packed,
2840 sizeof(struct in_addr));
2841 } else if (af == AF_INET6) {
2842 return PyString_FromStringAndSize(packed,
2843 sizeof(struct in6_addr));
2844 } else {
2845 PyErr_SetString(socket_error, "unknown address family");
2846 return NULL;
2847 }
2848}
2849
2850PyDoc_STRVAR(inet_ntop_doc,
2851"inet_ntop(af, packed_ip) -> string formatted IP address\n\
2852\n\
2853Convert a packed IP address of the given family to string format.");
2854
2855static PyObject *
2856socket_inet_ntop(PyObject *self, PyObject *args)
2857{
2858 int af;
2859 char* packed;
2860 int len;
2861 const char* retval;
2862 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
2863
2864 /* Guarantee NUL-termination for PyString_FromString() below */
2865 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
2866
2867 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
2868 return NULL;
2869 }
2870
2871 if (af == AF_INET) {
2872 if (len != sizeof(struct in_addr)) {
2873 PyErr_SetString(PyExc_ValueError,
2874 "invalid length of packed IP address string");
2875 return NULL;
2876 }
2877 } else if (af == AF_INET6) {
2878 if (len != sizeof(struct in6_addr)) {
2879 PyErr_SetString(PyExc_ValueError,
2880 "invalid length of packed IP address string");
2881 return NULL;
2882 }
2883 } else {
2884 PyErr_Format(PyExc_ValueError,
2885 "unknown address family %d", af);
2886 return NULL;
2887 }
2888
2889 retval = inet_ntop(af, packed, ip, sizeof(ip));
2890 if (!retval) {
2891 PyErr_SetFromErrno(socket_error);
2892 return NULL;
2893 } else {
2894 return PyString_FromString(retval);
2895 }
2896
2897 /* NOTREACHED */
2898 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
2899 return NULL;
2900}
2901
2902#endif /* HAVE_INET_PTON */
2903
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002904/* Python interface to getaddrinfo(host, port). */
2905
2906/*ARGSUSED*/
2907static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002908socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002909{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002910 struct addrinfo hints, *res;
2911 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002912 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002913 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002914 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002915 char *hptr, *pptr;
2916 int family, socktype, protocol, flags;
2917 int error;
2918 PyObject *all = (PyObject *)NULL;
2919 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002920 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002921
2922 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002923 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002924 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
2925 &hobj, &pobj, &family, &socktype,
2926 &protocol, &flags)) {
2927 return NULL;
2928 }
2929 if (hobj == Py_None) {
2930 hptr = NULL;
2931 } else if (PyUnicode_Check(hobj)) {
2932 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
2933 if (!idna)
2934 return NULL;
2935 hptr = PyString_AsString(idna);
2936 } else if (PyString_Check(hobj)) {
2937 hptr = PyString_AsString(hobj);
2938 } else {
2939 PyErr_SetString(PyExc_TypeError,
2940 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002941 return NULL;
2942 }
2943 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002944 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002945 pptr = pbuf;
2946 } else if (PyString_Check(pobj)) {
2947 pptr = PyString_AsString(pobj);
2948 } else if (pobj == Py_None) {
2949 pptr = (char *)NULL;
2950 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002951 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002952 return NULL;
2953 }
2954 memset(&hints, 0, sizeof(hints));
2955 hints.ai_family = family;
2956 hints.ai_socktype = socktype;
2957 hints.ai_protocol = protocol;
2958 hints.ai_flags = flags;
2959 error = getaddrinfo(hptr, pptr, &hints, &res0);
2960 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002961 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002962 return NULL;
2963 }
2964
2965 if ((all = PyList_New(0)) == NULL)
2966 goto err;
2967 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002968 PyObject *addr =
2969 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2970 if (addr == NULL)
2971 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002972 single = Py_BuildValue("iiisO", res->ai_family,
2973 res->ai_socktype, res->ai_protocol,
2974 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002975 addr);
2976 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002977 if (single == NULL)
2978 goto err;
2979
2980 if (PyList_Append(all, single))
2981 goto err;
2982 Py_XDECREF(single);
2983 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00002984 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00002985 if (res0)
2986 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002987 return all;
2988 err:
2989 Py_XDECREF(single);
2990 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00002991 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002992 if (res0)
2993 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002994 return (PyObject *)NULL;
2995}
2996
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002997PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002998"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2999 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003000\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003001Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003002
3003/* Python interface to getnameinfo(sa, flags). */
3004
3005/*ARGSUSED*/
3006static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003007socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003008{
3009 PyObject *sa = (PyObject *)NULL;
3010 int flags;
3011 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003012 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003013 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3014 struct addrinfo hints, *res = NULL;
3015 int error;
3016 PyObject *ret = (PyObject *)NULL;
3017
3018 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003019 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003020 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003021 if (!PyArg_ParseTuple(sa, "si|ii",
3022 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003023 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003024 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003025 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003026 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003027 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003028 error = getaddrinfo(hostp, pbuf, &hints, &res);
3029 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003030 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003031 goto fail;
3032 }
3033 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003034 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003035 "sockaddr resolved to multiple addresses");
3036 goto fail;
3037 }
3038 switch (res->ai_family) {
3039 case AF_INET:
3040 {
3041 char *t1;
3042 int t2;
3043 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003044 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003045 "IPv4 sockaddr must be 2 tuple");
3046 goto fail;
3047 }
3048 break;
3049 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003050#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003051 case AF_INET6:
3052 {
3053 struct sockaddr_in6 *sin6;
3054 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3055 sin6->sin6_flowinfo = flowinfo;
3056 sin6->sin6_scope_id = scope_id;
3057 break;
3058 }
3059#endif
3060 }
3061 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3062 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3063 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003064 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003065 goto fail;
3066 }
3067 ret = Py_BuildValue("ss", hbuf, pbuf);
3068
3069fail:
3070 if (res)
3071 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003072 return ret;
3073}
3074
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003075PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003076"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003077\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003078Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003079
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003080
3081/* Python API to getting and setting the default timeout value. */
3082
3083static PyObject *
3084socket_getdefaulttimeout(PyObject *self)
3085{
3086 if (defaulttimeout < 0.0) {
3087 Py_INCREF(Py_None);
3088 return Py_None;
3089 }
3090 else
3091 return PyFloat_FromDouble(defaulttimeout);
3092}
3093
3094PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003095"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003096\n\
3097Returns the default timeout in floating seconds for new socket objects.\n\
3098A value of None indicates that new socket objects have no timeout.\n\
3099When the socket module is first imported, the default is None.");
3100
3101static PyObject *
3102socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3103{
3104 double timeout;
3105
3106 if (arg == Py_None)
3107 timeout = -1.0;
3108 else {
3109 timeout = PyFloat_AsDouble(arg);
3110 if (timeout < 0.0) {
3111 if (!PyErr_Occurred())
3112 PyErr_SetString(PyExc_ValueError,
3113 "Timeout value out of range");
3114 return NULL;
3115 }
3116 }
3117
3118 defaulttimeout = timeout;
3119
3120 Py_INCREF(Py_None);
3121 return Py_None;
3122}
3123
3124PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003125"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003126\n\
3127Set the default timeout in floating seconds for new socket objects.\n\
3128A value of None indicates that new socket objects have no timeout.\n\
3129When the socket module is first imported, the default is None.");
3130
3131
Guido van Rossum30a685f1991-06-27 15:51:29 +00003132/* List of functions exported by this module. */
3133
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003134static PyMethodDef socket_methods[] = {
3135 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003136 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003137 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003138 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003139 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003140 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003141 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003142 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003143 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003144 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003145 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003146 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003147#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003148 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003149 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003150#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003151 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003152 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003153 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003154 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003155 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003156 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003157 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003158 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003159 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003160 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003161 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003162 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003163#ifdef HAVE_INET_PTON
3164 {"inet_pton", socket_inet_pton,
3165 METH_VARARGS, inet_pton_doc},
3166 {"inet_ntop", socket_inet_ntop,
3167 METH_VARARGS, inet_ntop_doc},
3168#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003169 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003170 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003171 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003172 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003173 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003174 METH_NOARGS, getdefaulttimeout_doc},
3175 {"setdefaulttimeout", socket_setdefaulttimeout,
3176 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003177 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003178};
3179
Guido van Rossum30a685f1991-06-27 15:51:29 +00003180
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003181#ifdef RISCOS
3182#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003183
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003184static int
3185os_init(void)
3186{
3187 _kernel_swi_regs r;
3188
3189 r.r[0] = 0;
3190 _kernel_swi(0x43380, &r, &r);
3191 taskwindow = r.r[0];
3192
3193 return 0;
3194}
3195
3196#endif /* RISCOS */
3197
3198
3199#ifdef MS_WINDOWS
3200#define OS_INIT_DEFINED
3201
3202/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003203
3204static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003205os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003206{
3207 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003208}
3209
3210static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003211os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003212{
3213 WSADATA WSAData;
3214 int ret;
3215 char buf[100];
3216 ret = WSAStartup(0x0101, &WSAData);
3217 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003218 case 0: /* No error */
3219 atexit(os_cleanup);
3220 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003221 case WSASYSNOTREADY:
3222 PyErr_SetString(PyExc_ImportError,
3223 "WSAStartup failed: network not ready");
3224 break;
3225 case WSAVERNOTSUPPORTED:
3226 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003227 PyErr_SetString(
3228 PyExc_ImportError,
3229 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003230 break;
3231 default:
Tim Peters885d4572001-11-28 20:27:42 +00003232 PyOS_snprintf(buf, sizeof(buf),
3233 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003234 PyErr_SetString(PyExc_ImportError, buf);
3235 break;
3236 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003237 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003238}
3239
Guido van Rossum8d665e61996-06-26 18:22:49 +00003240#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003241
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003242
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003243#ifdef PYOS_OS2
3244#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003245
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003246/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003247
3248static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003249os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003250{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003251#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003252 char reason[64];
3253 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003254
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003255 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003256 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003257 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003258
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003259 PyOS_snprintf(reason, sizeof(reason),
3260 "OS/2 TCP/IP Error# %d", sock_errno());
3261 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003262
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003263 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003264#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003265 /* No need to initialise sockets with GCC/EMX */
3266 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003267#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003268}
3269
3270#endif /* PYOS_OS2 */
3271
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003272
3273#ifndef OS_INIT_DEFINED
3274static int
3275os_init(void)
3276{
3277 return 1; /* Success */
3278}
3279#endif
3280
3281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003282/* C API table - always add new things to the end for binary
3283 compatibility. */
3284static
3285PySocketModule_APIObject PySocketModuleAPI =
3286{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003287 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003288};
3289
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003290
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003291/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003292
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003293 This module is actually called "_socket", and there's a wrapper
3294 "socket.py" which implements some additional functionality. On some
3295 platforms (e.g. Windows and OS/2), socket.py also implements a
3296 wrapper for the socket type that provides missing functionality such
3297 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3298 with an ImportError exception if os-specific initialization fails.
3299 On Windows, this does WINSOCK initialization. When WINSOCK is
3300 initialized succesfully, a call to WSACleanup() is scheduled to be
3301 made at exit time.
3302*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003303
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003304PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003305"Implementation module for socket operations.\n\
3306\n\
3307See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003308
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003309PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003310init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003311{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003312 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003313
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003314 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003315 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003316
3317 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003318 m = Py_InitModule3(PySocket_MODULE_NAME,
3319 socket_methods,
3320 socket_doc);
3321
3322 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3323 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003324 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003325 Py_INCREF(socket_error);
3326 PyModule_AddObject(m, "error", socket_error);
3327 socket_herror = PyErr_NewException("socket.herror",
3328 socket_error, NULL);
3329 if (socket_herror == NULL)
3330 return;
3331 Py_INCREF(socket_herror);
3332 PyModule_AddObject(m, "herror", socket_herror);
3333 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003334 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003335 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003336 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003337 Py_INCREF(socket_gaierror);
3338 PyModule_AddObject(m, "gaierror", socket_gaierror);
3339 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003340 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003341 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003342 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003343 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003344 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003345 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003346 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003347
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003348#ifdef ENABLE_IPV6
3349 has_ipv6 = Py_True;
3350#else
3351 has_ipv6 = Py_False;
3352#endif
3353 Py_INCREF(has_ipv6);
3354 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3355
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003356 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003357 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003358 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3359 ) != 0)
3360 return;
3361
Guido van Rossum09be4091999-08-09 14:40:40 +00003362 /* Address families (we only support AF_INET and AF_UNIX) */
3363#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003364 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003365#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003366 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003367#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003368 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003369#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003370#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003371 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003372#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003373#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003374 /* Amateur Radio AX.25 */
3375 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003376#endif
3377#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003378 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003379#endif
3380#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003381 /* Appletalk DDP */
3382 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003383#endif
3384#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003385 /* Amateur radio NetROM */
3386 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003387#endif
3388#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003389 /* Multiprotocol bridge */
3390 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003391#endif
3392#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003393 /* Reserved for Werner's ATM */
3394 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003395#endif
3396#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003397 /* Reserved for X.25 project */
3398 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003399#endif
3400#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003401 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003402#endif
3403#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003404 /* Amateur Radio X.25 PLP */
3405 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003406#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003407#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003408 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3409 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3410 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3411 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3412 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3413 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3414 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3415 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3416 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003417#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003418
3419 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003420 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3421 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003422#ifndef __BEOS__
3423/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003424 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3425 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003426#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003427 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003428#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003429#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003430
3431#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003432 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003433#endif
3434#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003435 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003436#endif
3437#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003438 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003439#endif
3440#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003441 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003442#endif
3443#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003444 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003445#endif
3446#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003447 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003448#endif
3449#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003450 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003451#endif
3452#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003453 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003454#endif
3455#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003456 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003457#endif
3458#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003459 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003460#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003461#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003462 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003463#endif
3464#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003465 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003466#endif
3467#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003468 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003469#endif
3470#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003471 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003472#endif
3473#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003474 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003475#endif
3476#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003477 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003478#endif
3479#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003480 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003481#endif
3482#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003483 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003484#endif
3485
3486 /* Maximum number of connections for "listen" */
3487#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003488 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003489#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003490 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003491#endif
3492
3493 /* Flags for send, recv */
3494#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003495 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003496#endif
3497#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003498 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003499#endif
3500#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003501 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003502#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003503#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003504 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003505#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003506#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003507 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003508#endif
3509#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003510 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003511#endif
3512#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003513 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003514#endif
3515#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003516 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003517#endif
3518#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003519 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003520#endif
3521#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003522 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003523#endif
3524
3525 /* Protocol level and numbers, usable for [gs]etsockopt */
3526#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003527 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003528#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003529#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003530 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003531#else
Fred Drake4baedc12002-04-01 14:53:37 +00003532 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003533#endif
3534#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003535 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003536#endif
3537#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003538 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003539#endif
3540#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003541 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003542#endif
3543#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003544 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003545#endif
3546#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003547 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003548#endif
3549#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003550 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003551#else
Fred Drake4baedc12002-04-01 14:53:37 +00003552 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003553#endif
3554#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003555 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003556#else
Fred Drake4baedc12002-04-01 14:53:37 +00003557 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003558#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003559#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003560 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003561#else
Fred Drake4baedc12002-04-01 14:53:37 +00003562 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003563#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003564#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003565 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003566#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003567#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003568 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003569#else
Fred Drake4baedc12002-04-01 14:53:37 +00003570 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003571#endif
3572#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003573 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003574#endif
3575#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003576 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003577#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003578#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003579 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003580#endif
3581#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003582 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003583#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003584#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003585 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003586#else
Fred Drake4baedc12002-04-01 14:53:37 +00003587 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003588#endif
3589#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003590 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003591#endif
3592#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003593 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003594#endif
3595#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003596 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003597#else
Fred Drake4baedc12002-04-01 14:53:37 +00003598 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003599#endif
3600#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003601 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003602#endif
3603#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003604 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003605#endif
3606#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003607 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003608#endif
3609#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003610 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003611#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003612#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003613 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003614#endif
3615#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003616 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003617#endif
3618#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003619 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003620#endif
3621#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003622 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003623#endif
3624#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003625 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003626#endif
3627#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003628 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003629#endif
3630#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003631 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003632#endif
3633#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003634 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003635#endif
3636#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003637 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003638#endif
3639#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003640 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003641#endif
3642#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003643 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003644#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003645#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003646 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003647#endif
3648#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003649 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003650#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003651#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003652 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003653#endif
3654#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003655 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003656#endif
3657#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003658 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003659#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003660#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003661 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003662#endif
3663/**/
3664#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003665 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003666#else
Fred Drake4baedc12002-04-01 14:53:37 +00003667 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003668#endif
3669#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003670 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003671#endif
3672
3673 /* Some port configuration */
3674#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003675 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003676#else
Fred Drake4baedc12002-04-01 14:53:37 +00003677 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003678#endif
3679#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003680 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003681#else
Fred Drake4baedc12002-04-01 14:53:37 +00003682 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003683#endif
3684
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003685 /* Some reserved IP v.4 addresses */
3686#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003687 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003688#else
Fred Drake4baedc12002-04-01 14:53:37 +00003689 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003690#endif
3691#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003692 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003693#else
Fred Drake4baedc12002-04-01 14:53:37 +00003694 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003695#endif
3696#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003697 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003698#else
Fred Drake4baedc12002-04-01 14:53:37 +00003699 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003700#endif
3701#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003702 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003703#else
Fred Drake4baedc12002-04-01 14:53:37 +00003704 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003705#endif
3706#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003707 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3708 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003709#else
Fred Drake4baedc12002-04-01 14:53:37 +00003710 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003711#endif
3712#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003713 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3714 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003715#else
Fred Drake4baedc12002-04-01 14:53:37 +00003716 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003717#endif
3718#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003719 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003720#else
Fred Drake4baedc12002-04-01 14:53:37 +00003721 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003722#endif
3723
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003724 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003725#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003726 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003727#endif
3728#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003729 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003730#endif
3731#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003732 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003733#endif
3734#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003735 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003736#endif
3737#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003738 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003739#endif
3740#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003741 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003742#endif
3743#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003744 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003745#endif
3746#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003747 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003748#endif
3749#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003750 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003751#endif
3752#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003753 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003754#endif
3755#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003756 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003757#endif
3758#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003759 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003760#endif
3761#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003762 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003763#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003764#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003765 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3766 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003767#endif
3768#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003769 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3770 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003771#endif
3772#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003773 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003774#endif
3775
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003776 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3777#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003778 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003779#endif
3780#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003781 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003782#endif
3783#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003784 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003785#endif
3786#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003787 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003788#endif
3789#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003790 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003791#endif
3792#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003793 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003794#endif
3795
Guido van Rossum09be4091999-08-09 14:40:40 +00003796 /* TCP options */
3797#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003798 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003799#endif
3800#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003801 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003802#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003803#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003804 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003805#endif
3806#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003807 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003808#endif
3809#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003810 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003811#endif
3812#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003813 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003814#endif
3815#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003816 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003817#endif
3818#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003819 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003820#endif
3821#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003822 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003823#endif
3824#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003825 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003826#endif
3827#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003828 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003829#endif
3830#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003831 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003832#endif
3833
Guido van Rossum09be4091999-08-09 14:40:40 +00003834
3835 /* IPX options */
3836#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003837 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003838#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003839
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003840 /* get{addr,name}info parameters */
3841#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003842 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003843#endif
3844#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003845 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003846#endif
3847#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003848 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003849#endif
3850#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003851 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003852#endif
3853#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003854 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003855#endif
3856#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003857 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003858#endif
3859#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003860 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003861#endif
3862#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003863 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003864#endif
3865#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003866 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003867#endif
3868#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003869 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003870#endif
3871#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003872 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003873#endif
3874#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003875 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003876#endif
3877#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003878 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003879#endif
3880#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003881 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003882#endif
3883#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003884 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003885#endif
3886#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003887 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003888#endif
3889#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003890 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003891#endif
3892#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003893 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003894#endif
3895#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003896 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003897#endif
3898#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003899 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003900#endif
3901#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003902 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003903#endif
3904#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003905 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003906#endif
3907#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003908 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003909#endif
3910#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003911 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003912#endif
3913#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003914 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003915#endif
3916#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003917 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003918#endif
3919#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003920 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003921#endif
3922#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003923 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003924#endif
3925#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003926 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003927#endif
3928#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003929 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003930#endif
3931
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003932 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003933#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003934 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003935#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003936}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003937
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003938
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003939#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003940
3941/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003942/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003943
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003944int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003945inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003946{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003947 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003948 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003949 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003950 if (packed_addr == INADDR_NONE)
3951 return 0;
3952 memcpy(dst, &packed_addr, 4);
3953 return 1;
3954 }
3955 /* Should set errno to EAFNOSUPPORT */
3956 return -1;
3957}
3958
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003959const char *
3960inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003961{
3962 if (af == AF_INET) {
3963 struct in_addr packed_addr;
3964 if (size < 16)
3965 /* Should set errno to ENOSPC. */
3966 return NULL;
3967 memcpy(&packed_addr, src, sizeof(packed_addr));
3968 return strncpy(dst, inet_ntoa(packed_addr), size);
3969 }
3970 /* Should set errno to EAFNOSUPPORT */
3971 return NULL;
3972}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003973
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003974#endif