blob: 956c59ebffc694e96277c31444ff317d3947ea98 [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
Just van Rossum1040d2c2003-05-09 07:53:18 +0000143/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000144 (this includes the getaddrinfo emulation) protect access with a lock. */
Just van Rossum16e426b2003-05-09 08:12:00 +0000145#if defined(WITH_THREAD) && (defined(__APPLE__) || defined(__FreeBSD__) || \
146 defined(__OpenBSD__) || defined(__NetBSD__) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000147#define USE_GETADDRINFO_LOCK
148#endif
149
150#ifdef USE_GETADDRINFO_LOCK
151#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
152#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
153#else
154#define ACQUIRE_GETADDRINFO_LOCK
155#define RELEASE_GETADDRINFO_LOCK
156#endif
157
158#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000160#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000161
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000162#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163# include <types.h>
164# include <io.h>
165# include <sys/ioctl.h>
166# include <utils.h>
167# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000168#endif
169
Martin v. Löwis9e437302002-12-06 12:57:26 +0000170#if defined(__VMS)
171#if ! defined(_SOCKADDR_LEN)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000172# ifdef getaddrinfo
173# undef getaddrinfo
174# endif
175# include "TCPIP_IOCTL_ROUTINE"
176#else
177# include <ioctl.h>
178#endif
Martin v. Löwis9e437302002-12-06 12:57:26 +0000179#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000180
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000181#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000182# define INCL_DOS
183# define INCL_DOSERRORS
184# define INCL_NOPMAPI
185# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000186#endif
187
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000188#if defined(__sgi)&&_COMPILER_VERSION>700 && !_SGIAPI
189/* make sure that the reentrant (gethostbyaddr_r etc)
190 functions are declared correctly if compiling with
191 MIPSPro 7.x in ANSI C mode (default) */
192#define _SGIAPI 1
193#include "netdb.h"
194#endif
195
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000196/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000197#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000198#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000199
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000200/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000201#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000202#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000203
204/* Addressing includes */
205
Guido van Rossum6f489d91996-06-28 20:15:15 +0000206#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000207
208/* Non-MS WINDOWS includes */
209# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000210
Guido van Rossum9376b741999-09-15 22:01:40 +0000211/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000212# ifdef __BEOS__
213# include <net/netdb.h>
214# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
215# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000216typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000217# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000218# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000219# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000220
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000221# ifndef RISCOS
222# include <fcntl.h>
223# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000224# include <sys/ioctl.h>
225# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000227int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000228# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000229# endif
230
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000231#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000232
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000233/* MS_WINDOWS includes */
234# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000235
Jeremy Hylton22308652001-02-02 03:23:09 +0000236#endif
237
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000238#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000240#endif
241
242#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000243# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000244#endif
245
Neal Norwitz39d22e52002-11-02 19:55:21 +0000246#ifndef O_NONBLOCK
247# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000248#endif
249
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000250#include "addrinfo.h"
251
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000252#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000253int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000254const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000255#endif
256
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000257#ifdef __APPLE__
258/* On OS X, getaddrinfo returns no error indication of lookup
259 failure, so we must use the emulation instead of the libinfo
260 implementation. Unfortunately, performing an autoconf test
261 for this bug would require DNS access for the machine performing
262 the configuration, which is not acceptable. Therefore, we
263 determine the bug just by checking for __APPLE__. If this bug
264 gets ever fixed, perhaps checking for sys/version.h would be
265 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000266#ifndef HAVE_GETNAMEINFO
267/* This bug seems to be fixed in Jaguar. Ths easiest way I could
268 Find to check for Jaguar is that it has getnameinfo(), which
269 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000270#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000271#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000272#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000273
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000274/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000275#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000276/* avoid clashes with the C library definition of the symbol. */
277#define getaddrinfo fake_getaddrinfo
278#define gai_strerror fake_gai_strerror
279#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000280#include "getaddrinfo.c"
281#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000282#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000283#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000284#include "getnameinfo.c"
285#endif
286
Guido van Rossumbcc20741998-08-04 22:53:56 +0000287#if defined(MS_WINDOWS) || defined(__BEOS__)
288/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000289/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000290#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000291#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000292#endif
293
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000294#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000295#define EAFNOSUPPORT WSAEAFNOSUPPORT
296#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000297#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000298
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000299#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000300#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000301#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000302#endif
303
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000304#ifndef SOCKETCLOSE
305#define SOCKETCLOSE close
306#endif
307
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000308#ifdef __VMS
309/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
310#define SEGMENT_SIZE 65535
311#endif
312
Martin v. Löwise9416172003-05-03 10:12:45 +0000313/*
314 * Constants for getnameinfo()
315 */
316#if !defined(NI_MAXHOST)
317#define NI_MAXHOST 1025
318#endif
319#if !defined(NI_MAXSERV)
320#define NI_MAXSERV 32
321#endif
322
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000323/* XXX There's a problem here: *static* functions are not supposed to have
324 a Py prefix (or use CapitalizedWords). Later... */
325
Guido van Rossum30a685f1991-06-27 15:51:29 +0000326/* Global variable holding the exception type for errors detected
327 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000328static PyObject *socket_error;
329static PyObject *socket_herror;
330static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000331
Guido van Rossum48a680c2001-03-02 06:34:14 +0000332#ifdef RISCOS
333/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
334static int taskwindow;
335#endif
336
Tim Peters643a7fc2002-02-17 04:13:21 +0000337/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000338 The sock_type variable contains pointers to various functions,
339 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000340 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000341static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000342
Guido van Rossum30a685f1991-06-27 15:51:29 +0000343/* Convenience function to raise an error according to errno
344 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000345
Guido van Rossum73624e91994-10-10 17:59:00 +0000346static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000347set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000348{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000349#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000350 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000351 static struct {
352 int no;
353 const char *msg;
354 } *msgp, msgs[] = {
355 {WSAEINTR, "Interrupted system call"},
356 {WSAEBADF, "Bad file descriptor"},
357 {WSAEACCES, "Permission denied"},
358 {WSAEFAULT, "Bad address"},
359 {WSAEINVAL, "Invalid argument"},
360 {WSAEMFILE, "Too many open files"},
361 {WSAEWOULDBLOCK,
362 "The socket operation could not complete "
363 "without blocking"},
364 {WSAEINPROGRESS, "Operation now in progress"},
365 {WSAEALREADY, "Operation already in progress"},
366 {WSAENOTSOCK, "Socket operation on non-socket"},
367 {WSAEDESTADDRREQ, "Destination address required"},
368 {WSAEMSGSIZE, "Message too long"},
369 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
370 {WSAENOPROTOOPT, "Protocol not available"},
371 {WSAEPROTONOSUPPORT, "Protocol not supported"},
372 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
373 {WSAEOPNOTSUPP, "Operation not supported"},
374 {WSAEPFNOSUPPORT, "Protocol family not supported"},
375 {WSAEAFNOSUPPORT, "Address family not supported"},
376 {WSAEADDRINUSE, "Address already in use"},
377 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
378 {WSAENETDOWN, "Network is down"},
379 {WSAENETUNREACH, "Network is unreachable"},
380 {WSAENETRESET, "Network dropped connection on reset"},
381 {WSAECONNABORTED, "Software caused connection abort"},
382 {WSAECONNRESET, "Connection reset by peer"},
383 {WSAENOBUFS, "No buffer space available"},
384 {WSAEISCONN, "Socket is already connected"},
385 {WSAENOTCONN, "Socket is not connected"},
386 {WSAESHUTDOWN, "Can't send after socket shutdown"},
387 {WSAETOOMANYREFS, "Too many references: can't splice"},
388 {WSAETIMEDOUT, "Operation timed out"},
389 {WSAECONNREFUSED, "Connection refused"},
390 {WSAELOOP, "Too many levels of symbolic links"},
391 {WSAENAMETOOLONG, "File name too long"},
392 {WSAEHOSTDOWN, "Host is down"},
393 {WSAEHOSTUNREACH, "No route to host"},
394 {WSAENOTEMPTY, "Directory not empty"},
395 {WSAEPROCLIM, "Too many processes"},
396 {WSAEUSERS, "Too many users"},
397 {WSAEDQUOT, "Disc quota exceeded"},
398 {WSAESTALE, "Stale NFS file handle"},
399 {WSAEREMOTE, "Too many levels of remote in path"},
400 {WSASYSNOTREADY, "Network subsystem is unvailable"},
401 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
402 {WSANOTINITIALISED,
403 "Successful WSAStartup() not yet performed"},
404 {WSAEDISCON, "Graceful shutdown in progress"},
405 /* Resolver errors */
406 {WSAHOST_NOT_FOUND, "No such host is known"},
407 {WSATRY_AGAIN, "Host not found, or server failed"},
408 {WSANO_RECOVERY, "Unexpected server error encountered"},
409 {WSANO_DATA, "Valid name without requested data"},
410 {WSANO_ADDRESS, "No address, look for MX record"},
411 {0, NULL}
412 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000413 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000414 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000415 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000416
Mark Hammond46a733d2000-07-24 01:45:11 +0000417 for (msgp = msgs; msgp->msg; msgp++) {
418 if (err_no == msgp->no) {
419 msg = msgp->msg;
420 break;
421 }
422 }
423
424 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000425 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000426 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000427 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000428 }
429 return NULL;
430 }
431 else
432#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000433
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000434#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000435 if (sock_errno() != NO_ERROR) {
436 APIRET rc;
437 ULONG msglen;
438 char outbuf[100];
439 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000440
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000441 /* Retrieve socket-related error message from MPTN.MSG file */
442 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
443 myerrorcode - SOCBASEERR + 26,
444 "mptn.msg",
445 &msglen);
446 if (rc == NO_ERROR) {
447 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000448
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000449 /* OS/2 doesn't guarantee a terminator */
450 outbuf[msglen] = '\0';
451 if (strlen(outbuf) > 0) {
452 /* If non-empty msg, trim CRLF */
453 char *lastc = &outbuf[ strlen(outbuf)-1 ];
454 while (lastc > outbuf && isspace(*lastc)) {
455 /* Trim trailing whitespace (CRLF) */
456 *lastc-- = '\0';
457 }
458 }
459 v = Py_BuildValue("(is)", myerrorcode, outbuf);
460 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000461 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000462 Py_DECREF(v);
463 }
464 return NULL;
465 }
466 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000467#endif
468
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000469#if defined(RISCOS)
470 if (_inet_error.errnum != NULL) {
471 PyObject *v;
472 v = Py_BuildValue("(is)", errno, _inet_err());
473 if (v != NULL) {
474 PyErr_SetObject(socket_error, v);
475 Py_DECREF(v);
476 }
477 return NULL;
478 }
479#endif
480
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000481 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000482}
483
Guido van Rossum30a685f1991-06-27 15:51:29 +0000484
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000485static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000486set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000487{
488 PyObject *v;
489
490#ifdef HAVE_HSTRERROR
491 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
492#else
493 v = Py_BuildValue("(is)", h_error, "host not found");
494#endif
495 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000496 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000497 Py_DECREF(v);
498 }
499
500 return NULL;
501}
502
503
504static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000505set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000506{
507 PyObject *v;
508
Martin v. Löwis272cb402002-03-01 08:31:07 +0000509#ifdef EAI_SYSTEM
510 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000511 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000512 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000513#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000514
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000515#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000516 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000517#else
518 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
519#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000520 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000521 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000522 Py_DECREF(v);
523 }
524
525 return NULL;
526}
527
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000528/* Function to perform the setting of socket blocking mode
529 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000530static int
531internal_setblocking(PySocketSockObject *s, int block)
532{
533#ifndef RISCOS
534#ifndef MS_WINDOWS
535 int delay_flag;
536#endif
537#endif
538
539 Py_BEGIN_ALLOW_THREADS
540#ifdef __BEOS__
541 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000542 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
543 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000544#else
545#ifndef RISCOS
546#ifndef MS_WINDOWS
547#if defined(PYOS_OS2) && !defined(PYCC_GCC)
548 block = !block;
549 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000550#elif defined(__VMS)
551 block = !block;
552 ioctl(s->sock_fd, FIONBIO, (char *)&block);
553#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000554 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
555 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000556 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000557 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000558 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000559 fcntl(s->sock_fd, F_SETFL, delay_flag);
560#endif /* !PYOS_OS2 */
561#else /* MS_WINDOWS */
562 block = !block;
563 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
564#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000565#else /* RISCOS */
566 block = !block;
567 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000568#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000569#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000570 Py_END_ALLOW_THREADS
571
572 /* Since these don't return anything */
573 return 1;
574}
575
Guido van Rossum11ba0942002-06-13 15:07:44 +0000576/* Do a select() on the socket, if necessary (sock_timeout > 0).
577 The argument writing indicates the direction.
578 This does not raise an exception or return a success indicator;
579 we'll let the actual socket call do that. */
580static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000581internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000582{
583 fd_set fds;
584 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000585
Guido van Rossumad654902002-07-19 12:44:59 +0000586 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000587 if (s->sock_timeout <= 0.0)
588 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000589
Guido van Rossumad654902002-07-19 12:44:59 +0000590 /* Guard against closed socket */
591 if (s->sock_fd < 0)
592 return;
593
Guido van Rossum67f7a382002-06-06 21:08:16 +0000594 /* Construct the arguments to select */
595 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000596 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597 FD_ZERO(&fds);
598 FD_SET(s->sock_fd, &fds);
599
600 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000601 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000602 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000603 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000604 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000605}
606
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000607/* Initialize a new socket object. */
608
Tim Petersa12b4cf2002-07-18 22:38:44 +0000609static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000610
Mark Hammond62b1ab12002-07-23 06:31:15 +0000611PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000612init_sockobject(PySocketSockObject *s,
613 SOCKET_T fd, int family, int type, int proto)
614{
615#ifdef RISCOS
616 int block = 1;
617#endif
618 s->sock_fd = fd;
619 s->sock_family = family;
620 s->sock_type = type;
621 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000622 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000623
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000624 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000625
626 if (defaulttimeout >= 0.0)
627 internal_setblocking(s, 0);
628
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000629#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000630 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000631 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000632#endif
633}
634
635
Guido van Rossum30a685f1991-06-27 15:51:29 +0000636/* Create a new socket object.
637 This just creates the object and initializes it.
638 If the creation fails, return NULL and set an exception (implicit
639 in NEWOBJ()). */
640
Guido van Rossum73624e91994-10-10 17:59:00 +0000641static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000642new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000643{
Guido van Rossum73624e91994-10-10 17:59:00 +0000644 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000645 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000646 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000647 if (s != NULL)
648 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000649 return s;
650}
651
Guido van Rossum30a685f1991-06-27 15:51:29 +0000652
Guido van Rossum48a680c2001-03-02 06:34:14 +0000653/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000654 thread to be in gethostbyname or getaddrinfo */
655#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
656PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000657#endif
658
659
Guido van Rossum30a685f1991-06-27 15:51:29 +0000660/* Convert a string specifying a host name or one of a few symbolic
661 names to a numeric IP address. This usually calls gethostbyname()
662 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000663 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000664 an error occurred; then an exception is raised. */
665
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000666static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000667setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000668{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000669 struct addrinfo hints, *res;
670 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000671 int d1, d2, d3, d4;
672 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000673
Guido van Rossuma376cc51996-12-05 23:43:35 +0000674 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000675 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000676 int siz;
677 memset(&hints, 0, sizeof(hints));
678 hints.ai_family = af;
679 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
680 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000681 Py_BEGIN_ALLOW_THREADS
682 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000683 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000684 Py_END_ALLOW_THREADS
685 /* We assume that those thread-unsafe getaddrinfo() versions
686 *are* safe regarding their return value, ie. that a
687 subsequent call to getaddrinfo() does not destroy the
688 outcome of the first call. */
689 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000690 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000691 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000692 return -1;
693 }
694 switch (res->ai_family) {
695 case AF_INET:
696 siz = 4;
697 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000698#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000699 case AF_INET6:
700 siz = 16;
701 break;
702#endif
703 default:
704 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000705 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000706 "unsupported address family");
707 return -1;
708 }
709 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000710 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000711 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000712 "wildcard resolved to multiple address");
713 return -1;
714 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000715 if (res->ai_addrlen < addr_ret_size)
716 addr_ret_size = res->ai_addrlen;
717 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000718 freeaddrinfo(res);
719 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000720 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000721 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000722 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000723 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000724 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000725 "address family mismatched");
726 return -1;
727 }
728 sin = (struct sockaddr_in *)addr_ret;
729 memset((void *) sin, '\0', sizeof(*sin));
730 sin->sin_family = AF_INET;
731#ifdef HAVE_SOCKADDR_SA_LEN
732 sin->sin_len = sizeof(*sin);
733#endif
734 sin->sin_addr.s_addr = INADDR_BROADCAST;
735 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000736 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000737 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
738 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
739 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
740 struct sockaddr_in *sin;
741 sin = (struct sockaddr_in *)addr_ret;
742 sin->sin_addr.s_addr = htonl(
743 ((long) d1 << 24) | ((long) d2 << 16) |
744 ((long) d3 << 8) | ((long) d4 << 0));
745 sin->sin_family = AF_INET;
746#ifdef HAVE_SOCKADDR_SA_LEN
747 sin->sin_len = sizeof(*sin);
748#endif
749 return 4;
750 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000751 memset(&hints, 0, sizeof(hints));
752 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000753 Py_BEGIN_ALLOW_THREADS
754 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000755 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000756#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000757 if (error == EAI_NONAME && af == AF_UNSPEC) {
758 /* On Tru64 V5.1, numeric-to-addr conversion fails
759 if no address family is given. Assume IPv4 for now.*/
760 hints.ai_family = AF_INET;
761 error = getaddrinfo(name, NULL, &hints, &res);
762 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000763#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000764 Py_END_ALLOW_THREADS
765 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000766 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000767 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000768 return -1;
769 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000770 if (res->ai_addrlen < addr_ret_size)
771 addr_ret_size = res->ai_addrlen;
772 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000773 freeaddrinfo(res);
774 switch (addr_ret->sa_family) {
775 case AF_INET:
776 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000777#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000778 case AF_INET6:
779 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000780#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000781 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000782 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000783 return -1;
784 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785}
786
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788/* Create a string object representing an IP address.
789 This is always a string of the form 'dd.dd.dd.dd' (with variable
790 size numbers). */
791
Guido van Rossum73624e91994-10-10 17:59:00 +0000792static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000793makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000794{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000795 char buf[NI_MAXHOST];
796 int error;
797
798 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
799 NI_NUMERICHOST);
800 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000801 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000802 return NULL;
803 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000804 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000805}
806
807
808/* Create an object representing the given socket address,
809 suitable for passing it back to bind(), connect() etc.
810 The family field of the sockaddr structure is inspected
811 to determine what kind of address it really is. */
812
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000814static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000815makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000816{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000817 if (addrlen == 0) {
818 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000819 Py_INCREF(Py_None);
820 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000821 }
822
Guido van Rossumbcc20741998-08-04 22:53:56 +0000823#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000824 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000825 addr->sa_family = AF_INET;
826#endif
827
Guido van Rossum30a685f1991-06-27 15:51:29 +0000828 switch (addr->sa_family) {
829
830 case AF_INET:
831 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000832 struct sockaddr_in *a;
833 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000834 PyObject *ret = NULL;
835 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000836 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000837 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
838 Py_DECREF(addrobj);
839 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000840 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000841 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000842
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000843#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844 case AF_UNIX:
845 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000846 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000847 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000848 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000849#endif /* AF_UNIX */
850
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000851#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000852 case AF_INET6:
853 {
854 struct sockaddr_in6 *a;
855 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
856 PyObject *ret = NULL;
857 if (addrobj) {
858 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000859 ret = Py_BuildValue("Oiii",
860 addrobj,
861 ntohs(a->sin6_port),
862 a->sin6_flowinfo,
863 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000864 Py_DECREF(addrobj);
865 }
866 return ret;
867 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000868#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000869
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000870#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000871 case AF_PACKET:
872 {
873 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
874 char *ifname = "";
875 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000876 /* need to look up interface name give index */
877 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000878 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000879 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000880 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000881 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000882 return Py_BuildValue("shbhs#",
883 ifname,
884 ntohs(a->sll_protocol),
885 a->sll_pkttype,
886 a->sll_hatype,
887 a->sll_addr,
888 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000889 }
890#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000891
Guido van Rossum30a685f1991-06-27 15:51:29 +0000892 /* More cases here... */
893
894 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000895 /* If we don't know the address family, don't raise an
896 exception -- return it as a tuple. */
897 return Py_BuildValue("is#",
898 addr->sa_family,
899 addr->sa_data,
900 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000901
Guido van Rossum30a685f1991-06-27 15:51:29 +0000902 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000903}
904
Guido van Rossum30a685f1991-06-27 15:51:29 +0000905
906/* Parse a socket address argument according to the socket object's
907 address family. Return 1 if the address was in the proper format,
908 0 of not. The address is returned through addr_ret, its length
909 through len_ret. */
910
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000911static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000912getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000913 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000915 switch (s->sock_family) {
916
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000917#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000918 case AF_UNIX:
919 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000920 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000921 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000922 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000923 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000924 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000926 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000927 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000928 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000929 return 0;
930 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000931 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000932 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000933 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000934 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000935 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000936 return 1;
937 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000938#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940 case AF_INET:
941 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000942 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000943 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000945 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000946 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000947 PyErr_Format(
948 PyExc_TypeError,
949 "getsockaddrarg: "
950 "AF_INET address must be tuple, not %.500s",
951 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000952 return 0;
953 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000954 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
955 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000956 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000957 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000958 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000959 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000960 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000961 *addr_ret = (struct sockaddr *) addr;
962 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000963 return 1;
964 }
965
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000966#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000967 case AF_INET6:
968 {
969 struct sockaddr_in6* addr;
970 char *host;
971 int port, flowinfo, scope_id;
972 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
973 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +0000974 if (!PyArg_ParseTuple(args, "eti|ii",
975 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000976 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000977 return 0;
978 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000979 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000980 return 0;
981 addr->sin6_family = s->sock_family;
982 addr->sin6_port = htons((short)port);
983 addr->sin6_flowinfo = flowinfo;
984 addr->sin6_scope_id = scope_id;
985 *addr_ret = (struct sockaddr *) addr;
986 *len_ret = sizeof *addr;
987 return 1;
988 }
989#endif
990
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000991#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000992 case AF_PACKET:
993 {
994 struct sockaddr_ll* addr;
995 struct ifreq ifr;
996 char *interfaceName;
997 int protoNumber;
998 int hatype = 0;
999 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001000 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001001
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001002 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
1003 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +00001004 return 0;
1005 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1006 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001007 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001008 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001009 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001010 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001011 addr = &(s->sock_addr.ll);
1012 addr->sll_family = AF_PACKET;
1013 addr->sll_protocol = htons((short)protoNumber);
1014 addr->sll_ifindex = ifr.ifr_ifindex;
1015 addr->sll_pkttype = pkttype;
1016 addr->sll_hatype = hatype;
1017 *addr_ret = (struct sockaddr *) addr;
1018 *len_ret = sizeof *addr;
1019 return 1;
1020 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001021#endif
1022
Guido van Rossum30a685f1991-06-27 15:51:29 +00001023 /* More cases here... */
1024
1025 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001026 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001027 return 0;
1028
1029 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001030}
1031
Guido van Rossum30a685f1991-06-27 15:51:29 +00001032
Guido van Rossum48a680c2001-03-02 06:34:14 +00001033/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001034 Return 1 if the family is known, 0 otherwise. The length is returned
1035 through len_ret. */
1036
1037static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001038getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001039{
1040 switch (s->sock_family) {
1041
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00001042#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001043 case AF_UNIX:
1044 {
1045 *len_ret = sizeof (struct sockaddr_un);
1046 return 1;
1047 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001048#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001049
1050 case AF_INET:
1051 {
1052 *len_ret = sizeof (struct sockaddr_in);
1053 return 1;
1054 }
1055
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001056#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001057 case AF_INET6:
1058 {
1059 *len_ret = sizeof (struct sockaddr_in6);
1060 return 1;
1061 }
1062#endif
1063
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001064#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001065 case AF_PACKET:
1066 {
1067 *len_ret = sizeof (struct sockaddr_ll);
1068 return 1;
1069 }
1070#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001071
Guido van Rossum710e1df1992-06-12 10:39:36 +00001072 /* More cases here... */
1073
1074 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001075 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001076 return 0;
1077
1078 }
1079}
1080
1081
Guido van Rossum30a685f1991-06-27 15:51:29 +00001082/* s.accept() method */
1083
Guido van Rossum73624e91994-10-10 17:59:00 +00001084static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001085sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001086{
1087 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001088 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001089 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001090 PyObject *sock = NULL;
1091 PyObject *addr = NULL;
1092 PyObject *res = NULL;
1093
Guido van Rossum710e1df1992-06-12 10:39:36 +00001094 if (!getsockaddrlen(s, &addrlen))
1095 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001096 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001097
Guido van Rossum73624e91994-10-10 17:59:00 +00001098 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001099 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001100 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001102
Fred Drakea04eaad2000-06-30 02:46:07 +00001103#ifdef MS_WINDOWS
1104 if (newfd == INVALID_SOCKET)
1105#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001106 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001107#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001108 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001109
Guido van Rossum30a685f1991-06-27 15:51:29 +00001110 /* Create the new object with unspecified family,
1111 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001112 sock = (PyObject *) new_sockobject(newfd,
1113 s->sock_family,
1114 s->sock_type,
1115 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001116
Barry Warsaw752300b1997-01-03 17:18:10 +00001117 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001118 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001119 goto finally;
1120 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001121 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001122 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001123 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001124 goto finally;
1125
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001126 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001127
Guido van Rossum67f7a382002-06-06 21:08:16 +00001128finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001129 Py_XDECREF(sock);
1130 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001131 return res;
1132}
1133
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001134PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001135"accept() -> (socket object, address info)\n\
1136\n\
1137Wait for an incoming connection. Return a new socket representing the\n\
1138connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001139info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001140
Guido van Rossum11ba0942002-06-13 15:07:44 +00001141/* s.setblocking(flag) method. Argument:
1142 False -- non-blocking mode; same as settimeout(0)
1143 True -- blocking mode; same as settimeout(None)
1144*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001145
Guido van Rossum73624e91994-10-10 17:59:00 +00001146static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001147sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001148{
1149 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001150
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001151 block = PyInt_AsLong(arg);
1152 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001153 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001154
Guido van Rossum11ba0942002-06-13 15:07:44 +00001155 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001156 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001157
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 Py_INCREF(Py_None);
1159 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001160}
Guido van Rossume4485b01994-09-07 14:32:49 +00001161
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001162PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001163"setblocking(flag)\n\
1164\n\
1165Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001166setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001167setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001168
Guido van Rossum11ba0942002-06-13 15:07:44 +00001169/* s.settimeout(timeout) method. Argument:
1170 None -- no timeout, blocking mode; same as setblocking(True)
1171 0.0 -- non-blocking mode; same as setblocking(False)
1172 > 0 -- timeout mode; operations time out after timeout seconds
1173 < 0 -- illegal; raises an exception
1174*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001175static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001176sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001177{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001178 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001179
1180 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001181 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001182 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001183 timeout = PyFloat_AsDouble(arg);
1184 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001185 if (!PyErr_Occurred())
1186 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001187 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001188 return NULL;
1189 }
1190 }
1191
Guido van Rossum11ba0942002-06-13 15:07:44 +00001192 s->sock_timeout = timeout;
1193 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001194
1195 Py_INCREF(Py_None);
1196 return Py_None;
1197}
1198
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001199PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001200"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001201\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001202Set a timeout on socket operations. 'timeout' can be a float,\n\
1203giving in seconds, or None. Setting a timeout of None disables\n\
1204the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001205Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001206
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001207/* s.gettimeout() method.
1208 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001209static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001210sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001211{
1212 if (s->sock_timeout < 0.0) {
1213 Py_INCREF(Py_None);
1214 return Py_None;
1215 }
1216 else
1217 return PyFloat_FromDouble(s->sock_timeout);
1218}
1219
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001220PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001221"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001222\n\
1223Returns the timeout in floating seconds associated with socket \n\
1224operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001225operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001226
Guido van Rossum48a680c2001-03-02 06:34:14 +00001227#ifdef RISCOS
1228/* s.sleeptaskw(1 | 0) method */
1229
1230static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001231sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001232{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001233 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001234 block = PyInt_AsLong(arg);
1235 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001236 return NULL;
1237 Py_BEGIN_ALLOW_THREADS
1238 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1239 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001240
Guido van Rossum67f7a382002-06-06 21:08:16 +00001241 Py_INCREF(Py_None);
1242 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001243}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001244PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001245"sleeptaskw(flag)\n\
1246\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001247Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001248#endif
1249
1250
Guido van Rossumaee08791992-09-08 09:05:33 +00001251/* s.setsockopt() method.
1252 With an integer third argument, sets an integer option.
1253 With a string third argument, sets an option from a buffer;
1254 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001255
Guido van Rossum73624e91994-10-10 17:59:00 +00001256static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001257sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001258{
1259 int level;
1260 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001261 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001262 char *buf;
1263 int buflen;
1264 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001265
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001266 if (PyArg_ParseTuple(args, "iii:setsockopt",
1267 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001268 buf = (char *) &flag;
1269 buflen = sizeof flag;
1270 }
1271 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001272 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001273 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1274 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001275 return NULL;
1276 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001277 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001278 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001279 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001280 Py_INCREF(Py_None);
1281 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001282}
1283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001284PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001285"setsockopt(level, option, value)\n\
1286\n\
1287Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001288The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001289
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001290
Guido van Rossumaee08791992-09-08 09:05:33 +00001291/* s.getsockopt() method.
1292 With two arguments, retrieves an integer option.
1293 With a third integer argument, retrieves a string buffer of that size;
1294 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001295
Guido van Rossum73624e91994-10-10 17:59:00 +00001296static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001297sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001298{
1299 int level;
1300 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001301 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001302 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001303 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001304
Guido van Rossumbcc20741998-08-04 22:53:56 +00001305#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001306 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001307 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001308 return NULL;
1309#else
1310
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001311 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1312 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001313 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001314
Guido van Rossumbe32c891996-06-20 16:25:29 +00001315 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001316 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001317 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001318 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001319 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001320 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001321 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001323 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001324#ifdef __VMS
1325 if (buflen > 1024) {
1326#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001327 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001328#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001329 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001330 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001331 return NULL;
1332 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001333 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001334 if (buf == NULL)
1335 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001336 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001337 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001338 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001339 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001340 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001341 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001342 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001343 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001344#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001345}
1346
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001347PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001348"getsockopt(level, option[, buffersize]) -> value\n\
1349\n\
1350Get a socket option. See the Unix manual for level and option.\n\
1351If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001352string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001353
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001354
Fred Drake728819a2000-07-01 03:40:12 +00001355/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001356
Guido van Rossum73624e91994-10-10 17:59:00 +00001357static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001358sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001359{
1360 struct sockaddr *addr;
1361 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001362 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001363
Fred Drake728819a2000-07-01 03:40:12 +00001364 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001365 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001366 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001367 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001368 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001369 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001370 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001371 Py_INCREF(Py_None);
1372 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001373}
1374
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001375PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001376"bind(address)\n\
1377\n\
1378Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001379pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001380sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001381
Guido van Rossum30a685f1991-06-27 15:51:29 +00001382
1383/* s.close() method.
1384 Set the file descriptor to -1 so operations tried subsequently
1385 will surely fail. */
1386
Guido van Rossum73624e91994-10-10 17:59:00 +00001387static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001388sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001389{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001390 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001391
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001392 if ((fd = s->sock_fd) != -1) {
1393 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001394 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001395 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001396 Py_END_ALLOW_THREADS
1397 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001398 Py_INCREF(Py_None);
1399 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001400}
1401
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001402PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001403"close()\n\
1404\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001405Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001406
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001407static int
1408internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1409{
1410 int res;
1411
1412 res = connect(s->sock_fd, addr, addrlen);
1413
1414#ifdef MS_WINDOWS
1415
1416 if (s->sock_timeout > 0.0) {
1417 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001418 /* This is a mess. Best solution: trust select */
1419 fd_set fds;
1420 struct timeval tv;
1421 tv.tv_sec = (int)s->sock_timeout;
1422 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1423 FD_ZERO(&fds);
1424 FD_SET(s->sock_fd, &fds);
1425 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1426 if (res == 0)
1427 res = WSAEWOULDBLOCK;
1428 else if (res > 0)
1429 res = 0;
1430 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001431 }
1432 }
1433
1434 if (res < 0)
1435 res = WSAGetLastError();
1436
1437#else
1438
1439 if (s->sock_timeout > 0.0) {
1440 if (res < 0 && errno == EINPROGRESS) {
1441 internal_select(s, 1);
1442 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001443 if (res < 0 && errno == EISCONN)
1444 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001445 }
1446 }
1447
1448 if (res < 0)
1449 res = errno;
1450
1451#endif
1452
1453 return res;
1454}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001455
Fred Drake728819a2000-07-01 03:40:12 +00001456/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001457
Guido van Rossum73624e91994-10-10 17:59:00 +00001458static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001459sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001460{
1461 struct sockaddr *addr;
1462 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001463 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001464
Fred Drake728819a2000-07-01 03:40:12 +00001465 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001466 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001467
Guido van Rossum73624e91994-10-10 17:59:00 +00001468 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001469 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001470 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001471
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001472 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001473 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001474 Py_INCREF(Py_None);
1475 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001476}
1477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001478PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001479"connect(address)\n\
1480\n\
1481Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001482is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001483
Guido van Rossum30a685f1991-06-27 15:51:29 +00001484
Fred Drake728819a2000-07-01 03:40:12 +00001485/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001486
1487static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001488sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001489{
1490 struct sockaddr *addr;
1491 int addrlen;
1492 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001493
Fred Drake728819a2000-07-01 03:40:12 +00001494 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001495 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001496
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001497 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001498 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001499 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001500
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001501 return PyInt_FromLong((long) res);
1502}
1503
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001504PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001505"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001506\n\
1507This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001508instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001509
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001510
Guido van Rossumed233a51992-06-23 09:07:03 +00001511/* s.fileno() method */
1512
Guido van Rossum73624e91994-10-10 17:59:00 +00001513static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001514sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001515{
Fred Drakea04eaad2000-06-30 02:46:07 +00001516#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001517 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001518#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001519 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001520#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001521}
1522
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001523PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001524"fileno() -> integer\n\
1525\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001526Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001527
Guido van Rossumed233a51992-06-23 09:07:03 +00001528
Guido van Rossumbe32c891996-06-20 16:25:29 +00001529#ifndef NO_DUP
1530/* s.dup() method */
1531
1532static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001533sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001534{
Fred Drakea04eaad2000-06-30 02:46:07 +00001535 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001536 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001537
Guido van Rossumbe32c891996-06-20 16:25:29 +00001538 newfd = dup(s->sock_fd);
1539 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001540 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001541 sock = (PyObject *) new_sockobject(newfd,
1542 s->sock_family,
1543 s->sock_type,
1544 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001545 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001546 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001547 return sock;
1548}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001549
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001550PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001551"dup() -> socket object\n\
1552\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001553Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001554
Guido van Rossumbe32c891996-06-20 16:25:29 +00001555#endif
1556
1557
Guido van Rossumc89705d1992-11-26 08:54:07 +00001558/* s.getsockname() method */
1559
Guido van Rossum73624e91994-10-10 17:59:00 +00001560static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001561sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001562{
1563 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001564 int res;
1565 socklen_t addrlen;
1566
Guido van Rossumc89705d1992-11-26 08:54:07 +00001567 if (!getsockaddrlen(s, &addrlen))
1568 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001569 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001570 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001571 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001572 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001573 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001574 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001575 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001576}
1577
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001578PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001579"getsockname() -> address info\n\
1580\n\
1581Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001582info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001583
Guido van Rossumc89705d1992-11-26 08:54:07 +00001584
Guido van Rossumb6775db1994-08-01 11:34:53 +00001585#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001586/* s.getpeername() method */
1587
Guido van Rossum73624e91994-10-10 17:59:00 +00001588static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001589sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001590{
1591 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001592 int res;
1593 socklen_t addrlen;
1594
Guido van Rossumc89705d1992-11-26 08:54:07 +00001595 if (!getsockaddrlen(s, &addrlen))
1596 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001597 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001598 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001599 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001600 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001601 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001602 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001603 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001604}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001605
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001606PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001607"getpeername() -> address info\n\
1608\n\
1609Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001610info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001611
Guido van Rossumb6775db1994-08-01 11:34:53 +00001612#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001613
1614
Guido van Rossum30a685f1991-06-27 15:51:29 +00001615/* s.listen(n) method */
1616
Guido van Rossum73624e91994-10-10 17:59:00 +00001617static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001618sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001619{
1620 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001621 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001622
1623 backlog = PyInt_AsLong(arg);
1624 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001625 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001626 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001627 if (backlog < 1)
1628 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001629 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001630 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001631 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001632 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001633 Py_INCREF(Py_None);
1634 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001635}
1636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001637PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001638"listen(backlog)\n\
1639\n\
1640Enable a server to accept connections. The backlog argument must be at\n\
1641least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001642will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001643
1644
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001645#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001646/* s.makefile(mode) method.
1647 Create a new open file object referring to a dupped version of
1648 the socket's file descriptor. (The dup() call is necessary so
1649 that the open file and socket objects may be closed independent
1650 of each other.)
1651 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1652
Guido van Rossum73624e91994-10-10 17:59:00 +00001653static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001654sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001655{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001656 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001657 char *mode = "r";
1658 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001659#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001660 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001661#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001662 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001663#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001664 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001665 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001666#ifdef __VMS
1667 char *mode_r = "r";
1668 char *mode_w = "w";
1669#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001670
Guido van Rossum43713e52000-02-29 13:59:29 +00001671 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001672 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001673#ifdef __VMS
1674 if (strcmp(mode,"rb") == 0) {
1675 mode = mode_r;
1676 }
1677 else {
1678 if (strcmp(mode,"wb") == 0) {
1679 mode = mode_w;
1680 }
1681 }
1682#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001683#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001684 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1685 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001686#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001687 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001688#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001689 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001690 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001691 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001692 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001693 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001694#ifdef USE_GUSI2
1695 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001696 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001697 bufsize = 0;
1698#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001699 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1700 if (f != NULL)
1701 PyFile_SetBufSize(f, bufsize);
1702 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001703}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001704
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001705PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001706"makefile([mode[, buffersize]]) -> file object\n\
1707\n\
1708Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001709The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001710
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001711#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001712
Guido van Rossum48a680c2001-03-02 06:34:14 +00001713
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001714/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001715
Guido van Rossum73624e91994-10-10 17:59:00 +00001716static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001717sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001718{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001719 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001720 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001721#ifdef __VMS
1722 int read_length;
1723 char *read_buf;
1724#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001725
Guido van Rossum43713e52000-02-29 13:59:29 +00001726 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001727 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001728
1729 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001730 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001731 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001732 return NULL;
1733 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001734
Guido van Rossum73624e91994-10-10 17:59:00 +00001735 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001736 if (buf == NULL)
1737 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001738
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001739#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001740 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001741 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001742 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001743 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001744
Guido van Rossum7c53b771995-09-13 18:39:47 +00001745 if (n < 0) {
1746 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001747 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001748 }
Tim Peters5de98422002-04-27 18:44:32 +00001749 if (n != len)
1750 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001751#else
1752 read_buf = PyString_AsString(buf);
1753 read_length = len;
1754 while (read_length != 0) {
1755 unsigned int segment;
1756
1757 segment = read_length /SEGMENT_SIZE;
1758 if (segment != 0) {
1759 segment = SEGMENT_SIZE;
1760 }
1761 else {
1762 segment = read_length;
1763 }
1764
1765 Py_BEGIN_ALLOW_THREADS
1766 internal_select(s, 0);
1767 n = recv(s->sock_fd, read_buf, segment, flags);
1768 Py_END_ALLOW_THREADS
1769
1770 if (n < 0) {
1771 Py_DECREF(buf);
1772 return s->errorhandler();
1773 }
1774 if (n != read_length) {
1775 read_buf += n;
1776 break;
1777 }
1778
1779 read_length -= segment;
1780 read_buf += segment;
1781 }
1782 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1783 {
1784 return NULL;
1785 }
1786#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001787 return buf;
1788}
1789
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001790PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001791"recv(buffersize[, flags]) -> data\n\
1792\n\
1793Receive up to buffersize bytes from the socket. For the optional flags\n\
1794argument, see the Unix manual. When no data is available, block until\n\
1795at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001796the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001797
Guido van Rossum30a685f1991-06-27 15:51:29 +00001798
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001799/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001800
Guido van Rossum73624e91994-10-10 17:59:00 +00001801static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001802sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001803{
1804 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001805 PyObject *buf = NULL;
1806 PyObject *addr = NULL;
1807 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001808 int len, n, flags = 0;
1809 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001810
Guido van Rossum43713e52000-02-29 13:59:29 +00001811 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001812 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001813
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001814 if (!getsockaddrlen(s, &addrlen))
1815 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001816 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001817 if (buf == NULL)
1818 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001819
Guido van Rossum73624e91994-10-10 17:59:00 +00001820 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001821 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001822 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001823 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001824#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001825#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001826 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001827#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001828 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001829#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001830#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001831 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001832#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001833 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001834 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001835
Guido van Rossum7c53b771995-09-13 18:39:47 +00001836 if (n < 0) {
1837 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001838 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001839 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001840
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001841 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001842 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001843
Guido van Rossum67f7a382002-06-06 21:08:16 +00001844 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001845 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001846 goto finally;
1847
Guido van Rossum73624e91994-10-10 17:59:00 +00001848 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001849
1850finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001851 Py_XDECREF(addr);
1852 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001853 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001854}
1855
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001856PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001857"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1858\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001859Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001860
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001861/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001862
Guido van Rossum73624e91994-10-10 17:59:00 +00001863static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001864sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001865{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001866 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001867 int len, n, flags = 0;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001868#ifdef __VMS
1869 int send_length;
1870#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001871
Guido van Rossum43713e52000-02-29 13:59:29 +00001872 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001873 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001874
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001875#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001876 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001877 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001878 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001879 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001880
Guido van Rossum30a685f1991-06-27 15:51:29 +00001881 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001882 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001883#else
1884 /* Divide packet into smaller segments for */
1885 /* TCP/IP Services for OpenVMS */
1886 send_length = len;
1887 while (send_length != 0) {
1888 unsigned int segment;
1889
1890 segment = send_length / SEGMENT_SIZE;
1891 if (segment != 0) {
1892 segment = SEGMENT_SIZE;
1893 }
1894 else {
1895 segment = send_length;
1896 }
1897 Py_BEGIN_ALLOW_THREADS
1898 internal_select(s, 1);
1899 n = send(s->sock_fd, buf, segment, flags);
1900 Py_END_ALLOW_THREADS
1901 if (n < 0) {
1902 return s->errorhandler();
1903 }
1904 send_length -= segment;
1905 buf += segment;
1906 } /* end while */
1907#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001908 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001909}
1910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001911PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001912"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001913\n\
1914Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001915argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001916sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001917
1918
1919/* s.sendall(data [,flags]) method */
1920
1921static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001922sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001923{
1924 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001925 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001926
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001927 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1928 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001929
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001930 Py_BEGIN_ALLOW_THREADS
1931 do {
Guido van Rossum8f24cdc2003-01-31 18:15:58 +00001932 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001933 n = send(s->sock_fd, buf, len, flags);
1934 if (n < 0)
1935 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001936 buf += n;
1937 len -= n;
1938 } while (len > 0);
1939 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001940
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001941 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001942 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001943
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001944 Py_INCREF(Py_None);
1945 return Py_None;
1946}
1947
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001948PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001949"sendall(data[, flags])\n\
1950\n\
1951Send a data string to the socket. For the optional flags\n\
1952argument, see the Unix manual. This calls send() repeatedly\n\
1953until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001954to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001955
Guido van Rossum30a685f1991-06-27 15:51:29 +00001956
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001957/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001958
Guido van Rossum73624e91994-10-10 17:59:00 +00001959static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001960sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001961{
Guido van Rossum73624e91994-10-10 17:59:00 +00001962 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001963 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001964 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001965 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001966
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001967 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001968 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001969 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001970 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1971 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001972 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001973 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001974
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001975 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001976 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001977
Guido van Rossum73624e91994-10-10 17:59:00 +00001978 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001979 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001980 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001981 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001982
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001983 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001984 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001985 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001986}
1987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001988PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001989"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001990\n\
1991Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001992For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001993
Guido van Rossum30a685f1991-06-27 15:51:29 +00001994
1995/* s.shutdown(how) method */
1996
Guido van Rossum73624e91994-10-10 17:59:00 +00001997static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001998sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001999{
2000 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002001 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002002
2003 how = PyInt_AsLong(arg);
2004 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002005 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002006 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002007 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002008 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002009 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002010 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002011 Py_INCREF(Py_None);
2012 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002013}
2014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002015PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002016"shutdown(flag)\n\
2017\n\
2018Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002019of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002020
Guido van Rossum30a685f1991-06-27 15:51:29 +00002021
2022/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002023
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002024static PyMethodDef sock_methods[] = {
2025 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002026 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002027 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002028 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002029 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002030 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002031 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002032 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002033 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002034 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002035#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002036 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002037 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002038#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002039 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002040 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002041#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002042 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002043 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002044#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002045 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002046 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002047 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002048 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002049 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002050 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002051#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002052 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002053 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002054#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002055 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002056 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002057 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002058 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002059 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002060 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002061 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002062 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002063 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002064 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002065 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002066 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002067 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002068 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002069 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002070 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002071 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002072 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002073 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002074 shutdown_doc},
2075#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002076 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002077 sleeptaskw_doc},
2078#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002079 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002080};
2081
Guido van Rossum30a685f1991-06-27 15:51:29 +00002082
Guido van Rossum73624e91994-10-10 17:59:00 +00002083/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002084 First close the file description. */
2085
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002086static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002087sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002088{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002089 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002090 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002091 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002092}
2093
Guido van Rossum30a685f1991-06-27 15:51:29 +00002094
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002095static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002096sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002097{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002098 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002099#if SIZEOF_SOCKET_T > SIZEOF_LONG
2100 if (s->sock_fd > LONG_MAX) {
2101 /* this can occur on Win64, and actually there is a special
2102 ugly printf formatter for decimal pointer length integer
2103 printing, only bother if necessary*/
2104 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002105 "no printf formatter to display "
2106 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002107 return NULL;
2108 }
2109#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002110 PyOS_snprintf(
2111 buf, sizeof(buf),
2112 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2113 (long)s->sock_fd, s->sock_family,
2114 s->sock_type,
2115 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002116 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002117}
2118
2119
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002120/* Create a new, uninitialized socket object. */
2121
2122static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002123sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002124{
2125 PyObject *new;
2126
2127 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002128 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002129 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002130 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002131 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002132 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002133 return new;
2134}
2135
2136
2137/* Initialize a new socket object. */
2138
2139/*ARGSUSED*/
2140static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002141sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002142{
2143 PySocketSockObject *s = (PySocketSockObject *)self;
2144 SOCKET_T fd;
2145 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2146 static char *keywords[] = {"family", "type", "proto", 0};
2147
2148 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2149 "|iii:socket", keywords,
2150 &family, &type, &proto))
2151 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002152
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002153 Py_BEGIN_ALLOW_THREADS
2154 fd = socket(family, type, proto);
2155 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002156
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002157#ifdef MS_WINDOWS
2158 if (fd == INVALID_SOCKET)
2159#else
2160 if (fd < 0)
2161#endif
2162 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002163 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002164 return -1;
2165 }
2166 init_sockobject(s, fd, family, type, proto);
2167 /* From now on, ignore SIGPIPE and let the error checking
2168 do the work. */
2169#ifdef SIGPIPE
2170 (void) signal(SIGPIPE, SIG_IGN);
2171#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002172
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002173 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002174
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002175}
2176
2177
Guido van Rossumb6775db1994-08-01 11:34:53 +00002178/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002179
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002180static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002181 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002182 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002183 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002184 sizeof(PySocketSockObject), /* tp_basicsize */
2185 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002186 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002187 0, /* tp_print */
2188 0, /* tp_getattr */
2189 0, /* tp_setattr */
2190 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002191 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002192 0, /* tp_as_number */
2193 0, /* tp_as_sequence */
2194 0, /* tp_as_mapping */
2195 0, /* tp_hash */
2196 0, /* tp_call */
2197 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002198 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002199 0, /* tp_setattro */
2200 0, /* tp_as_buffer */
2201 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002202 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002203 0, /* tp_traverse */
2204 0, /* tp_clear */
2205 0, /* tp_richcompare */
2206 0, /* tp_weaklistoffset */
2207 0, /* tp_iter */
2208 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002209 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002210 0, /* tp_members */
2211 0, /* tp_getset */
2212 0, /* tp_base */
2213 0, /* tp_dict */
2214 0, /* tp_descr_get */
2215 0, /* tp_descr_set */
2216 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002217 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002218 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002219 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002220 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002221};
2222
Guido van Rossum30a685f1991-06-27 15:51:29 +00002223
Guido van Rossum81194471991-07-27 21:42:02 +00002224/* Python interface to gethostname(). */
2225
2226/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002227static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002228socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002229{
2230 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002231 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002232 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002233 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002234 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002235 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002236 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002237 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002238 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002239 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002240 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002241}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002243PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002244"gethostname() -> string\n\
2245\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002246Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002247
Guido van Rossumff4949e1992-08-05 19:58:53 +00002248
Guido van Rossum30a685f1991-06-27 15:51:29 +00002249/* Python interface to gethostbyname(name). */
2250
2251/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002252static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002253socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002254{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002255 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002256#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002257 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002258#else
2259 struct sockaddr_in addrbuf;
2260#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002261
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002262 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002263 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002264 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002265 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002266 return makeipaddr((struct sockaddr *)&addrbuf,
2267 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002268}
2269
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002270PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002271"gethostbyname(host) -> address\n\
2272\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002273Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002274
2275
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002276/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2277
2278static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002279gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002280{
2281 char **pch;
2282 PyObject *rtn_tuple = (PyObject *)NULL;
2283 PyObject *name_list = (PyObject *)NULL;
2284 PyObject *addr_list = (PyObject *)NULL;
2285 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002286
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002287 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002288 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002289#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002290 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002291#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002292 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002293#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002294 return NULL;
2295 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002296
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002297 if (h->h_addrtype != af) {
2298#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002299 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002300 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002301 (char *)strerror(EAFNOSUPPORT));
2302#else
2303 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002304 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002305 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002306#endif
2307 return NULL;
2308 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002309
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002310 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002311
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002312 case AF_INET:
2313 if (alen < sizeof(struct sockaddr_in))
2314 return NULL;
2315 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002316
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002317#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002318 case AF_INET6:
2319 if (alen < sizeof(struct sockaddr_in6))
2320 return NULL;
2321 break;
2322#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002323
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002324 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002325
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002326 if ((name_list = PyList_New(0)) == NULL)
2327 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002328
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002329 if ((addr_list = PyList_New(0)) == NULL)
2330 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002331
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002332 for (pch = h->h_aliases; *pch != NULL; pch++) {
2333 int status;
2334 tmp = PyString_FromString(*pch);
2335 if (tmp == NULL)
2336 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002337
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002338 status = PyList_Append(name_list, tmp);
2339 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002340
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002341 if (status)
2342 goto err;
2343 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002344
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002345 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2346 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002347
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002348 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002349
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002350 case AF_INET:
2351 {
2352 struct sockaddr_in sin;
2353 memset(&sin, 0, sizeof(sin));
2354 sin.sin_family = af;
2355#ifdef HAVE_SOCKADDR_SA_LEN
2356 sin.sin_len = sizeof(sin);
2357#endif
2358 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2359 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002360
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002361 if (pch == h->h_addr_list && alen >= sizeof(sin))
2362 memcpy((char *) addr, &sin, sizeof(sin));
2363 break;
2364 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002365
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002366#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002367 case AF_INET6:
2368 {
2369 struct sockaddr_in6 sin6;
2370 memset(&sin6, 0, sizeof(sin6));
2371 sin6.sin6_family = af;
2372#ifdef HAVE_SOCKADDR_SA_LEN
2373 sin6.sin6_len = sizeof(sin6);
2374#endif
2375 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2376 tmp = makeipaddr((struct sockaddr *)&sin6,
2377 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002378
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002379 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2380 memcpy((char *) addr, &sin6, sizeof(sin6));
2381 break;
2382 }
2383#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002384
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002385 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002386 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002387 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002388 return NULL;
2389 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002390
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002391 if (tmp == NULL)
2392 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002393
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002394 status = PyList_Append(addr_list, tmp);
2395 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002396
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002397 if (status)
2398 goto err;
2399 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002400
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002401 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002402
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002403 err:
2404 Py_XDECREF(name_list);
2405 Py_XDECREF(addr_list);
2406 return rtn_tuple;
2407}
2408
2409
2410/* Python interface to gethostbyname_ex(name). */
2411
2412/*ARGSUSED*/
2413static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002414socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002415{
2416 char *name;
2417 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002418#ifdef ENABLE_IPV6
2419 struct sockaddr_storage addr;
2420#else
2421 struct sockaddr_in addr;
2422#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002423 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002424 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002425#ifdef HAVE_GETHOSTBYNAME_R
2426 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002427#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2428 struct hostent_data data;
2429#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002430 char buf[16384];
2431 int buf_len = (sizeof buf) - 1;
2432 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002433#endif
2434#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002435 int result;
2436#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002437#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002438
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002439 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002440 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002441 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002442 return NULL;
2443 Py_BEGIN_ALLOW_THREADS
2444#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002445#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002446 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2447 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002448#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002449 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002450#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002451 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002452 result = gethostbyname_r(name, &hp_allocated, &data);
2453 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002454#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002455#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002456#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002457 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002458#endif
2459 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002460#endif /* HAVE_GETHOSTBYNAME_R */
2461 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002462 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002463 addr.ss_family.
2464 Therefore, we cast the sockaddr_storage into sockaddr to
2465 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002466 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002467 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002468 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002469#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002470 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002471#endif
2472 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002473}
2474
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002475PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002476"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2477\n\
2478Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002479for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002480
2481
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002482/* Python interface to gethostbyaddr(IP). */
2483
2484/*ARGSUSED*/
2485static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002486socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002487{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002488#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002489 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002490#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002491 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002492#endif
2493 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002494 char *ip_num;
2495 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002496 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002497#ifdef HAVE_GETHOSTBYNAME_R
2498 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002499#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2500 struct hostent_data data;
2501#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002502 char buf[16384];
2503 int buf_len = (sizeof buf) - 1;
2504 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002505#endif
2506#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002507 int result;
2508#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002509#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002510 char *ap;
2511 int al;
2512 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002513
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002514 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002515 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002516 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002517 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002518 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002519 af = sa->sa_family;
2520 ap = NULL;
2521 al = 0;
2522 switch (af) {
2523 case AF_INET:
2524 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2525 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2526 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002527#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002528 case AF_INET6:
2529 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2530 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2531 break;
2532#endif
2533 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002534 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002535 return NULL;
2536 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002537 Py_BEGIN_ALLOW_THREADS
2538#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002539#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002540 result = gethostbyaddr_r(ap, al, af,
2541 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002542 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002543#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002544 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002545 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002546#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002547 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002548 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002549 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002550#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002551#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002552#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002553 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002554#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002555 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002556#endif /* HAVE_GETHOSTBYNAME_R */
2557 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002558 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002559#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002560 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002561#endif
2562 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002563}
2564
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002565PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002566"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2567\n\
2568Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002569for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002570
Guido van Rossum30a685f1991-06-27 15:51:29 +00002571
2572/* Python interface to getservbyname(name).
2573 This only returns the port number, since the other info is already
2574 known or not useful (like the list of aliases). */
2575
2576/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002577static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002578socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002579{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002580 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002581 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002582 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002583 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002584 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002585 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002586 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002587 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002588 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002589 return NULL;
2590 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002591 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002592}
2593
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002594PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002595"getservbyname(servicename, protocolname) -> integer\n\
2596\n\
2597Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002598The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002599
Guido van Rossum30a685f1991-06-27 15:51:29 +00002600
Guido van Rossum3901d851996-12-19 16:35:04 +00002601/* Python interface to getprotobyname(name).
2602 This only returns the protocol number, since the other info is
2603 already known or not useful (like the list of aliases). */
2604
2605/*ARGSUSED*/
2606static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002607socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002608{
2609 char *name;
2610 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002611#ifdef __BEOS__
2612/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002613 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002614 return NULL;
2615#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002616 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002617 return NULL;
2618 Py_BEGIN_ALLOW_THREADS
2619 sp = getprotobyname(name);
2620 Py_END_ALLOW_THREADS
2621 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002622 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002623 return NULL;
2624 }
2625 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002626#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002627}
2628
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002629PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002630"getprotobyname(name) -> integer\n\
2631\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002632Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002633
Guido van Rossum3901d851996-12-19 16:35:04 +00002634
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002635#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002636/* Create a socket object from a numeric file description.
2637 Useful e.g. if stdin is a socket.
2638 Additional arguments as for socket(). */
2639
2640/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002641static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002642socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002643{
Guido van Rossum73624e91994-10-10 17:59:00 +00002644 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002645 SOCKET_T fd;
2646 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002647 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2648 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002649 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002650 /* Dup the fd so it and the socket can be closed independently */
2651 fd = dup(fd);
2652 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002653 return set_error();
2654 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002655 /* From now on, ignore SIGPIPE and let the error checking
2656 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002657#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002658 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002659#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002660 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002661}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002662
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002663PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002664"fromfd(fd, family, type[, proto]) -> socket object\n\
2665\n\
2666Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002667The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002668
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002669#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002670
Guido van Rossum82a5c661998-07-07 20:45:43 +00002671
Guido van Rossum006bf911996-06-12 04:04:55 +00002672static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002673socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002674{
2675 int x1, x2;
2676
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002677 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002678 return NULL;
2679 }
2680 x2 = (int)ntohs((short)x1);
2681 return PyInt_FromLong(x2);
2682}
2683
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002684PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002685"ntohs(integer) -> integer\n\
2686\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002687Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002688
2689
Guido van Rossum006bf911996-06-12 04:04:55 +00002690static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002691socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002692{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002693 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002694
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002695 if (PyInt_Check(arg)) {
2696 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002697 if (x == (unsigned long) -1 && PyErr_Occurred())
2698 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002699 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002700 else if (PyLong_Check(arg)) {
2701 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002702 if (x == (unsigned long) -1 && PyErr_Occurred())
2703 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002704#if SIZEOF_LONG > 4
2705 {
2706 unsigned long y;
2707 /* only want the trailing 32 bits */
2708 y = x & 0xFFFFFFFFUL;
2709 if (y ^ x)
2710 return PyErr_Format(PyExc_OverflowError,
2711 "long int larger than 32 bits");
2712 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002713 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002714#endif
2715 }
2716 else
Tim Peters58141872002-08-06 22:25:02 +00002717 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002718 "expected int/long, %s found",
2719 arg->ob_type->tp_name);
2720 if (x == (unsigned long) -1 && PyErr_Occurred())
2721 return NULL;
2722 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002723}
2724
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002725PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002726"ntohl(integer) -> integer\n\
2727\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002728Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002729
2730
Guido van Rossum006bf911996-06-12 04:04:55 +00002731static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002732socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002733{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002734 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002735
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002736 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002737 return NULL;
2738 }
2739 x2 = (int)htons((short)x1);
2740 return PyInt_FromLong(x2);
2741}
2742
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002743PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002744"htons(integer) -> integer\n\
2745\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002746Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002747
2748
Guido van Rossum006bf911996-06-12 04:04:55 +00002749static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002750socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002751{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002752 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002753
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002754 if (PyInt_Check(arg)) {
2755 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002756 if (x == (unsigned long) -1 && PyErr_Occurred())
2757 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002758 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002759 else if (PyLong_Check(arg)) {
2760 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002761 if (x == (unsigned long) -1 && PyErr_Occurred())
2762 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002763#if SIZEOF_LONG > 4
2764 {
2765 unsigned long y;
2766 /* only want the trailing 32 bits */
2767 y = x & 0xFFFFFFFFUL;
2768 if (y ^ x)
2769 return PyErr_Format(PyExc_OverflowError,
2770 "long int larger than 32 bits");
2771 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002772 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002773#endif
2774 }
2775 else
Tim Peters58141872002-08-06 22:25:02 +00002776 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002777 "expected int/long, %s found",
2778 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002779 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002780}
2781
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002782PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002783"htonl(integer) -> integer\n\
2784\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002785Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002786
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002787/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002788
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002789PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002790"inet_aton(string) -> packed 32-bit IP representation\n\
2791\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002792Convert 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 +00002793binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002794
2795static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002796socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002797{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002798#ifndef INADDR_NONE
2799#define INADDR_NONE (-1)
2800#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002801#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002802 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002803#else
2804 /* Have to use inet_addr() instead */
2805 unsigned long packed_addr;
2806#endif
2807 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002808
Tim Peters1df9fdd2003-02-13 03:13:40 +00002809 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002810 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002811
Tim Peters1df9fdd2003-02-13 03:13:40 +00002812
2813#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002814 if (inet_aton(ip_addr, &buf))
2815 return PyString_FromStringAndSize((char *)(&buf),
2816 sizeof(buf));
2817
2818 PyErr_SetString(socket_error,
2819 "illegal IP address string passed to inet_aton");
2820 return NULL;
2821
Tim Peters1df9fdd2003-02-13 03:13:40 +00002822#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002823 /* XXX Problem here: inet_aton('255.255.255.255') raises
2824 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002825 packed_addr = inet_addr(ip_addr);
2826
2827 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002828 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002829 "illegal IP address string passed to inet_aton");
2830 return NULL;
2831 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002832 return PyString_FromStringAndSize((char *) &packed_addr,
2833 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002834#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002835}
2836
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002837PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002838"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002839\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002840Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002841
2842static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002843socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002844{
2845 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002846 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002847 struct in_addr packed_addr;
2848
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002849 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002850 return NULL;
2851 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002852
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002853 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002854 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002855 "packed IP wrong length for inet_ntoa");
2856 return NULL;
2857 }
2858
2859 memcpy(&packed_addr, packed_str, addr_len);
2860
2861 return PyString_FromString(inet_ntoa(packed_addr));
2862}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002863
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002864#ifdef HAVE_INET_PTON
2865
2866PyDoc_STRVAR(inet_pton_doc,
2867"inet_pton(af, ip) -> packed IP address string\n\
2868\n\
2869Convert an IP address from string format to a packed string suitable\n\
2870for use with low-level network functions.");
2871
2872static PyObject *
2873socket_inet_pton(PyObject *self, PyObject *args)
2874{
2875 int af;
2876 char* ip;
2877 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002878#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002879 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002880#else
2881 char packed[sizeof(struct in_addr)];
2882#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002883 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
2884 return NULL;
2885 }
2886
2887 retval = inet_pton(af, ip, packed);
2888 if (retval < 0) {
2889 PyErr_SetFromErrno(socket_error);
2890 return NULL;
2891 } else if (retval == 0) {
2892 PyErr_SetString(socket_error,
2893 "illegal IP address string passed to inet_pton");
2894 return NULL;
2895 } else if (af == AF_INET) {
2896 return PyString_FromStringAndSize(packed,
2897 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002898#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002899 } else if (af == AF_INET6) {
2900 return PyString_FromStringAndSize(packed,
2901 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002902#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002903 } else {
2904 PyErr_SetString(socket_error, "unknown address family");
2905 return NULL;
2906 }
2907}
2908
2909PyDoc_STRVAR(inet_ntop_doc,
2910"inet_ntop(af, packed_ip) -> string formatted IP address\n\
2911\n\
2912Convert a packed IP address of the given family to string format.");
2913
2914static PyObject *
2915socket_inet_ntop(PyObject *self, PyObject *args)
2916{
2917 int af;
2918 char* packed;
2919 int len;
2920 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002921#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002922 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002923#else
2924 char ip[INET_ADDRSTRLEN + 1];
2925#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002926
2927 /* Guarantee NUL-termination for PyString_FromString() below */
2928 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
2929
2930 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
2931 return NULL;
2932 }
2933
2934 if (af == AF_INET) {
2935 if (len != sizeof(struct in_addr)) {
2936 PyErr_SetString(PyExc_ValueError,
2937 "invalid length of packed IP address string");
2938 return NULL;
2939 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002940#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002941 } else if (af == AF_INET6) {
2942 if (len != sizeof(struct in6_addr)) {
2943 PyErr_SetString(PyExc_ValueError,
2944 "invalid length of packed IP address string");
2945 return NULL;
2946 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002947#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002948 } else {
2949 PyErr_Format(PyExc_ValueError,
2950 "unknown address family %d", af);
2951 return NULL;
2952 }
2953
2954 retval = inet_ntop(af, packed, ip, sizeof(ip));
2955 if (!retval) {
2956 PyErr_SetFromErrno(socket_error);
2957 return NULL;
2958 } else {
2959 return PyString_FromString(retval);
2960 }
2961
2962 /* NOTREACHED */
2963 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
2964 return NULL;
2965}
2966
2967#endif /* HAVE_INET_PTON */
2968
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002969/* Python interface to getaddrinfo(host, port). */
2970
2971/*ARGSUSED*/
2972static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002973socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002974{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002975 struct addrinfo hints, *res;
2976 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002977 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002978 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002979 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002980 char *hptr, *pptr;
2981 int family, socktype, protocol, flags;
2982 int error;
2983 PyObject *all = (PyObject *)NULL;
2984 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002985 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002986
2987 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002988 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002989 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
2990 &hobj, &pobj, &family, &socktype,
2991 &protocol, &flags)) {
2992 return NULL;
2993 }
2994 if (hobj == Py_None) {
2995 hptr = NULL;
2996 } else if (PyUnicode_Check(hobj)) {
2997 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
2998 if (!idna)
2999 return NULL;
3000 hptr = PyString_AsString(idna);
3001 } else if (PyString_Check(hobj)) {
3002 hptr = PyString_AsString(hobj);
3003 } else {
3004 PyErr_SetString(PyExc_TypeError,
3005 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003006 return NULL;
3007 }
3008 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003009 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003010 pptr = pbuf;
3011 } else if (PyString_Check(pobj)) {
3012 pptr = PyString_AsString(pobj);
3013 } else if (pobj == Py_None) {
3014 pptr = (char *)NULL;
3015 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003016 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003017 return NULL;
3018 }
3019 memset(&hints, 0, sizeof(hints));
3020 hints.ai_family = family;
3021 hints.ai_socktype = socktype;
3022 hints.ai_protocol = protocol;
3023 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003024 Py_BEGIN_ALLOW_THREADS
3025 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003026 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003027 Py_END_ALLOW_THREADS
3028 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003029 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003030 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003031 return NULL;
3032 }
3033
3034 if ((all = PyList_New(0)) == NULL)
3035 goto err;
3036 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003037 PyObject *addr =
3038 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
3039 if (addr == NULL)
3040 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003041 single = Py_BuildValue("iiisO", res->ai_family,
3042 res->ai_socktype, res->ai_protocol,
3043 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003044 addr);
3045 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003046 if (single == NULL)
3047 goto err;
3048
3049 if (PyList_Append(all, single))
3050 goto err;
3051 Py_XDECREF(single);
3052 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003053 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003054 if (res0)
3055 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003056 return all;
3057 err:
3058 Py_XDECREF(single);
3059 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003060 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003061 if (res0)
3062 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003063 return (PyObject *)NULL;
3064}
3065
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003066PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003067"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3068 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003069\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003070Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003071
3072/* Python interface to getnameinfo(sa, flags). */
3073
3074/*ARGSUSED*/
3075static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003076socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003077{
3078 PyObject *sa = (PyObject *)NULL;
3079 int flags;
3080 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003081 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003082 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3083 struct addrinfo hints, *res = NULL;
3084 int error;
3085 PyObject *ret = (PyObject *)NULL;
3086
3087 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003088 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003089 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003090 if (!PyArg_ParseTuple(sa, "si|ii",
3091 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003092 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003093 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003094 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003095 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003096 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003097 Py_BEGIN_ALLOW_THREADS
3098 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003099 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003100 Py_END_ALLOW_THREADS
3101 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003102 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003103 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003104 goto fail;
3105 }
3106 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003107 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003108 "sockaddr resolved to multiple addresses");
3109 goto fail;
3110 }
3111 switch (res->ai_family) {
3112 case AF_INET:
3113 {
3114 char *t1;
3115 int t2;
3116 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003117 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003118 "IPv4 sockaddr must be 2 tuple");
3119 goto fail;
3120 }
3121 break;
3122 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003123#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003124 case AF_INET6:
3125 {
3126 struct sockaddr_in6 *sin6;
3127 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3128 sin6->sin6_flowinfo = flowinfo;
3129 sin6->sin6_scope_id = scope_id;
3130 break;
3131 }
3132#endif
3133 }
3134 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3135 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3136 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003137 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003138 goto fail;
3139 }
3140 ret = Py_BuildValue("ss", hbuf, pbuf);
3141
3142fail:
3143 if (res)
3144 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003145 return ret;
3146}
3147
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003148PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003149"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003150\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003151Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003152
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003153
3154/* Python API to getting and setting the default timeout value. */
3155
3156static PyObject *
3157socket_getdefaulttimeout(PyObject *self)
3158{
3159 if (defaulttimeout < 0.0) {
3160 Py_INCREF(Py_None);
3161 return Py_None;
3162 }
3163 else
3164 return PyFloat_FromDouble(defaulttimeout);
3165}
3166
3167PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003168"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003169\n\
3170Returns the default timeout in floating seconds for new socket objects.\n\
3171A value of None indicates that new socket objects have no timeout.\n\
3172When the socket module is first imported, the default is None.");
3173
3174static PyObject *
3175socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3176{
3177 double timeout;
3178
3179 if (arg == Py_None)
3180 timeout = -1.0;
3181 else {
3182 timeout = PyFloat_AsDouble(arg);
3183 if (timeout < 0.0) {
3184 if (!PyErr_Occurred())
3185 PyErr_SetString(PyExc_ValueError,
3186 "Timeout value out of range");
3187 return NULL;
3188 }
3189 }
3190
3191 defaulttimeout = timeout;
3192
3193 Py_INCREF(Py_None);
3194 return Py_None;
3195}
3196
3197PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003198"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003199\n\
3200Set the default timeout in floating seconds for new socket objects.\n\
3201A value of None indicates that new socket objects have no timeout.\n\
3202When the socket module is first imported, the default is None.");
3203
3204
Guido van Rossum30a685f1991-06-27 15:51:29 +00003205/* List of functions exported by this module. */
3206
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003207static PyMethodDef socket_methods[] = {
3208 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003209 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003210 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003211 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003212 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003213 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003214 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003215 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003216 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003217 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003218 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003219 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003220#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003221 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003222 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003223#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003224 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003225 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003226 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003227 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003228 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003229 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003230 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003231 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003232 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003233 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003234 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003235 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003236#ifdef HAVE_INET_PTON
3237 {"inet_pton", socket_inet_pton,
3238 METH_VARARGS, inet_pton_doc},
3239 {"inet_ntop", socket_inet_ntop,
3240 METH_VARARGS, inet_ntop_doc},
3241#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003242 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003243 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003244 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003245 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003246 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003247 METH_NOARGS, getdefaulttimeout_doc},
3248 {"setdefaulttimeout", socket_setdefaulttimeout,
3249 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003250 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003251};
3252
Guido van Rossum30a685f1991-06-27 15:51:29 +00003253
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003254#ifdef RISCOS
3255#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003256
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003257static int
3258os_init(void)
3259{
3260 _kernel_swi_regs r;
3261
3262 r.r[0] = 0;
3263 _kernel_swi(0x43380, &r, &r);
3264 taskwindow = r.r[0];
3265
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003266 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003267}
3268
3269#endif /* RISCOS */
3270
3271
3272#ifdef MS_WINDOWS
3273#define OS_INIT_DEFINED
3274
3275/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003276
3277static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003278os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003279{
3280 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003281}
3282
3283static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003284os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003285{
3286 WSADATA WSAData;
3287 int ret;
3288 char buf[100];
3289 ret = WSAStartup(0x0101, &WSAData);
3290 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003291 case 0: /* No error */
3292 atexit(os_cleanup);
3293 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003294 case WSASYSNOTREADY:
3295 PyErr_SetString(PyExc_ImportError,
3296 "WSAStartup failed: network not ready");
3297 break;
3298 case WSAVERNOTSUPPORTED:
3299 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003300 PyErr_SetString(
3301 PyExc_ImportError,
3302 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003303 break;
3304 default:
Tim Peters885d4572001-11-28 20:27:42 +00003305 PyOS_snprintf(buf, sizeof(buf),
3306 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003307 PyErr_SetString(PyExc_ImportError, buf);
3308 break;
3309 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003310 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003311}
3312
Guido van Rossum8d665e61996-06-26 18:22:49 +00003313#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003314
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003315
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003316#ifdef PYOS_OS2
3317#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003318
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003319/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003320
3321static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003322os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003323{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003324#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003325 char reason[64];
3326 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003327
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003328 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003329 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003330 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003331
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003332 PyOS_snprintf(reason, sizeof(reason),
3333 "OS/2 TCP/IP Error# %d", sock_errno());
3334 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003335
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003336 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003337#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003338 /* No need to initialise sockets with GCC/EMX */
3339 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003340#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003341}
3342
3343#endif /* PYOS_OS2 */
3344
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003345
3346#ifndef OS_INIT_DEFINED
3347static int
3348os_init(void)
3349{
3350 return 1; /* Success */
3351}
3352#endif
3353
3354
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003355/* C API table - always add new things to the end for binary
3356 compatibility. */
3357static
3358PySocketModule_APIObject PySocketModuleAPI =
3359{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003360 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003361};
3362
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003363
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003364/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003365
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003366 This module is actually called "_socket", and there's a wrapper
3367 "socket.py" which implements some additional functionality. On some
3368 platforms (e.g. Windows and OS/2), socket.py also implements a
3369 wrapper for the socket type that provides missing functionality such
3370 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3371 with an ImportError exception if os-specific initialization fails.
3372 On Windows, this does WINSOCK initialization. When WINSOCK is
3373 initialized succesfully, a call to WSACleanup() is scheduled to be
3374 made at exit time.
3375*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003376
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003377PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003378"Implementation module for socket operations.\n\
3379\n\
3380See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003381
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003382PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003383init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003384{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003385 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003386
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003387 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003388 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003389
3390 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003391 m = Py_InitModule3(PySocket_MODULE_NAME,
3392 socket_methods,
3393 socket_doc);
3394
3395 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3396 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003397 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003398 Py_INCREF(socket_error);
3399 PyModule_AddObject(m, "error", socket_error);
3400 socket_herror = PyErr_NewException("socket.herror",
3401 socket_error, NULL);
3402 if (socket_herror == NULL)
3403 return;
3404 Py_INCREF(socket_herror);
3405 PyModule_AddObject(m, "herror", socket_herror);
3406 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003407 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003408 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003409 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003410 Py_INCREF(socket_gaierror);
3411 PyModule_AddObject(m, "gaierror", socket_gaierror);
3412 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003413 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003414 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003415 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003416 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003417 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003418 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003419 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003420
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003421#ifdef ENABLE_IPV6
3422 has_ipv6 = Py_True;
3423#else
3424 has_ipv6 = Py_False;
3425#endif
3426 Py_INCREF(has_ipv6);
3427 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3428
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003429 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003430 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003431 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3432 ) != 0)
3433 return;
3434
Guido van Rossum09be4091999-08-09 14:40:40 +00003435 /* Address families (we only support AF_INET and AF_UNIX) */
3436#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003437 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003438#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003439 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003440#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003441 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003442#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003443#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003444 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003445#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003446#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003447 /* Amateur Radio AX.25 */
3448 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003449#endif
3450#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003451 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003452#endif
3453#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003454 /* Appletalk DDP */
3455 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003456#endif
3457#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003458 /* Amateur radio NetROM */
3459 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003460#endif
3461#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003462 /* Multiprotocol bridge */
3463 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003464#endif
3465#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003466 /* Reserved for Werner's ATM */
3467 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003468#endif
3469#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003470 /* Reserved for X.25 project */
3471 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003472#endif
3473#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003474 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003475#endif
3476#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003477 /* Amateur Radio X.25 PLP */
3478 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003479#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003480#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003481 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3482 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3483 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3484 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3485 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3486 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3487 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3488 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3489 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003490#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003491
3492 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003493 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3494 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003495#ifndef __BEOS__
3496/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003497 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3498 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003499#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003500 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003501#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003502#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003503
3504#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003505 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003506#endif
3507#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003508 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003509#endif
3510#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003511 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003512#endif
3513#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003514 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003515#endif
3516#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003517 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003518#endif
3519#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003520 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003521#endif
3522#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003523 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003524#endif
3525#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003526 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003527#endif
3528#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003529 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003530#endif
3531#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003532 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003533#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003534#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003535 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003536#endif
3537#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003538 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003539#endif
3540#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003541 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003542#endif
3543#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003544 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003545#endif
3546#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003547 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003548#endif
3549#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003550 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003551#endif
3552#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003553 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003554#endif
3555#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003556 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003557#endif
3558
3559 /* Maximum number of connections for "listen" */
3560#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003561 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003562#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003563 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003564#endif
3565
3566 /* Flags for send, recv */
3567#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003568 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003569#endif
3570#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003571 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003572#endif
3573#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003574 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003575#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003576#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003577 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003578#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003579#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003580 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003581#endif
3582#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003583 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003584#endif
3585#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003586 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003587#endif
3588#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003589 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003590#endif
3591#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003592 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003593#endif
3594#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003595 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003596#endif
3597
3598 /* Protocol level and numbers, usable for [gs]etsockopt */
3599#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003600 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003601#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003602#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003603 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003604#else
Fred Drake4baedc12002-04-01 14:53:37 +00003605 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003606#endif
3607#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003608 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003609#endif
3610#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003611 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003612#endif
3613#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003614 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003615#endif
3616#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003617 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003618#endif
3619#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003620 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003621#endif
3622#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003623 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003624#else
Fred Drake4baedc12002-04-01 14:53:37 +00003625 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003626#endif
3627#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003628 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003629#else
Fred Drake4baedc12002-04-01 14:53:37 +00003630 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003631#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003632#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003633 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003634#else
Fred Drake4baedc12002-04-01 14:53:37 +00003635 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003636#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003637#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003638 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003639#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003640#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003641 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003642#else
Fred Drake4baedc12002-04-01 14:53:37 +00003643 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003644#endif
3645#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003646 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003647#endif
3648#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003649 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003650#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003651#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003652 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003653#endif
3654#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003655 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003656#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003657#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003658 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003659#else
Fred Drake4baedc12002-04-01 14:53:37 +00003660 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003661#endif
3662#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003663 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003664#endif
3665#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003666 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003667#endif
3668#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003669 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003670#else
Fred Drake4baedc12002-04-01 14:53:37 +00003671 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003672#endif
3673#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003674 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003675#endif
3676#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003677 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003678#endif
3679#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003680 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003681#endif
3682#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003683 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003684#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003685#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003686 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003687#endif
3688#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003689 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003690#endif
3691#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003692 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003693#endif
3694#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003695 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003696#endif
3697#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003698 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003699#endif
3700#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003701 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003702#endif
3703#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003704 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003705#endif
3706#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003707 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003708#endif
3709#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003710 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003711#endif
3712#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003713 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003714#endif
3715#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003716 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003717#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003718#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003719 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003720#endif
3721#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003722 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003723#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003724#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003725 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003726#endif
3727#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003728 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003729#endif
3730#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003731 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003732#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003733#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003734 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003735#endif
3736/**/
3737#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003738 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003739#else
Fred Drake4baedc12002-04-01 14:53:37 +00003740 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003741#endif
3742#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003743 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003744#endif
3745
3746 /* Some port configuration */
3747#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003748 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003749#else
Fred Drake4baedc12002-04-01 14:53:37 +00003750 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003751#endif
3752#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003753 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003754#else
Fred Drake4baedc12002-04-01 14:53:37 +00003755 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003756#endif
3757
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003758 /* Some reserved IP v.4 addresses */
3759#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003760 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003761#else
Fred Drake4baedc12002-04-01 14:53:37 +00003762 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003763#endif
3764#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003765 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003766#else
Fred Drake4baedc12002-04-01 14:53:37 +00003767 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003768#endif
3769#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003770 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003771#else
Fred Drake4baedc12002-04-01 14:53:37 +00003772 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003773#endif
3774#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003775 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003776#else
Fred Drake4baedc12002-04-01 14:53:37 +00003777 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003778#endif
3779#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003780 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3781 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003782#else
Fred Drake4baedc12002-04-01 14:53:37 +00003783 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003784#endif
3785#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003786 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3787 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003788#else
Fred Drake4baedc12002-04-01 14:53:37 +00003789 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003790#endif
3791#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003792 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003793#else
Fred Drake4baedc12002-04-01 14:53:37 +00003794 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003795#endif
3796
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003797 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003798#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003799 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003800#endif
3801#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003802 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003803#endif
3804#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003805 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003806#endif
3807#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003808 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003809#endif
3810#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003811 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003812#endif
3813#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003814 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003815#endif
3816#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003817 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003818#endif
3819#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003820 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003821#endif
3822#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003823 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003824#endif
3825#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003826 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003827#endif
3828#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003829 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003830#endif
3831#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003832 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003833#endif
3834#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003835 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003836#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003837#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003838 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3839 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003840#endif
3841#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003842 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3843 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003844#endif
3845#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003846 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003847#endif
3848
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003849 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3850#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003851 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003852#endif
3853#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003854 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003855#endif
3856#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003857 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003858#endif
3859#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003860 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003861#endif
3862#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003863 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003864#endif
3865#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003866 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003867#endif
3868
Guido van Rossum09be4091999-08-09 14:40:40 +00003869 /* TCP options */
3870#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003871 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003872#endif
3873#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003874 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003875#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003876#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003877 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003878#endif
3879#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003880 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003881#endif
3882#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003883 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003884#endif
3885#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003886 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003887#endif
3888#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003889 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003890#endif
3891#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003892 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003893#endif
3894#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003895 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003896#endif
3897#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003898 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003899#endif
3900#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003901 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003902#endif
3903#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003904 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003905#endif
3906
Guido van Rossum09be4091999-08-09 14:40:40 +00003907
3908 /* IPX options */
3909#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003910 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003911#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003912
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003913 /* get{addr,name}info parameters */
3914#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003915 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003916#endif
3917#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003918 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003919#endif
3920#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003921 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003922#endif
3923#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003924 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003925#endif
3926#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003927 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003928#endif
3929#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003930 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003931#endif
3932#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003933 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003934#endif
3935#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003936 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003937#endif
3938#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003939 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003940#endif
3941#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003942 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003943#endif
3944#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003945 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003946#endif
3947#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003948 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003949#endif
3950#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003951 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003952#endif
3953#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003954 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003955#endif
3956#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003957 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003958#endif
3959#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003960 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003961#endif
3962#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003963 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003964#endif
3965#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003966 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003967#endif
3968#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003969 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003970#endif
3971#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003972 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003973#endif
3974#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003975 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003976#endif
3977#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003978 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003979#endif
3980#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003981 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003982#endif
3983#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003984 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003985#endif
3986#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003987 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003988#endif
3989#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003990 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003991#endif
3992#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003993 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003994#endif
3995#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003996 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003997#endif
3998#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003999 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004000#endif
4001#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004002 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004003#endif
4004
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004005 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004006#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4007 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004008#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004009}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004010
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004011
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004012#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004013
4014/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004015/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004016
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004017int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004018inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004019{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004020 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004021 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004022 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004023 if (packed_addr == INADDR_NONE)
4024 return 0;
4025 memcpy(dst, &packed_addr, 4);
4026 return 1;
4027 }
4028 /* Should set errno to EAFNOSUPPORT */
4029 return -1;
4030}
4031
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004032const char *
4033inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004034{
4035 if (af == AF_INET) {
4036 struct in_addr packed_addr;
4037 if (size < 16)
4038 /* Should set errno to ENOSPC. */
4039 return NULL;
4040 memcpy(&packed_addr, src, sizeof(packed_addr));
4041 return strncpy(dst, inet_ntoa(packed_addr), size);
4042 }
4043 /* Should set errno to EAFNOSUPPORT */
4044 return NULL;
4045}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004046
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004047#endif