blob: e7e3c478022ea58c02ad8ea7ed1c2cad153179f3 [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,
144 protect access with a lock. */
145#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \
146 defined(__NetBSD__)
147#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
224# include <sys/fcntl.h>
225# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000226int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000227# endif
228
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000229#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000230
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000231/* MS_WINDOWS includes */
232# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000233
Jeremy Hylton22308652001-02-02 03:23:09 +0000234#endif
235
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000236#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000237# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000238#endif
239
240#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000241# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000242#endif
243
Neal Norwitz39d22e52002-11-02 19:55:21 +0000244#ifndef O_NONBLOCK
245# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000246#endif
247
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000248#include "addrinfo.h"
249
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000250#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000251int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000252const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000253#endif
254
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000255#ifdef __APPLE__
256/* On OS X, getaddrinfo returns no error indication of lookup
257 failure, so we must use the emulation instead of the libinfo
258 implementation. Unfortunately, performing an autoconf test
259 for this bug would require DNS access for the machine performing
260 the configuration, which is not acceptable. Therefore, we
261 determine the bug just by checking for __APPLE__. If this bug
262 gets ever fixed, perhaps checking for sys/version.h would be
263 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000264#ifndef HAVE_GETNAMEINFO
265/* This bug seems to be fixed in Jaguar. Ths easiest way I could
266 Find to check for Jaguar is that it has getnameinfo(), which
267 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000268#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000269#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000270#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000271
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000272/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000273#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000274/* avoid clashes with the C library definition of the symbol. */
275#define getaddrinfo fake_getaddrinfo
276#define gai_strerror fake_gai_strerror
277#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000278#include "getaddrinfo.c"
279#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000280#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000281#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000282#include "getnameinfo.c"
283#endif
284
Guido van Rossumbcc20741998-08-04 22:53:56 +0000285#if defined(MS_WINDOWS) || defined(__BEOS__)
286/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000287/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000288#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000289#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000290#endif
291
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000292#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000293#define EAFNOSUPPORT WSAEAFNOSUPPORT
294#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000295#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000296
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000297#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000298#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000299#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000300#endif
301
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000302#ifndef SOCKETCLOSE
303#define SOCKETCLOSE close
304#endif
305
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000306#ifdef __VMS
307/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
308#define SEGMENT_SIZE 65535
309#endif
310
Martin v. Löwise9416172003-05-03 10:12:45 +0000311/*
312 * Constants for getnameinfo()
313 */
314#if !defined(NI_MAXHOST)
315#define NI_MAXHOST 1025
316#endif
317#if !defined(NI_MAXSERV)
318#define NI_MAXSERV 32
319#endif
320
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000321/* XXX There's a problem here: *static* functions are not supposed to have
322 a Py prefix (or use CapitalizedWords). Later... */
323
Guido van Rossum30a685f1991-06-27 15:51:29 +0000324/* Global variable holding the exception type for errors detected
325 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000326static PyObject *socket_error;
327static PyObject *socket_herror;
328static PyObject *socket_gaierror;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000329
Guido van Rossum48a680c2001-03-02 06:34:14 +0000330#ifdef RISCOS
331/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
332static int taskwindow;
333#endif
334
Tim Peters643a7fc2002-02-17 04:13:21 +0000335/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000336 The sock_type variable contains pointers to various functions,
337 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000338 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000339static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000340
Guido van Rossum30a685f1991-06-27 15:51:29 +0000341/* Convenience function to raise an error according to errno
342 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000343
Guido van Rossum73624e91994-10-10 17:59:00 +0000344static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000345set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000346{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000347#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000348 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000349 static struct {
350 int no;
351 const char *msg;
352 } *msgp, msgs[] = {
353 {WSAEINTR, "Interrupted system call"},
354 {WSAEBADF, "Bad file descriptor"},
355 {WSAEACCES, "Permission denied"},
356 {WSAEFAULT, "Bad address"},
357 {WSAEINVAL, "Invalid argument"},
358 {WSAEMFILE, "Too many open files"},
359 {WSAEWOULDBLOCK,
360 "The socket operation could not complete "
361 "without blocking"},
362 {WSAEINPROGRESS, "Operation now in progress"},
363 {WSAEALREADY, "Operation already in progress"},
364 {WSAENOTSOCK, "Socket operation on non-socket"},
365 {WSAEDESTADDRREQ, "Destination address required"},
366 {WSAEMSGSIZE, "Message too long"},
367 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
368 {WSAENOPROTOOPT, "Protocol not available"},
369 {WSAEPROTONOSUPPORT, "Protocol not supported"},
370 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
371 {WSAEOPNOTSUPP, "Operation not supported"},
372 {WSAEPFNOSUPPORT, "Protocol family not supported"},
373 {WSAEAFNOSUPPORT, "Address family not supported"},
374 {WSAEADDRINUSE, "Address already in use"},
375 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
376 {WSAENETDOWN, "Network is down"},
377 {WSAENETUNREACH, "Network is unreachable"},
378 {WSAENETRESET, "Network dropped connection on reset"},
379 {WSAECONNABORTED, "Software caused connection abort"},
380 {WSAECONNRESET, "Connection reset by peer"},
381 {WSAENOBUFS, "No buffer space available"},
382 {WSAEISCONN, "Socket is already connected"},
383 {WSAENOTCONN, "Socket is not connected"},
384 {WSAESHUTDOWN, "Can't send after socket shutdown"},
385 {WSAETOOMANYREFS, "Too many references: can't splice"},
386 {WSAETIMEDOUT, "Operation timed out"},
387 {WSAECONNREFUSED, "Connection refused"},
388 {WSAELOOP, "Too many levels of symbolic links"},
389 {WSAENAMETOOLONG, "File name too long"},
390 {WSAEHOSTDOWN, "Host is down"},
391 {WSAEHOSTUNREACH, "No route to host"},
392 {WSAENOTEMPTY, "Directory not empty"},
393 {WSAEPROCLIM, "Too many processes"},
394 {WSAEUSERS, "Too many users"},
395 {WSAEDQUOT, "Disc quota exceeded"},
396 {WSAESTALE, "Stale NFS file handle"},
397 {WSAEREMOTE, "Too many levels of remote in path"},
398 {WSASYSNOTREADY, "Network subsystem is unvailable"},
399 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
400 {WSANOTINITIALISED,
401 "Successful WSAStartup() not yet performed"},
402 {WSAEDISCON, "Graceful shutdown in progress"},
403 /* Resolver errors */
404 {WSAHOST_NOT_FOUND, "No such host is known"},
405 {WSATRY_AGAIN, "Host not found, or server failed"},
406 {WSANO_RECOVERY, "Unexpected server error encountered"},
407 {WSANO_DATA, "Valid name without requested data"},
408 {WSANO_ADDRESS, "No address, look for MX record"},
409 {0, NULL}
410 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000411 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000412 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000413 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000414
Mark Hammond46a733d2000-07-24 01:45:11 +0000415 for (msgp = msgs; msgp->msg; msgp++) {
416 if (err_no == msgp->no) {
417 msg = msgp->msg;
418 break;
419 }
420 }
421
422 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000423 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000424 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000425 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000426 }
427 return NULL;
428 }
429 else
430#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000431
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000432#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000433 if (sock_errno() != NO_ERROR) {
434 APIRET rc;
435 ULONG msglen;
436 char outbuf[100];
437 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000438
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000439 /* Retrieve socket-related error message from MPTN.MSG file */
440 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
441 myerrorcode - SOCBASEERR + 26,
442 "mptn.msg",
443 &msglen);
444 if (rc == NO_ERROR) {
445 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000446
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000447 /* OS/2 doesn't guarantee a terminator */
448 outbuf[msglen] = '\0';
449 if (strlen(outbuf) > 0) {
450 /* If non-empty msg, trim CRLF */
451 char *lastc = &outbuf[ strlen(outbuf)-1 ];
452 while (lastc > outbuf && isspace(*lastc)) {
453 /* Trim trailing whitespace (CRLF) */
454 *lastc-- = '\0';
455 }
456 }
457 v = Py_BuildValue("(is)", myerrorcode, outbuf);
458 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000459 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000460 Py_DECREF(v);
461 }
462 return NULL;
463 }
464 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000465#endif
466
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000467 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000468}
469
Guido van Rossum30a685f1991-06-27 15:51:29 +0000470
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000471static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000472set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000473{
474 PyObject *v;
475
476#ifdef HAVE_HSTRERROR
477 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
478#else
479 v = Py_BuildValue("(is)", h_error, "host not found");
480#endif
481 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000482 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000483 Py_DECREF(v);
484 }
485
486 return NULL;
487}
488
489
490static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000491set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000492{
493 PyObject *v;
494
Martin v. Löwis272cb402002-03-01 08:31:07 +0000495#ifdef EAI_SYSTEM
496 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000497 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000498 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000499#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000500
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000501#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000502 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000503#else
504 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
505#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000506 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000507 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000508 Py_DECREF(v);
509 }
510
511 return NULL;
512}
513
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000514/* Function to perform the setting of socket blocking mode
515 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000516static int
517internal_setblocking(PySocketSockObject *s, int block)
518{
519#ifndef RISCOS
520#ifndef MS_WINDOWS
521 int delay_flag;
522#endif
523#endif
524
525 Py_BEGIN_ALLOW_THREADS
526#ifdef __BEOS__
527 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000528 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
529 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000530#else
531#ifndef RISCOS
532#ifndef MS_WINDOWS
533#if defined(PYOS_OS2) && !defined(PYCC_GCC)
534 block = !block;
535 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000536#elif defined(__VMS)
537 block = !block;
538 ioctl(s->sock_fd, FIONBIO, (char *)&block);
539#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000540 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
541 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000542 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000543 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000544 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000545 fcntl(s->sock_fd, F_SETFL, delay_flag);
546#endif /* !PYOS_OS2 */
547#else /* MS_WINDOWS */
548 block = !block;
549 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
550#endif /* MS_WINDOWS */
551#endif /* __BEOS__ */
552#endif /* RISCOS */
553 Py_END_ALLOW_THREADS
554
555 /* Since these don't return anything */
556 return 1;
557}
558
Guido van Rossum11ba0942002-06-13 15:07:44 +0000559/* Do a select() on the socket, if necessary (sock_timeout > 0).
560 The argument writing indicates the direction.
561 This does not raise an exception or return a success indicator;
562 we'll let the actual socket call do that. */
563static void
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000564internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000565{
566 fd_set fds;
567 struct timeval tv;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000568
Guido van Rossumad654902002-07-19 12:44:59 +0000569 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000570 if (s->sock_timeout <= 0.0)
571 return;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000572
Guido van Rossumad654902002-07-19 12:44:59 +0000573 /* Guard against closed socket */
574 if (s->sock_fd < 0)
575 return;
576
Guido van Rossum67f7a382002-06-06 21:08:16 +0000577 /* Construct the arguments to select */
578 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000579 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000580 FD_ZERO(&fds);
581 FD_SET(s->sock_fd, &fds);
582
583 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000584 if (writing)
Guido van Rossum11ba0942002-06-13 15:07:44 +0000585 select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000586 else
Guido van Rossum11ba0942002-06-13 15:07:44 +0000587 select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000588}
589
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000590/* Initialize a new socket object. */
591
Tim Petersa12b4cf2002-07-18 22:38:44 +0000592static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000593
Mark Hammond62b1ab12002-07-23 06:31:15 +0000594PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000595init_sockobject(PySocketSockObject *s,
596 SOCKET_T fd, int family, int type, int proto)
597{
598#ifdef RISCOS
599 int block = 1;
600#endif
601 s->sock_fd = fd;
602 s->sock_family = family;
603 s->sock_type = type;
604 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000605 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000606
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000607 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000608
609 if (defaulttimeout >= 0.0)
610 internal_setblocking(s, 0);
611
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000612#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000613 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000614 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000615#endif
616}
617
618
Guido van Rossum30a685f1991-06-27 15:51:29 +0000619/* Create a new socket object.
620 This just creates the object and initializes it.
621 If the creation fails, return NULL and set an exception (implicit
622 in NEWOBJ()). */
623
Guido van Rossum73624e91994-10-10 17:59:00 +0000624static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000625new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626{
Guido van Rossum73624e91994-10-10 17:59:00 +0000627 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000628 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000629 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000630 if (s != NULL)
631 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000632 return s;
633}
634
Guido van Rossum30a685f1991-06-27 15:51:29 +0000635
Guido van Rossum48a680c2001-03-02 06:34:14 +0000636/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000637 thread to be in gethostbyname or getaddrinfo */
638#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
639PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000640#endif
641
642
Guido van Rossum30a685f1991-06-27 15:51:29 +0000643/* Convert a string specifying a host name or one of a few symbolic
644 names to a numeric IP address. This usually calls gethostbyname()
645 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000646 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000647 an error occurred; then an exception is raised. */
648
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000649static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000650setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000651{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000652 struct addrinfo hints, *res;
653 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000654 int d1, d2, d3, d4;
655 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000656
Guido van Rossuma376cc51996-12-05 23:43:35 +0000657 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000658 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000659 int siz;
660 memset(&hints, 0, sizeof(hints));
661 hints.ai_family = af;
662 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
663 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000664 Py_BEGIN_ALLOW_THREADS
665 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000666 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000667 Py_END_ALLOW_THREADS
668 /* We assume that those thread-unsafe getaddrinfo() versions
669 *are* safe regarding their return value, ie. that a
670 subsequent call to getaddrinfo() does not destroy the
671 outcome of the first call. */
672 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000673 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000674 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000675 return -1;
676 }
677 switch (res->ai_family) {
678 case AF_INET:
679 siz = 4;
680 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000681#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000682 case AF_INET6:
683 siz = 16;
684 break;
685#endif
686 default:
687 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000688 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000689 "unsupported address family");
690 return -1;
691 }
692 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000693 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000694 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000695 "wildcard resolved to multiple address");
696 return -1;
697 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000698 if (res->ai_addrlen < addr_ret_size)
699 addr_ret_size = res->ai_addrlen;
700 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000701 freeaddrinfo(res);
702 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000704 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000705 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000706 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000707 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000708 "address family mismatched");
709 return -1;
710 }
711 sin = (struct sockaddr_in *)addr_ret;
712 memset((void *) sin, '\0', sizeof(*sin));
713 sin->sin_family = AF_INET;
714#ifdef HAVE_SOCKADDR_SA_LEN
715 sin->sin_len = sizeof(*sin);
716#endif
717 sin->sin_addr.s_addr = INADDR_BROADCAST;
718 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000719 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000720 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
721 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
722 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
723 struct sockaddr_in *sin;
724 sin = (struct sockaddr_in *)addr_ret;
725 sin->sin_addr.s_addr = htonl(
726 ((long) d1 << 24) | ((long) d2 << 16) |
727 ((long) d3 << 8) | ((long) d4 << 0));
728 sin->sin_family = AF_INET;
729#ifdef HAVE_SOCKADDR_SA_LEN
730 sin->sin_len = sizeof(*sin);
731#endif
732 return 4;
733 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000734 memset(&hints, 0, sizeof(hints));
735 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000736 Py_BEGIN_ALLOW_THREADS
737 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000738 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000739#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000740 if (error == EAI_NONAME && af == AF_UNSPEC) {
741 /* On Tru64 V5.1, numeric-to-addr conversion fails
742 if no address family is given. Assume IPv4 for now.*/
743 hints.ai_family = AF_INET;
744 error = getaddrinfo(name, NULL, &hints, &res);
745 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000746#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000747 Py_END_ALLOW_THREADS
748 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000749 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000750 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000751 return -1;
752 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000753 if (res->ai_addrlen < addr_ret_size)
754 addr_ret_size = res->ai_addrlen;
755 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000756 freeaddrinfo(res);
757 switch (addr_ret->sa_family) {
758 case AF_INET:
759 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000760#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000761 case AF_INET6:
762 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000763#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000764 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000765 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000766 return -1;
767 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000768}
769
Guido van Rossum30a685f1991-06-27 15:51:29 +0000770
Guido van Rossum30a685f1991-06-27 15:51:29 +0000771/* Create a string object representing an IP address.
772 This is always a string of the form 'dd.dd.dd.dd' (with variable
773 size numbers). */
774
Guido van Rossum73624e91994-10-10 17:59:00 +0000775static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000776makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000777{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000778 char buf[NI_MAXHOST];
779 int error;
780
781 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
782 NI_NUMERICHOST);
783 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000784 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000785 return NULL;
786 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000787 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788}
789
790
791/* Create an object representing the given socket address,
792 suitable for passing it back to bind(), connect() etc.
793 The family field of the sockaddr structure is inspected
794 to determine what kind of address it really is. */
795
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000797static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000798makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000799{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000800 if (addrlen == 0) {
801 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000802 Py_INCREF(Py_None);
803 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000804 }
805
Guido van Rossumbcc20741998-08-04 22:53:56 +0000806#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000807 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000808 addr->sa_family = AF_INET;
809#endif
810
Guido van Rossum30a685f1991-06-27 15:51:29 +0000811 switch (addr->sa_family) {
812
813 case AF_INET:
814 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000815 struct sockaddr_in *a;
816 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000817 PyObject *ret = NULL;
818 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000819 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000820 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
821 Py_DECREF(addrobj);
822 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000823 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000825
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000826#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000827 case AF_UNIX:
828 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000830 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000832#endif /* AF_UNIX */
833
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000834#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000835 case AF_INET6:
836 {
837 struct sockaddr_in6 *a;
838 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
839 PyObject *ret = NULL;
840 if (addrobj) {
841 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000842 ret = Py_BuildValue("Oiii",
843 addrobj,
844 ntohs(a->sin6_port),
845 a->sin6_flowinfo,
846 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000847 Py_DECREF(addrobj);
848 }
849 return ret;
850 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000851#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000852
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000853#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000854 case AF_PACKET:
855 {
856 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
857 char *ifname = "";
858 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000859 /* need to look up interface name give index */
860 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000861 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000862 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000863 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000864 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000865 return Py_BuildValue("shbhs#",
866 ifname,
867 ntohs(a->sll_protocol),
868 a->sll_pkttype,
869 a->sll_hatype,
870 a->sll_addr,
871 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000872 }
873#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000874
Guido van Rossum30a685f1991-06-27 15:51:29 +0000875 /* More cases here... */
876
877 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000878 /* If we don't know the address family, don't raise an
879 exception -- return it as a tuple. */
880 return Py_BuildValue("is#",
881 addr->sa_family,
882 addr->sa_data,
883 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000884
Guido van Rossum30a685f1991-06-27 15:51:29 +0000885 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000886}
887
Guido van Rossum30a685f1991-06-27 15:51:29 +0000888
889/* Parse a socket address argument according to the socket object's
890 address family. Return 1 if the address was in the proper format,
891 0 of not. The address is returned through addr_ret, its length
892 through len_ret. */
893
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000894static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000895getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000896 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000898 switch (s->sock_family) {
899
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000900#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000901 case AF_UNIX:
902 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000903 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000904 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000905 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000906 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000907 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000908 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000909 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000910 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000911 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000912 return 0;
913 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000914 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000915 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000916 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000917 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000918 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919 return 1;
920 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000921#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000922
Guido van Rossum30a685f1991-06-27 15:51:29 +0000923 case AF_INET:
924 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000925 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000926 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000927 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000928 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000929 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000930 PyErr_Format(
931 PyExc_TypeError,
932 "getsockaddrarg: "
933 "AF_INET address must be tuple, not %.500s",
934 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000935 return 0;
936 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000937 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
938 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000940 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000941 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000942 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000943 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000944 *addr_ret = (struct sockaddr *) addr;
945 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946 return 1;
947 }
948
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000949#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000950 case AF_INET6:
951 {
952 struct sockaddr_in6* addr;
953 char *host;
954 int port, flowinfo, scope_id;
955 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
956 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +0000957 if (!PyArg_ParseTuple(args, "eti|ii",
958 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000959 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000960 return 0;
961 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000962 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000963 return 0;
964 addr->sin6_family = s->sock_family;
965 addr->sin6_port = htons((short)port);
966 addr->sin6_flowinfo = flowinfo;
967 addr->sin6_scope_id = scope_id;
968 *addr_ret = (struct sockaddr *) addr;
969 *len_ret = sizeof *addr;
970 return 1;
971 }
972#endif
973
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000974#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000975 case AF_PACKET:
976 {
977 struct sockaddr_ll* addr;
978 struct ifreq ifr;
979 char *interfaceName;
980 int protoNumber;
981 int hatype = 0;
982 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000983 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000984
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000985 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
986 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000987 return 0;
988 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
989 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000990 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000991 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000992 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000993 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000994 addr = &(s->sock_addr.ll);
995 addr->sll_family = AF_PACKET;
996 addr->sll_protocol = htons((short)protoNumber);
997 addr->sll_ifindex = ifr.ifr_ifindex;
998 addr->sll_pkttype = pkttype;
999 addr->sll_hatype = hatype;
1000 *addr_ret = (struct sockaddr *) addr;
1001 *len_ret = sizeof *addr;
1002 return 1;
1003 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001004#endif
1005
Guido van Rossum30a685f1991-06-27 15:51:29 +00001006 /* More cases here... */
1007
1008 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001009 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001010 return 0;
1011
1012 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013}
1014
Guido van Rossum30a685f1991-06-27 15:51:29 +00001015
Guido van Rossum48a680c2001-03-02 06:34:14 +00001016/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001017 Return 1 if the family is known, 0 otherwise. The length is returned
1018 through len_ret. */
1019
1020static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001021getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001022{
1023 switch (s->sock_family) {
1024
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00001025#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001026 case AF_UNIX:
1027 {
1028 *len_ret = sizeof (struct sockaddr_un);
1029 return 1;
1030 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001031#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001032
1033 case AF_INET:
1034 {
1035 *len_ret = sizeof (struct sockaddr_in);
1036 return 1;
1037 }
1038
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001039#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001040 case AF_INET6:
1041 {
1042 *len_ret = sizeof (struct sockaddr_in6);
1043 return 1;
1044 }
1045#endif
1046
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001047#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001048 case AF_PACKET:
1049 {
1050 *len_ret = sizeof (struct sockaddr_ll);
1051 return 1;
1052 }
1053#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001054
Guido van Rossum710e1df1992-06-12 10:39:36 +00001055 /* More cases here... */
1056
1057 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001058 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001059 return 0;
1060
1061 }
1062}
1063
1064
Guido van Rossum30a685f1991-06-27 15:51:29 +00001065/* s.accept() method */
1066
Guido van Rossum73624e91994-10-10 17:59:00 +00001067static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001068sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001069{
1070 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001071 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001072 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001073 PyObject *sock = NULL;
1074 PyObject *addr = NULL;
1075 PyObject *res = NULL;
1076
Guido van Rossum710e1df1992-06-12 10:39:36 +00001077 if (!getsockaddrlen(s, &addrlen))
1078 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001079 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001080
Guido van Rossum73624e91994-10-10 17:59:00 +00001081 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001082 internal_select(s, 0);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001083 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001084 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001085
Fred Drakea04eaad2000-06-30 02:46:07 +00001086#ifdef MS_WINDOWS
1087 if (newfd == INVALID_SOCKET)
1088#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001089 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001090#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001091 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001092
Guido van Rossum30a685f1991-06-27 15:51:29 +00001093 /* Create the new object with unspecified family,
1094 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001095 sock = (PyObject *) new_sockobject(newfd,
1096 s->sock_family,
1097 s->sock_type,
1098 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001099
Barry Warsaw752300b1997-01-03 17:18:10 +00001100 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001101 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001102 goto finally;
1103 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001104 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001105 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001106 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001107 goto finally;
1108
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001109 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001110
Guido van Rossum67f7a382002-06-06 21:08:16 +00001111finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001112 Py_XDECREF(sock);
1113 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001114 return res;
1115}
1116
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001117PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001118"accept() -> (socket object, address info)\n\
1119\n\
1120Wait for an incoming connection. Return a new socket representing the\n\
1121connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001122info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001123
Guido van Rossum11ba0942002-06-13 15:07:44 +00001124/* s.setblocking(flag) method. Argument:
1125 False -- non-blocking mode; same as settimeout(0)
1126 True -- blocking mode; same as settimeout(None)
1127*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001128
Guido van Rossum73624e91994-10-10 17:59:00 +00001129static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001130sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001131{
1132 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001133
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001134 block = PyInt_AsLong(arg);
1135 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001136 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001137
Guido van Rossum11ba0942002-06-13 15:07:44 +00001138 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001139 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001140
Guido van Rossum73624e91994-10-10 17:59:00 +00001141 Py_INCREF(Py_None);
1142 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001143}
Guido van Rossume4485b01994-09-07 14:32:49 +00001144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001145PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001146"setblocking(flag)\n\
1147\n\
1148Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001149setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001150setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001151
Guido van Rossum11ba0942002-06-13 15:07:44 +00001152/* s.settimeout(timeout) method. Argument:
1153 None -- no timeout, blocking mode; same as setblocking(True)
1154 0.0 -- non-blocking mode; same as setblocking(False)
1155 > 0 -- timeout mode; operations time out after timeout seconds
1156 < 0 -- illegal; raises an exception
1157*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001158static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001159sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001160{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001161 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001162
1163 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001164 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001165 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001166 timeout = PyFloat_AsDouble(arg);
1167 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001168 if (!PyErr_Occurred())
1169 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001170 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001171 return NULL;
1172 }
1173 }
1174
Guido van Rossum11ba0942002-06-13 15:07:44 +00001175 s->sock_timeout = timeout;
1176 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001177
1178 Py_INCREF(Py_None);
1179 return Py_None;
1180}
1181
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001182PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001183"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001184\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001185Set a timeout on socket operations. 'timeout' can be a float,\n\
1186giving in seconds, or None. Setting a timeout of None disables\n\
1187the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001188Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001189
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001190/* s.gettimeout() method.
1191 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001192static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001193sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001194{
1195 if (s->sock_timeout < 0.0) {
1196 Py_INCREF(Py_None);
1197 return Py_None;
1198 }
1199 else
1200 return PyFloat_FromDouble(s->sock_timeout);
1201}
1202
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001203PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001204"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001205\n\
1206Returns the timeout in floating seconds associated with socket \n\
1207operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001208operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001209
Guido van Rossum48a680c2001-03-02 06:34:14 +00001210#ifdef RISCOS
1211/* s.sleeptaskw(1 | 0) method */
1212
1213static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001214sock_sleeptaskw(PySocketSockObject *s,PyObject *args)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001215{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001216 int block;
1217 int delay_flag;
1218 if (!PyArg_Parse(args, "i", &block))
1219 return NULL;
1220 Py_BEGIN_ALLOW_THREADS
1221 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1222 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001223
Guido van Rossum67f7a382002-06-06 21:08:16 +00001224 Py_INCREF(Py_None);
1225 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001226}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001227PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001228"sleeptaskw(flag)\n\
1229\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001230Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001231#endif
1232
1233
Guido van Rossumaee08791992-09-08 09:05:33 +00001234/* s.setsockopt() method.
1235 With an integer third argument, sets an integer option.
1236 With a string third argument, sets an option from a buffer;
1237 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001238
Guido van Rossum73624e91994-10-10 17:59:00 +00001239static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001240sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001241{
1242 int level;
1243 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001244 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001245 char *buf;
1246 int buflen;
1247 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001248
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001249 if (PyArg_ParseTuple(args, "iii:setsockopt",
1250 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001251 buf = (char *) &flag;
1252 buflen = sizeof flag;
1253 }
1254 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001255 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001256 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1257 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001258 return NULL;
1259 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001260 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001261 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001262 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001263 Py_INCREF(Py_None);
1264 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001265}
1266
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001267PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001268"setsockopt(level, option, value)\n\
1269\n\
1270Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001271The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001272
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001273
Guido van Rossumaee08791992-09-08 09:05:33 +00001274/* s.getsockopt() method.
1275 With two arguments, retrieves an integer option.
1276 With a third integer argument, retrieves a string buffer of that size;
1277 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001278
Guido van Rossum73624e91994-10-10 17:59:00 +00001279static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001280sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001281{
1282 int level;
1283 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001284 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001285 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001286 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001287
Guido van Rossumbcc20741998-08-04 22:53:56 +00001288#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001289 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001290 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001291 return NULL;
1292#else
1293
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001294 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1295 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001296 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001297
Guido van Rossumbe32c891996-06-20 16:25:29 +00001298 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001299 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001300 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001301 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001302 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001303 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001304 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001305 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001306 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001307#ifdef __VMS
1308 if (buflen > 1024) {
1309#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001310 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001311#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001312 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001313 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001314 return NULL;
1315 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001316 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001317 if (buf == NULL)
1318 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001319 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001320 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001321 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001323 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001324 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001325 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001326 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001327#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001328}
1329
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001330PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001331"getsockopt(level, option[, buffersize]) -> value\n\
1332\n\
1333Get a socket option. See the Unix manual for level and option.\n\
1334If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001335string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001336
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001337
Fred Drake728819a2000-07-01 03:40:12 +00001338/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001339
Guido van Rossum73624e91994-10-10 17:59:00 +00001340static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001341sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001342{
1343 struct sockaddr *addr;
1344 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001345 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001346
Fred Drake728819a2000-07-01 03:40:12 +00001347 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001348 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001349 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001350 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001351 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001352 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001353 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001354 Py_INCREF(Py_None);
1355 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001356}
1357
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001358PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001359"bind(address)\n\
1360\n\
1361Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001362pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001363sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001364
Guido van Rossum30a685f1991-06-27 15:51:29 +00001365
1366/* s.close() method.
1367 Set the file descriptor to -1 so operations tried subsequently
1368 will surely fail. */
1369
Guido van Rossum73624e91994-10-10 17:59:00 +00001370static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001371sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001372{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001373 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001374
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001375 if ((fd = s->sock_fd) != -1) {
1376 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001377 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001378 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001379 Py_END_ALLOW_THREADS
1380 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001381 Py_INCREF(Py_None);
1382 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001383}
1384
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001385PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001386"close()\n\
1387\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001388Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001389
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001390static int
1391internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
1392{
1393 int res;
1394
1395 res = connect(s->sock_fd, addr, addrlen);
1396
1397#ifdef MS_WINDOWS
1398
1399 if (s->sock_timeout > 0.0) {
1400 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001401 /* This is a mess. Best solution: trust select */
1402 fd_set fds;
1403 struct timeval tv;
1404 tv.tv_sec = (int)s->sock_timeout;
1405 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1406 FD_ZERO(&fds);
1407 FD_SET(s->sock_fd, &fds);
1408 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1409 if (res == 0)
1410 res = WSAEWOULDBLOCK;
1411 else if (res > 0)
1412 res = 0;
1413 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001414 }
1415 }
1416
1417 if (res < 0)
1418 res = WSAGetLastError();
1419
1420#else
1421
1422 if (s->sock_timeout > 0.0) {
1423 if (res < 0 && errno == EINPROGRESS) {
1424 internal_select(s, 1);
1425 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001426 if (res < 0 && errno == EISCONN)
1427 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001428 }
1429 }
1430
1431 if (res < 0)
1432 res = errno;
1433
1434#endif
1435
1436 return res;
1437}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001438
Fred Drake728819a2000-07-01 03:40:12 +00001439/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001440
Guido van Rossum73624e91994-10-10 17:59:00 +00001441static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001442sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001443{
1444 struct sockaddr *addr;
1445 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001446 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001447
Fred Drake728819a2000-07-01 03:40:12 +00001448 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001449 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001450
Guido van Rossum73624e91994-10-10 17:59:00 +00001451 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001452 res = internal_connect(s, addr, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001453 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001454
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001455 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001456 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001457 Py_INCREF(Py_None);
1458 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001459}
1460
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001461PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001462"connect(address)\n\
1463\n\
1464Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001465is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001466
Guido van Rossum30a685f1991-06-27 15:51:29 +00001467
Fred Drake728819a2000-07-01 03:40:12 +00001468/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001469
1470static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001471sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001472{
1473 struct sockaddr *addr;
1474 int addrlen;
1475 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001476
Fred Drake728819a2000-07-01 03:40:12 +00001477 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001478 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001479
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001480 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001481 res = internal_connect(s, addr, addrlen);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001482 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001483
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001484 return PyInt_FromLong((long) res);
1485}
1486
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001487PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001488"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001489\n\
1490This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001491instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001492
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001493
Guido van Rossumed233a51992-06-23 09:07:03 +00001494/* s.fileno() method */
1495
Guido van Rossum73624e91994-10-10 17:59:00 +00001496static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001497sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001498{
Fred Drakea04eaad2000-06-30 02:46:07 +00001499#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001500 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001501#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001502 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001503#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001504}
1505
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001506PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001507"fileno() -> integer\n\
1508\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001509Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001510
Guido van Rossumed233a51992-06-23 09:07:03 +00001511
Guido van Rossumbe32c891996-06-20 16:25:29 +00001512#ifndef NO_DUP
1513/* s.dup() method */
1514
1515static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001516sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001517{
Fred Drakea04eaad2000-06-30 02:46:07 +00001518 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001519 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001520
Guido van Rossumbe32c891996-06-20 16:25:29 +00001521 newfd = dup(s->sock_fd);
1522 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001523 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001524 sock = (PyObject *) new_sockobject(newfd,
1525 s->sock_family,
1526 s->sock_type,
1527 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001528 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001529 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001530 return sock;
1531}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001533PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001534"dup() -> socket object\n\
1535\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001536Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001537
Guido van Rossumbe32c891996-06-20 16:25:29 +00001538#endif
1539
1540
Guido van Rossumc89705d1992-11-26 08:54:07 +00001541/* s.getsockname() method */
1542
Guido van Rossum73624e91994-10-10 17:59:00 +00001543static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001544sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001545{
1546 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001547 int res;
1548 socklen_t addrlen;
1549
Guido van Rossumc89705d1992-11-26 08:54:07 +00001550 if (!getsockaddrlen(s, &addrlen))
1551 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001552 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001553 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001554 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001555 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001556 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001557 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001558 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001559}
1560
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001561PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001562"getsockname() -> address info\n\
1563\n\
1564Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001565info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001566
Guido van Rossumc89705d1992-11-26 08:54:07 +00001567
Guido van Rossumb6775db1994-08-01 11:34:53 +00001568#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001569/* s.getpeername() method */
1570
Guido van Rossum73624e91994-10-10 17:59:00 +00001571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001572sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001573{
1574 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001575 int res;
1576 socklen_t addrlen;
1577
Guido van Rossumc89705d1992-11-26 08:54:07 +00001578 if (!getsockaddrlen(s, &addrlen))
1579 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001580 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001581 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001582 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001583 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001584 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001585 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001586 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001587}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001588
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001589PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001590"getpeername() -> address info\n\
1591\n\
1592Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001593info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001594
Guido van Rossumb6775db1994-08-01 11:34:53 +00001595#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001596
1597
Guido van Rossum30a685f1991-06-27 15:51:29 +00001598/* s.listen(n) method */
1599
Guido van Rossum73624e91994-10-10 17:59:00 +00001600static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001601sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001602{
1603 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001604 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001605
1606 backlog = PyInt_AsLong(arg);
1607 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001608 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001609 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001610 if (backlog < 1)
1611 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001612 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001613 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001614 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001615 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001616 Py_INCREF(Py_None);
1617 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001618}
1619
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001620PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001621"listen(backlog)\n\
1622\n\
1623Enable a server to accept connections. The backlog argument must be at\n\
1624least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001625will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001626
1627
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001628#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001629/* s.makefile(mode) method.
1630 Create a new open file object referring to a dupped version of
1631 the socket's file descriptor. (The dup() call is necessary so
1632 that the open file and socket objects may be closed independent
1633 of each other.)
1634 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1635
Guido van Rossum73624e91994-10-10 17:59:00 +00001636static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001637sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001638{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001639 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001640 char *mode = "r";
1641 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001642#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001643 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001644#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001645 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001646#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001647 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001648 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001649#ifdef __VMS
1650 char *mode_r = "r";
1651 char *mode_w = "w";
1652#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001653
Guido van Rossum43713e52000-02-29 13:59:29 +00001654 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001655 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001656#ifdef __VMS
1657 if (strcmp(mode,"rb") == 0) {
1658 mode = mode_r;
1659 }
1660 else {
1661 if (strcmp(mode,"wb") == 0) {
1662 mode = mode_w;
1663 }
1664 }
1665#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001666#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001667 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1668 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001669#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001670 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001671#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001672 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001673 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001674 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001675 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001676 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001677#ifdef USE_GUSI2
1678 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001679 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001680 bufsize = 0;
1681#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001682 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1683 if (f != NULL)
1684 PyFile_SetBufSize(f, bufsize);
1685 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001686}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001687
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001688PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001689"makefile([mode[, buffersize]]) -> file object\n\
1690\n\
1691Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001692The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001693
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001694#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001695
Guido van Rossum48a680c2001-03-02 06:34:14 +00001696
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001697/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001698
Guido van Rossum73624e91994-10-10 17:59:00 +00001699static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001700sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001701{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001702 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001703 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001704#ifdef __VMS
1705 int read_length;
1706 char *read_buf;
1707#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001708
Guido van Rossum43713e52000-02-29 13:59:29 +00001709 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001710 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001711
1712 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001713 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001714 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001715 return NULL;
1716 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001717
Guido van Rossum73624e91994-10-10 17:59:00 +00001718 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001719 if (buf == NULL)
1720 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001721
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001722#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001723 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001724 internal_select(s, 0);
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001725 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001726 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001727
Guido van Rossum7c53b771995-09-13 18:39:47 +00001728 if (n < 0) {
1729 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001730 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001731 }
Tim Peters5de98422002-04-27 18:44:32 +00001732 if (n != len)
1733 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001734#else
1735 read_buf = PyString_AsString(buf);
1736 read_length = len;
1737 while (read_length != 0) {
1738 unsigned int segment;
1739
1740 segment = read_length /SEGMENT_SIZE;
1741 if (segment != 0) {
1742 segment = SEGMENT_SIZE;
1743 }
1744 else {
1745 segment = read_length;
1746 }
1747
1748 Py_BEGIN_ALLOW_THREADS
1749 internal_select(s, 0);
1750 n = recv(s->sock_fd, read_buf, segment, flags);
1751 Py_END_ALLOW_THREADS
1752
1753 if (n < 0) {
1754 Py_DECREF(buf);
1755 return s->errorhandler();
1756 }
1757 if (n != read_length) {
1758 read_buf += n;
1759 break;
1760 }
1761
1762 read_length -= segment;
1763 read_buf += segment;
1764 }
1765 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1766 {
1767 return NULL;
1768 }
1769#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001770 return buf;
1771}
1772
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001773PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001774"recv(buffersize[, flags]) -> data\n\
1775\n\
1776Receive up to buffersize bytes from the socket. For the optional flags\n\
1777argument, see the Unix manual. When no data is available, block until\n\
1778at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001779the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001780
Guido van Rossum30a685f1991-06-27 15:51:29 +00001781
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001782/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001783
Guido van Rossum73624e91994-10-10 17:59:00 +00001784static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001785sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001786{
1787 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001788 PyObject *buf = NULL;
1789 PyObject *addr = NULL;
1790 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001791 int len, n, flags = 0;
1792 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001793
Guido van Rossum43713e52000-02-29 13:59:29 +00001794 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001795 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001796
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001797 if (!getsockaddrlen(s, &addrlen))
1798 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001799 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001800 if (buf == NULL)
1801 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001802
Guido van Rossum73624e91994-10-10 17:59:00 +00001803 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001804 memset(addrbuf, 0, addrlen);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001805 internal_select(s, 0);
Fred Drakefd168342001-05-09 19:11:33 +00001806 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001807#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001808#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001809 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001810#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001811 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001812#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001813#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001814 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001815#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001816 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001817 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001818
Guido van Rossum7c53b771995-09-13 18:39:47 +00001819 if (n < 0) {
1820 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001821 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001822 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001823
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001824 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001825 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001826
Guido van Rossum67f7a382002-06-06 21:08:16 +00001827 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001828 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001829 goto finally;
1830
Guido van Rossum73624e91994-10-10 17:59:00 +00001831 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001832
1833finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001834 Py_XDECREF(addr);
1835 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001836 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001837}
1838
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001839PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001840"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1841\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001842Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001843
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001844/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001845
Guido van Rossum73624e91994-10-10 17:59:00 +00001846static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001847sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001848{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001849 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001850 int len, n, flags = 0;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001851#ifdef __VMS
1852 int send_length;
1853#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001854
Guido van Rossum43713e52000-02-29 13:59:29 +00001855 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001856 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001857
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001858#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001859 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001860 internal_select(s, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001861 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001862 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001863
Guido van Rossum30a685f1991-06-27 15:51:29 +00001864 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001865 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001866#else
1867 /* Divide packet into smaller segments for */
1868 /* TCP/IP Services for OpenVMS */
1869 send_length = len;
1870 while (send_length != 0) {
1871 unsigned int segment;
1872
1873 segment = send_length / SEGMENT_SIZE;
1874 if (segment != 0) {
1875 segment = SEGMENT_SIZE;
1876 }
1877 else {
1878 segment = send_length;
1879 }
1880 Py_BEGIN_ALLOW_THREADS
1881 internal_select(s, 1);
1882 n = send(s->sock_fd, buf, segment, flags);
1883 Py_END_ALLOW_THREADS
1884 if (n < 0) {
1885 return s->errorhandler();
1886 }
1887 send_length -= segment;
1888 buf += segment;
1889 } /* end while */
1890#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001891 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001892}
1893
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001894PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001895"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001896\n\
1897Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001898argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001899sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001900
1901
1902/* s.sendall(data [,flags]) method */
1903
1904static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001905sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001906{
1907 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001908 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001909
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001910 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1911 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001912
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001913 Py_BEGIN_ALLOW_THREADS
1914 do {
Guido van Rossum8f24cdc2003-01-31 18:15:58 +00001915 internal_select(s, 1);
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001916 n = send(s->sock_fd, buf, len, flags);
1917 if (n < 0)
1918 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001919 buf += n;
1920 len -= n;
1921 } while (len > 0);
1922 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001923
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001924 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001925 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001926
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001927 Py_INCREF(Py_None);
1928 return Py_None;
1929}
1930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001931PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001932"sendall(data[, flags])\n\
1933\n\
1934Send a data string to the socket. For the optional flags\n\
1935argument, see the Unix manual. This calls send() repeatedly\n\
1936until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001937to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001938
Guido van Rossum30a685f1991-06-27 15:51:29 +00001939
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001940/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001941
Guido van Rossum73624e91994-10-10 17:59:00 +00001942static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001943sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001944{
Guido van Rossum73624e91994-10-10 17:59:00 +00001945 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001946 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001947 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001948 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001949
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001950 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001951 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001952 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001953 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1954 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001955 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001956 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001957
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001958 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001959 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001960
Guido van Rossum73624e91994-10-10 17:59:00 +00001961 Py_BEGIN_ALLOW_THREADS
Guido van Rossum11ba0942002-06-13 15:07:44 +00001962 internal_select(s, 1);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001963 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001964 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001965
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001966 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001967 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001968 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001969}
1970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001971PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001972"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001973\n\
1974Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001975For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001976
Guido van Rossum30a685f1991-06-27 15:51:29 +00001977
1978/* s.shutdown(how) method */
1979
Guido van Rossum73624e91994-10-10 17:59:00 +00001980static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001981sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001982{
1983 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001984 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001985
1986 how = PyInt_AsLong(arg);
1987 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001988 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001989 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001990 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001991 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001992 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001993 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001994 Py_INCREF(Py_None);
1995 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001996}
1997
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001998PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001999"shutdown(flag)\n\
2000\n\
2001Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002002of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002003
Guido van Rossum30a685f1991-06-27 15:51:29 +00002004
2005/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002006
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002007static PyMethodDef sock_methods[] = {
2008 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002009 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002010 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002011 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002012 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002013 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002014 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002015 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002016 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002017 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002018#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002019 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002020 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002021#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002022 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002023 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002024#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002025 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002026 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002027#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002028 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002029 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002030 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002031 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002032 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002033 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002034#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002035 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002036 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002037#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002038 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002039 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002040 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002041 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002042 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002043 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002044 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002045 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002046 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002047 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002048 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002049 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002050 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002051 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002052 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002053 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002054 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002055 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002056 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002057 shutdown_doc},
2058#ifdef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002059 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002060 sleeptaskw_doc},
2061#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002062 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002063};
2064
Guido van Rossum30a685f1991-06-27 15:51:29 +00002065
Guido van Rossum73624e91994-10-10 17:59:00 +00002066/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002067 First close the file description. */
2068
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002069static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002070sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002071{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002072 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002073 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002074 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002075}
2076
Guido van Rossum30a685f1991-06-27 15:51:29 +00002077
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002078static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002079sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002080{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002081 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002082#if SIZEOF_SOCKET_T > SIZEOF_LONG
2083 if (s->sock_fd > LONG_MAX) {
2084 /* this can occur on Win64, and actually there is a special
2085 ugly printf formatter for decimal pointer length integer
2086 printing, only bother if necessary*/
2087 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002088 "no printf formatter to display "
2089 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002090 return NULL;
2091 }
2092#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002093 PyOS_snprintf(
2094 buf, sizeof(buf),
2095 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2096 (long)s->sock_fd, s->sock_family,
2097 s->sock_type,
2098 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002099 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002100}
2101
2102
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002103/* Create a new, uninitialized socket object. */
2104
2105static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002106sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002107{
2108 PyObject *new;
2109
2110 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002111 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002112 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002113 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002114 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002115 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002116 return new;
2117}
2118
2119
2120/* Initialize a new socket object. */
2121
2122/*ARGSUSED*/
2123static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002124sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002125{
2126 PySocketSockObject *s = (PySocketSockObject *)self;
2127 SOCKET_T fd;
2128 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2129 static char *keywords[] = {"family", "type", "proto", 0};
2130
2131 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2132 "|iii:socket", keywords,
2133 &family, &type, &proto))
2134 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002135
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002136 Py_BEGIN_ALLOW_THREADS
2137 fd = socket(family, type, proto);
2138 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002139
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002140#ifdef MS_WINDOWS
2141 if (fd == INVALID_SOCKET)
2142#else
2143 if (fd < 0)
2144#endif
2145 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002146 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002147 return -1;
2148 }
2149 init_sockobject(s, fd, family, type, proto);
2150 /* From now on, ignore SIGPIPE and let the error checking
2151 do the work. */
2152#ifdef SIGPIPE
2153 (void) signal(SIGPIPE, SIG_IGN);
2154#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002155
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002156 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002157
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002158}
2159
2160
Guido van Rossumb6775db1994-08-01 11:34:53 +00002161/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002162
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002163static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002164 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002165 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002166 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002167 sizeof(PySocketSockObject), /* tp_basicsize */
2168 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002169 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002170 0, /* tp_print */
2171 0, /* tp_getattr */
2172 0, /* tp_setattr */
2173 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002174 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002175 0, /* tp_as_number */
2176 0, /* tp_as_sequence */
2177 0, /* tp_as_mapping */
2178 0, /* tp_hash */
2179 0, /* tp_call */
2180 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002181 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002182 0, /* tp_setattro */
2183 0, /* tp_as_buffer */
2184 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002185 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002186 0, /* tp_traverse */
2187 0, /* tp_clear */
2188 0, /* tp_richcompare */
2189 0, /* tp_weaklistoffset */
2190 0, /* tp_iter */
2191 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002192 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002193 0, /* tp_members */
2194 0, /* tp_getset */
2195 0, /* tp_base */
2196 0, /* tp_dict */
2197 0, /* tp_descr_get */
2198 0, /* tp_descr_set */
2199 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002200 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002201 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002202 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002203 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002204};
2205
Guido van Rossum30a685f1991-06-27 15:51:29 +00002206
Guido van Rossum81194471991-07-27 21:42:02 +00002207/* Python interface to gethostname(). */
2208
2209/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002210static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002211socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002212{
2213 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002214 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002215 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002216 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002217 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002218 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002219 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002220 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002221 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002222 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002223 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002224}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002226PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002227"gethostname() -> string\n\
2228\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002229Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002230
Guido van Rossumff4949e1992-08-05 19:58:53 +00002231
Guido van Rossum30a685f1991-06-27 15:51:29 +00002232/* Python interface to gethostbyname(name). */
2233
2234/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002235static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002236socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002237{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002238 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002239#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002240 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002241#else
2242 struct sockaddr_in addrbuf;
2243#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002244
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002245 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002246 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002247 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002248 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002249 return makeipaddr((struct sockaddr *)&addrbuf,
2250 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002251}
2252
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002253PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002254"gethostbyname(host) -> address\n\
2255\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002256Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002257
2258
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002259/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2260
2261static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002262gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002263{
2264 char **pch;
2265 PyObject *rtn_tuple = (PyObject *)NULL;
2266 PyObject *name_list = (PyObject *)NULL;
2267 PyObject *addr_list = (PyObject *)NULL;
2268 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002269
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002270 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002271 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002272#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002273 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002274#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002275 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002276#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002277 return NULL;
2278 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002279
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002280 if (h->h_addrtype != af) {
2281#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002282 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002283 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002284 (char *)strerror(EAFNOSUPPORT));
2285#else
2286 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002287 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002288 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002289#endif
2290 return NULL;
2291 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002292
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002293 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002294
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002295 case AF_INET:
2296 if (alen < sizeof(struct sockaddr_in))
2297 return NULL;
2298 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002299
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002300#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002301 case AF_INET6:
2302 if (alen < sizeof(struct sockaddr_in6))
2303 return NULL;
2304 break;
2305#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002306
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002307 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002308
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002309 if ((name_list = PyList_New(0)) == NULL)
2310 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002311
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002312 if ((addr_list = PyList_New(0)) == NULL)
2313 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002314
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002315 for (pch = h->h_aliases; *pch != NULL; pch++) {
2316 int status;
2317 tmp = PyString_FromString(*pch);
2318 if (tmp == NULL)
2319 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002320
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002321 status = PyList_Append(name_list, tmp);
2322 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002323
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002324 if (status)
2325 goto err;
2326 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002327
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002328 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2329 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002330
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002331 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002332
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002333 case AF_INET:
2334 {
2335 struct sockaddr_in sin;
2336 memset(&sin, 0, sizeof(sin));
2337 sin.sin_family = af;
2338#ifdef HAVE_SOCKADDR_SA_LEN
2339 sin.sin_len = sizeof(sin);
2340#endif
2341 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2342 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002343
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002344 if (pch == h->h_addr_list && alen >= sizeof(sin))
2345 memcpy((char *) addr, &sin, sizeof(sin));
2346 break;
2347 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002348
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002349#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002350 case AF_INET6:
2351 {
2352 struct sockaddr_in6 sin6;
2353 memset(&sin6, 0, sizeof(sin6));
2354 sin6.sin6_family = af;
2355#ifdef HAVE_SOCKADDR_SA_LEN
2356 sin6.sin6_len = sizeof(sin6);
2357#endif
2358 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2359 tmp = makeipaddr((struct sockaddr *)&sin6,
2360 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002361
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002362 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2363 memcpy((char *) addr, &sin6, sizeof(sin6));
2364 break;
2365 }
2366#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002367
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002368 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002369 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002370 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002371 return NULL;
2372 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002373
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002374 if (tmp == NULL)
2375 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002376
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002377 status = PyList_Append(addr_list, tmp);
2378 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002379
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002380 if (status)
2381 goto err;
2382 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002383
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002384 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002385
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002386 err:
2387 Py_XDECREF(name_list);
2388 Py_XDECREF(addr_list);
2389 return rtn_tuple;
2390}
2391
2392
2393/* Python interface to gethostbyname_ex(name). */
2394
2395/*ARGSUSED*/
2396static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002397socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002398{
2399 char *name;
2400 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002401#ifdef ENABLE_IPV6
2402 struct sockaddr_storage addr;
2403#else
2404 struct sockaddr_in addr;
2405#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002406 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002407 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002408#ifdef HAVE_GETHOSTBYNAME_R
2409 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002410#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2411 struct hostent_data data;
2412#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002413 char buf[16384];
2414 int buf_len = (sizeof buf) - 1;
2415 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002416#endif
2417#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002418 int result;
2419#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002420#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002421
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002422 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002423 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002424 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002425 return NULL;
2426 Py_BEGIN_ALLOW_THREADS
2427#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002428#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002429 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2430 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002431#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002432 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002433#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002434 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002435 result = gethostbyname_r(name, &hp_allocated, &data);
2436 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002437#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002438#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002439#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002440 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002441#endif
2442 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002443#endif /* HAVE_GETHOSTBYNAME_R */
2444 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002445 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002446 addr.ss_family.
2447 Therefore, we cast the sockaddr_storage into sockaddr to
2448 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002449 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002450 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002451 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002452#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002453 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002454#endif
2455 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002456}
2457
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002458PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002459"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2460\n\
2461Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002462for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002463
2464
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002465/* Python interface to gethostbyaddr(IP). */
2466
2467/*ARGSUSED*/
2468static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002469socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002470{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002471#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002472 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002473#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002474 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002475#endif
2476 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002477 char *ip_num;
2478 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002479 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002480#ifdef HAVE_GETHOSTBYNAME_R
2481 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002482#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2483 struct hostent_data data;
2484#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002485 char buf[16384];
2486 int buf_len = (sizeof buf) - 1;
2487 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002488#endif
2489#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002490 int result;
2491#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002492#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002493 char *ap;
2494 int al;
2495 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002496
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002497 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002498 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002499 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002500 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002501 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002502 af = sa->sa_family;
2503 ap = NULL;
2504 al = 0;
2505 switch (af) {
2506 case AF_INET:
2507 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2508 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2509 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002510#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002511 case AF_INET6:
2512 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2513 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2514 break;
2515#endif
2516 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002517 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002518 return NULL;
2519 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002520 Py_BEGIN_ALLOW_THREADS
2521#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002522#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002523 result = gethostbyaddr_r(ap, al, af,
2524 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002525 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002526#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002527 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002528 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002529#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002530 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002531 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002532 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002533#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002534#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002535#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002536 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002537#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002538 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002539#endif /* HAVE_GETHOSTBYNAME_R */
2540 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002541 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002542#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002543 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002544#endif
2545 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002546}
2547
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002548PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002549"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2550\n\
2551Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002552for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002553
Guido van Rossum30a685f1991-06-27 15:51:29 +00002554
2555/* Python interface to getservbyname(name).
2556 This only returns the port number, since the other info is already
2557 known or not useful (like the list of aliases). */
2558
2559/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002560static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002561socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002562{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002563 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002564 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002565 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002566 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002567 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002568 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002569 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002570 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002571 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002572 return NULL;
2573 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002574 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002575}
2576
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002577PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002578"getservbyname(servicename, protocolname) -> integer\n\
2579\n\
2580Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002581The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002582
Guido van Rossum30a685f1991-06-27 15:51:29 +00002583
Guido van Rossum3901d851996-12-19 16:35:04 +00002584/* Python interface to getprotobyname(name).
2585 This only returns the protocol number, since the other info is
2586 already known or not useful (like the list of aliases). */
2587
2588/*ARGSUSED*/
2589static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002590socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002591{
2592 char *name;
2593 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002594#ifdef __BEOS__
2595/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002596 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002597 return NULL;
2598#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002599 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002600 return NULL;
2601 Py_BEGIN_ALLOW_THREADS
2602 sp = getprotobyname(name);
2603 Py_END_ALLOW_THREADS
2604 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002605 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002606 return NULL;
2607 }
2608 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002609#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002610}
2611
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002612PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002613"getprotobyname(name) -> integer\n\
2614\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002615Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002616
Guido van Rossum3901d851996-12-19 16:35:04 +00002617
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002618#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002619/* Create a socket object from a numeric file description.
2620 Useful e.g. if stdin is a socket.
2621 Additional arguments as for socket(). */
2622
2623/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002624static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002625socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002626{
Guido van Rossum73624e91994-10-10 17:59:00 +00002627 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002628 SOCKET_T fd;
2629 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002630 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2631 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002632 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002633 /* Dup the fd so it and the socket can be closed independently */
2634 fd = dup(fd);
2635 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002636 return set_error();
2637 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002638 /* From now on, ignore SIGPIPE and let the error checking
2639 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002640#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002641 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002642#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002643 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002644}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002645
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002646PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002647"fromfd(fd, family, type[, proto]) -> socket object\n\
2648\n\
2649Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002650The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002651
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002652#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002653
Guido van Rossum82a5c661998-07-07 20:45:43 +00002654
Guido van Rossum006bf911996-06-12 04:04:55 +00002655static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002656socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002657{
2658 int x1, x2;
2659
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002660 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002661 return NULL;
2662 }
2663 x2 = (int)ntohs((short)x1);
2664 return PyInt_FromLong(x2);
2665}
2666
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002667PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002668"ntohs(integer) -> integer\n\
2669\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002670Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002671
2672
Guido van Rossum006bf911996-06-12 04:04:55 +00002673static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002674socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002675{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002676 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002677
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002678 if (PyInt_Check(arg)) {
2679 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002680 if (x == (unsigned long) -1 && PyErr_Occurred())
2681 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002682 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002683 else if (PyLong_Check(arg)) {
2684 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002685 if (x == (unsigned long) -1 && PyErr_Occurred())
2686 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002687#if SIZEOF_LONG > 4
2688 {
2689 unsigned long y;
2690 /* only want the trailing 32 bits */
2691 y = x & 0xFFFFFFFFUL;
2692 if (y ^ x)
2693 return PyErr_Format(PyExc_OverflowError,
2694 "long int larger than 32 bits");
2695 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002696 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002697#endif
2698 }
2699 else
Tim Peters58141872002-08-06 22:25:02 +00002700 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002701 "expected int/long, %s found",
2702 arg->ob_type->tp_name);
2703 if (x == (unsigned long) -1 && PyErr_Occurred())
2704 return NULL;
2705 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002706}
2707
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002708PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002709"ntohl(integer) -> integer\n\
2710\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002711Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002712
2713
Guido van Rossum006bf911996-06-12 04:04:55 +00002714static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002715socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002716{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002717 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002718
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002719 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002720 return NULL;
2721 }
2722 x2 = (int)htons((short)x1);
2723 return PyInt_FromLong(x2);
2724}
2725
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002726PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002727"htons(integer) -> integer\n\
2728\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002729Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002730
2731
Guido van Rossum006bf911996-06-12 04:04:55 +00002732static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002733socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002734{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002735 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002736
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002737 if (PyInt_Check(arg)) {
2738 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002739 if (x == (unsigned long) -1 && PyErr_Occurred())
2740 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002741 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002742 else if (PyLong_Check(arg)) {
2743 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002744 if (x == (unsigned long) -1 && PyErr_Occurred())
2745 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002746#if SIZEOF_LONG > 4
2747 {
2748 unsigned long y;
2749 /* only want the trailing 32 bits */
2750 y = x & 0xFFFFFFFFUL;
2751 if (y ^ x)
2752 return PyErr_Format(PyExc_OverflowError,
2753 "long int larger than 32 bits");
2754 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002755 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002756#endif
2757 }
2758 else
Tim Peters58141872002-08-06 22:25:02 +00002759 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002760 "expected int/long, %s found",
2761 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002762 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002763}
2764
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002765PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002766"htonl(integer) -> integer\n\
2767\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002768Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002769
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002770/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002771
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002772PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002773"inet_aton(string) -> packed 32-bit IP representation\n\
2774\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002775Convert 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 +00002776binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002777
2778static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002779socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002780{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002781#ifndef INADDR_NONE
2782#define INADDR_NONE (-1)
2783#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002784#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002785 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002786#else
2787 /* Have to use inet_addr() instead */
2788 unsigned long packed_addr;
2789#endif
2790 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002791
Tim Peters1df9fdd2003-02-13 03:13:40 +00002792 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002793 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002794
Tim Peters1df9fdd2003-02-13 03:13:40 +00002795
2796#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002797 if (inet_aton(ip_addr, &buf))
2798 return PyString_FromStringAndSize((char *)(&buf),
2799 sizeof(buf));
2800
2801 PyErr_SetString(socket_error,
2802 "illegal IP address string passed to inet_aton");
2803 return NULL;
2804
Tim Peters1df9fdd2003-02-13 03:13:40 +00002805#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002806 /* XXX Problem here: inet_aton('255.255.255.255') raises
2807 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002808 packed_addr = inet_addr(ip_addr);
2809
2810 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002811 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002812 "illegal IP address string passed to inet_aton");
2813 return NULL;
2814 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002815 return PyString_FromStringAndSize((char *) &packed_addr,
2816 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002817#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002818}
2819
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002820PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002821"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002822\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002823Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002824
2825static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002826socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002827{
2828 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002829 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002830 struct in_addr packed_addr;
2831
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002832 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002833 return NULL;
2834 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002835
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002836 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002837 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002838 "packed IP wrong length for inet_ntoa");
2839 return NULL;
2840 }
2841
2842 memcpy(&packed_addr, packed_str, addr_len);
2843
2844 return PyString_FromString(inet_ntoa(packed_addr));
2845}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002846
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002847#ifdef HAVE_INET_PTON
2848
2849PyDoc_STRVAR(inet_pton_doc,
2850"inet_pton(af, ip) -> packed IP address string\n\
2851\n\
2852Convert an IP address from string format to a packed string suitable\n\
2853for use with low-level network functions.");
2854
2855static PyObject *
2856socket_inet_pton(PyObject *self, PyObject *args)
2857{
2858 int af;
2859 char* ip;
2860 int retval;
2861 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
2862
2863 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
2864 return NULL;
2865 }
2866
2867 retval = inet_pton(af, ip, packed);
2868 if (retval < 0) {
2869 PyErr_SetFromErrno(socket_error);
2870 return NULL;
2871 } else if (retval == 0) {
2872 PyErr_SetString(socket_error,
2873 "illegal IP address string passed to inet_pton");
2874 return NULL;
2875 } else if (af == AF_INET) {
2876 return PyString_FromStringAndSize(packed,
2877 sizeof(struct in_addr));
2878 } else if (af == AF_INET6) {
2879 return PyString_FromStringAndSize(packed,
2880 sizeof(struct in6_addr));
2881 } else {
2882 PyErr_SetString(socket_error, "unknown address family");
2883 return NULL;
2884 }
2885}
2886
2887PyDoc_STRVAR(inet_ntop_doc,
2888"inet_ntop(af, packed_ip) -> string formatted IP address\n\
2889\n\
2890Convert a packed IP address of the given family to string format.");
2891
2892static PyObject *
2893socket_inet_ntop(PyObject *self, PyObject *args)
2894{
2895 int af;
2896 char* packed;
2897 int len;
2898 const char* retval;
2899 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
2900
2901 /* Guarantee NUL-termination for PyString_FromString() below */
2902 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
2903
2904 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
2905 return NULL;
2906 }
2907
2908 if (af == AF_INET) {
2909 if (len != sizeof(struct in_addr)) {
2910 PyErr_SetString(PyExc_ValueError,
2911 "invalid length of packed IP address string");
2912 return NULL;
2913 }
2914 } else if (af == AF_INET6) {
2915 if (len != sizeof(struct in6_addr)) {
2916 PyErr_SetString(PyExc_ValueError,
2917 "invalid length of packed IP address string");
2918 return NULL;
2919 }
2920 } else {
2921 PyErr_Format(PyExc_ValueError,
2922 "unknown address family %d", af);
2923 return NULL;
2924 }
2925
2926 retval = inet_ntop(af, packed, ip, sizeof(ip));
2927 if (!retval) {
2928 PyErr_SetFromErrno(socket_error);
2929 return NULL;
2930 } else {
2931 return PyString_FromString(retval);
2932 }
2933
2934 /* NOTREACHED */
2935 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
2936 return NULL;
2937}
2938
2939#endif /* HAVE_INET_PTON */
2940
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002941/* Python interface to getaddrinfo(host, port). */
2942
2943/*ARGSUSED*/
2944static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002945socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002946{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002947 struct addrinfo hints, *res;
2948 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002949 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002950 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002951 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002952 char *hptr, *pptr;
2953 int family, socktype, protocol, flags;
2954 int error;
2955 PyObject *all = (PyObject *)NULL;
2956 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002957 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002958
2959 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002960 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00002961 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
2962 &hobj, &pobj, &family, &socktype,
2963 &protocol, &flags)) {
2964 return NULL;
2965 }
2966 if (hobj == Py_None) {
2967 hptr = NULL;
2968 } else if (PyUnicode_Check(hobj)) {
2969 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
2970 if (!idna)
2971 return NULL;
2972 hptr = PyString_AsString(idna);
2973 } else if (PyString_Check(hobj)) {
2974 hptr = PyString_AsString(hobj);
2975 } else {
2976 PyErr_SetString(PyExc_TypeError,
2977 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002978 return NULL;
2979 }
2980 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002981 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002982 pptr = pbuf;
2983 } else if (PyString_Check(pobj)) {
2984 pptr = PyString_AsString(pobj);
2985 } else if (pobj == Py_None) {
2986 pptr = (char *)NULL;
2987 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002988 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002989 return NULL;
2990 }
2991 memset(&hints, 0, sizeof(hints));
2992 hints.ai_family = family;
2993 hints.ai_socktype = socktype;
2994 hints.ai_protocol = protocol;
2995 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00002996 Py_BEGIN_ALLOW_THREADS
2997 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002998 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00002999 Py_END_ALLOW_THREADS
3000 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003001 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003002 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003003 return NULL;
3004 }
3005
3006 if ((all = PyList_New(0)) == NULL)
3007 goto err;
3008 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003009 PyObject *addr =
3010 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
3011 if (addr == NULL)
3012 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003013 single = Py_BuildValue("iiisO", res->ai_family,
3014 res->ai_socktype, res->ai_protocol,
3015 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003016 addr);
3017 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003018 if (single == NULL)
3019 goto err;
3020
3021 if (PyList_Append(all, single))
3022 goto err;
3023 Py_XDECREF(single);
3024 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003025 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003026 if (res0)
3027 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003028 return all;
3029 err:
3030 Py_XDECREF(single);
3031 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003032 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003033 if (res0)
3034 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003035 return (PyObject *)NULL;
3036}
3037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003038PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003039"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3040 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003041\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003042Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003043
3044/* Python interface to getnameinfo(sa, flags). */
3045
3046/*ARGSUSED*/
3047static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003048socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003049{
3050 PyObject *sa = (PyObject *)NULL;
3051 int flags;
3052 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003053 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003054 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3055 struct addrinfo hints, *res = NULL;
3056 int error;
3057 PyObject *ret = (PyObject *)NULL;
3058
3059 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003060 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003061 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003062 if (!PyArg_ParseTuple(sa, "si|ii",
3063 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003064 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003065 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003066 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003067 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003068 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003069 Py_BEGIN_ALLOW_THREADS
3070 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003071 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003072 Py_END_ALLOW_THREADS
3073 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003074 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003075 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003076 goto fail;
3077 }
3078 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003079 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003080 "sockaddr resolved to multiple addresses");
3081 goto fail;
3082 }
3083 switch (res->ai_family) {
3084 case AF_INET:
3085 {
3086 char *t1;
3087 int t2;
3088 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003089 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003090 "IPv4 sockaddr must be 2 tuple");
3091 goto fail;
3092 }
3093 break;
3094 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003095#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003096 case AF_INET6:
3097 {
3098 struct sockaddr_in6 *sin6;
3099 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3100 sin6->sin6_flowinfo = flowinfo;
3101 sin6->sin6_scope_id = scope_id;
3102 break;
3103 }
3104#endif
3105 }
3106 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3107 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3108 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003109 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003110 goto fail;
3111 }
3112 ret = Py_BuildValue("ss", hbuf, pbuf);
3113
3114fail:
3115 if (res)
3116 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003117 return ret;
3118}
3119
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003120PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003121"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003122\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003123Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003124
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003125
3126/* Python API to getting and setting the default timeout value. */
3127
3128static PyObject *
3129socket_getdefaulttimeout(PyObject *self)
3130{
3131 if (defaulttimeout < 0.0) {
3132 Py_INCREF(Py_None);
3133 return Py_None;
3134 }
3135 else
3136 return PyFloat_FromDouble(defaulttimeout);
3137}
3138
3139PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003140"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003141\n\
3142Returns the default timeout in floating seconds for new socket objects.\n\
3143A value of None indicates that new socket objects have no timeout.\n\
3144When the socket module is first imported, the default is None.");
3145
3146static PyObject *
3147socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3148{
3149 double timeout;
3150
3151 if (arg == Py_None)
3152 timeout = -1.0;
3153 else {
3154 timeout = PyFloat_AsDouble(arg);
3155 if (timeout < 0.0) {
3156 if (!PyErr_Occurred())
3157 PyErr_SetString(PyExc_ValueError,
3158 "Timeout value out of range");
3159 return NULL;
3160 }
3161 }
3162
3163 defaulttimeout = timeout;
3164
3165 Py_INCREF(Py_None);
3166 return Py_None;
3167}
3168
3169PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003170"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003171\n\
3172Set the default timeout in floating seconds for new socket objects.\n\
3173A value of None indicates that new socket objects have no timeout.\n\
3174When the socket module is first imported, the default is None.");
3175
3176
Guido van Rossum30a685f1991-06-27 15:51:29 +00003177/* List of functions exported by this module. */
3178
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003179static PyMethodDef socket_methods[] = {
3180 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003181 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003182 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003183 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003184 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003185 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003186 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003187 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003188 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003189 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003190 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003191 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003192#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003193 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003194 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003195#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003196 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003197 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003198 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003199 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003200 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003201 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003202 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003203 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003204 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003205 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003206 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003207 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003208#ifdef HAVE_INET_PTON
3209 {"inet_pton", socket_inet_pton,
3210 METH_VARARGS, inet_pton_doc},
3211 {"inet_ntop", socket_inet_ntop,
3212 METH_VARARGS, inet_ntop_doc},
3213#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003214 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003215 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003216 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003217 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003218 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003219 METH_NOARGS, getdefaulttimeout_doc},
3220 {"setdefaulttimeout", socket_setdefaulttimeout,
3221 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003222 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003223};
3224
Guido van Rossum30a685f1991-06-27 15:51:29 +00003225
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003226#ifdef RISCOS
3227#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003228
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003229static int
3230os_init(void)
3231{
3232 _kernel_swi_regs r;
3233
3234 r.r[0] = 0;
3235 _kernel_swi(0x43380, &r, &r);
3236 taskwindow = r.r[0];
3237
3238 return 0;
3239}
3240
3241#endif /* RISCOS */
3242
3243
3244#ifdef MS_WINDOWS
3245#define OS_INIT_DEFINED
3246
3247/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003248
3249static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003250os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003251{
3252 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003253}
3254
3255static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003256os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003257{
3258 WSADATA WSAData;
3259 int ret;
3260 char buf[100];
3261 ret = WSAStartup(0x0101, &WSAData);
3262 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003263 case 0: /* No error */
3264 atexit(os_cleanup);
3265 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003266 case WSASYSNOTREADY:
3267 PyErr_SetString(PyExc_ImportError,
3268 "WSAStartup failed: network not ready");
3269 break;
3270 case WSAVERNOTSUPPORTED:
3271 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003272 PyErr_SetString(
3273 PyExc_ImportError,
3274 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003275 break;
3276 default:
Tim Peters885d4572001-11-28 20:27:42 +00003277 PyOS_snprintf(buf, sizeof(buf),
3278 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003279 PyErr_SetString(PyExc_ImportError, buf);
3280 break;
3281 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003282 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003283}
3284
Guido van Rossum8d665e61996-06-26 18:22:49 +00003285#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003286
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003287
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003288#ifdef PYOS_OS2
3289#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003290
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003291/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003292
3293static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003294os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003295{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003296#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003297 char reason[64];
3298 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003299
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003300 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003301 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003302 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003303
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003304 PyOS_snprintf(reason, sizeof(reason),
3305 "OS/2 TCP/IP Error# %d", sock_errno());
3306 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003307
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003308 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003309#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003310 /* No need to initialise sockets with GCC/EMX */
3311 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003312#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003313}
3314
3315#endif /* PYOS_OS2 */
3316
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003317
3318#ifndef OS_INIT_DEFINED
3319static int
3320os_init(void)
3321{
3322 return 1; /* Success */
3323}
3324#endif
3325
3326
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003327/* C API table - always add new things to the end for binary
3328 compatibility. */
3329static
3330PySocketModule_APIObject PySocketModuleAPI =
3331{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003332 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003333};
3334
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003335
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003336/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003337
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003338 This module is actually called "_socket", and there's a wrapper
3339 "socket.py" which implements some additional functionality. On some
3340 platforms (e.g. Windows and OS/2), socket.py also implements a
3341 wrapper for the socket type that provides missing functionality such
3342 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3343 with an ImportError exception if os-specific initialization fails.
3344 On Windows, this does WINSOCK initialization. When WINSOCK is
3345 initialized succesfully, a call to WSACleanup() is scheduled to be
3346 made at exit time.
3347*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003348
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003349PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003350"Implementation module for socket operations.\n\
3351\n\
3352See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003353
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003354PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003355init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003356{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003357 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003358
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003359 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003360 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003361
3362 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003363 m = Py_InitModule3(PySocket_MODULE_NAME,
3364 socket_methods,
3365 socket_doc);
3366
3367 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3368 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003369 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003370 Py_INCREF(socket_error);
3371 PyModule_AddObject(m, "error", socket_error);
3372 socket_herror = PyErr_NewException("socket.herror",
3373 socket_error, NULL);
3374 if (socket_herror == NULL)
3375 return;
3376 Py_INCREF(socket_herror);
3377 PyModule_AddObject(m, "herror", socket_herror);
3378 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003379 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003380 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003381 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003382 Py_INCREF(socket_gaierror);
3383 PyModule_AddObject(m, "gaierror", socket_gaierror);
3384 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003385 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003386 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003387 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003388 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003389 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003390 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003391 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003392
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003393#ifdef ENABLE_IPV6
3394 has_ipv6 = Py_True;
3395#else
3396 has_ipv6 = Py_False;
3397#endif
3398 Py_INCREF(has_ipv6);
3399 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3400
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003401 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003402 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003403 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3404 ) != 0)
3405 return;
3406
Guido van Rossum09be4091999-08-09 14:40:40 +00003407 /* Address families (we only support AF_INET and AF_UNIX) */
3408#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003409 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003410#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003411 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003412#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003413 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003414#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003415#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003416 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003417#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003418#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003419 /* Amateur Radio AX.25 */
3420 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003421#endif
3422#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003424#endif
3425#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003426 /* Appletalk DDP */
3427 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003428#endif
3429#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003430 /* Amateur radio NetROM */
3431 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003432#endif
3433#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003434 /* Multiprotocol bridge */
3435 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003436#endif
3437#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003438 /* Reserved for Werner's ATM */
3439 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003440#endif
3441#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003442 /* Reserved for X.25 project */
3443 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003444#endif
3445#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003446 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003447#endif
3448#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003449 /* Amateur Radio X.25 PLP */
3450 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003451#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003452#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003453 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3454 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3455 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3456 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3457 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3458 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3459 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3460 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3461 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003462#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003463
3464 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003465 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3466 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003467#ifndef __BEOS__
3468/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003469 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3470 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003471#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003472 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003473#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003474#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003475
3476#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003477 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003478#endif
3479#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003480 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003481#endif
3482#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003483 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003484#endif
3485#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003486 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003487#endif
3488#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003489 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003490#endif
3491#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003492 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003493#endif
3494#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003495 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003496#endif
3497#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003498 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003499#endif
3500#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003501 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003502#endif
3503#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003504 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003505#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003506#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003507 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003508#endif
3509#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003510 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003511#endif
3512#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003513 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003514#endif
3515#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003516 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003517#endif
3518#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003519 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003520#endif
3521#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003522 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003523#endif
3524#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003525 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003526#endif
3527#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003528 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003529#endif
3530
3531 /* Maximum number of connections for "listen" */
3532#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003533 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003534#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003535 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003536#endif
3537
3538 /* Flags for send, recv */
3539#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003540 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003541#endif
3542#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003543 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003544#endif
3545#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003546 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003547#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003548#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003549 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003550#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003551#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003552 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003553#endif
3554#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003555 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003556#endif
3557#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003558 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003559#endif
3560#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003561 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003562#endif
3563#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003564 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003565#endif
3566#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003567 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003568#endif
3569
3570 /* Protocol level and numbers, usable for [gs]etsockopt */
3571#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003572 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003573#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003574#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003575 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003576#else
Fred Drake4baedc12002-04-01 14:53:37 +00003577 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003578#endif
3579#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003580 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003581#endif
3582#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003583 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003584#endif
3585#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003586 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003587#endif
3588#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003589 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003590#endif
3591#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003592 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003593#endif
3594#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003595 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003596#else
Fred Drake4baedc12002-04-01 14:53:37 +00003597 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003598#endif
3599#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003600 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003601#else
Fred Drake4baedc12002-04-01 14:53:37 +00003602 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003603#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003604#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003605 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003606#else
Fred Drake4baedc12002-04-01 14:53:37 +00003607 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003608#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003609#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003610 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003611#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003612#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003613 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003614#else
Fred Drake4baedc12002-04-01 14:53:37 +00003615 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003616#endif
3617#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003618 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003619#endif
3620#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003621 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003622#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003623#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003624 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003625#endif
3626#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003627 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003628#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003629#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003630 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003631#else
Fred Drake4baedc12002-04-01 14:53:37 +00003632 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003633#endif
3634#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003635 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003636#endif
3637#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003638 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003639#endif
3640#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003641 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003642#else
Fred Drake4baedc12002-04-01 14:53:37 +00003643 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003644#endif
3645#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003646 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003647#endif
3648#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003649 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003650#endif
3651#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003652 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003653#endif
3654#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003655 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003656#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003657#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003658 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003659#endif
3660#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003661 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003662#endif
3663#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003664 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003665#endif
3666#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003667 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003668#endif
3669#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003670 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003671#endif
3672#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003673 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003674#endif
3675#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003676 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003677#endif
3678#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003679 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003680#endif
3681#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003682 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003683#endif
3684#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003685 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003686#endif
3687#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003688 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003689#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003690#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003691 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003692#endif
3693#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003694 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003695#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003696#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003697 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003698#endif
3699#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003700 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003701#endif
3702#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003703 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003704#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003705#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003706 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003707#endif
3708/**/
3709#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003710 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003711#else
Fred Drake4baedc12002-04-01 14:53:37 +00003712 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003713#endif
3714#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003715 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003716#endif
3717
3718 /* Some port configuration */
3719#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003720 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003721#else
Fred Drake4baedc12002-04-01 14:53:37 +00003722 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003723#endif
3724#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003725 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003726#else
Fred Drake4baedc12002-04-01 14:53:37 +00003727 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003728#endif
3729
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003730 /* Some reserved IP v.4 addresses */
3731#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003732 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003733#else
Fred Drake4baedc12002-04-01 14:53:37 +00003734 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003735#endif
3736#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003737 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003738#else
Fred Drake4baedc12002-04-01 14:53:37 +00003739 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003740#endif
3741#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003742 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003743#else
Fred Drake4baedc12002-04-01 14:53:37 +00003744 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003745#endif
3746#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003747 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003748#else
Fred Drake4baedc12002-04-01 14:53:37 +00003749 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003750#endif
3751#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003752 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3753 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003754#else
Fred Drake4baedc12002-04-01 14:53:37 +00003755 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003756#endif
3757#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003758 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3759 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003760#else
Fred Drake4baedc12002-04-01 14:53:37 +00003761 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003762#endif
3763#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003764 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003765#else
Fred Drake4baedc12002-04-01 14:53:37 +00003766 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003767#endif
3768
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003769 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003770#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003771 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003772#endif
3773#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003774 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003775#endif
3776#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003777 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003778#endif
3779#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003780 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003781#endif
3782#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003783 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003784#endif
3785#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003786 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003787#endif
3788#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003789 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003790#endif
3791#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003792 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003793#endif
3794#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003795 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003796#endif
3797#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003798 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003799#endif
3800#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003801 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003802#endif
3803#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003804 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003805#endif
3806#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003807 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003808#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003809#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003810 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3811 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003812#endif
3813#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003814 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3815 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003816#endif
3817#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003818 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003819#endif
3820
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003821 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3822#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003823 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003824#endif
3825#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003826 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003827#endif
3828#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003829 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003830#endif
3831#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003832 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003833#endif
3834#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003835 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003836#endif
3837#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003838 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003839#endif
3840
Guido van Rossum09be4091999-08-09 14:40:40 +00003841 /* TCP options */
3842#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003843 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003844#endif
3845#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003846 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003847#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003848#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003849 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003850#endif
3851#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003852 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003853#endif
3854#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003855 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003856#endif
3857#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003858 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003859#endif
3860#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003861 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003862#endif
3863#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003864 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003865#endif
3866#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003867 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003868#endif
3869#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003870 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003871#endif
3872#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003873 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003874#endif
3875#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003876 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003877#endif
3878
Guido van Rossum09be4091999-08-09 14:40:40 +00003879
3880 /* IPX options */
3881#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003882 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003883#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003884
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003885 /* get{addr,name}info parameters */
3886#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003887 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003888#endif
3889#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003890 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003891#endif
3892#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003893 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003894#endif
3895#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003896 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003897#endif
3898#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003899 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003900#endif
3901#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003902 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003903#endif
3904#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003905 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003906#endif
3907#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003908 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003909#endif
3910#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003911 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003912#endif
3913#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003914 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003915#endif
3916#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003917 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003918#endif
3919#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003920 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003921#endif
3922#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003923 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003924#endif
3925#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003926 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003927#endif
3928#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003929 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003930#endif
3931#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003932 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003933#endif
3934#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003935 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003936#endif
3937#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003938 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003939#endif
3940#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003941 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003942#endif
3943#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003944 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003945#endif
3946#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003947 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003948#endif
3949#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003950 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003951#endif
3952#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003953 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003954#endif
3955#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003956 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003957#endif
3958#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003959 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003960#endif
3961#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003962 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003963#endif
3964#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003965 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003966#endif
3967#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003968 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003969#endif
3970#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003971 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003972#endif
3973#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003974 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003975#endif
3976
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003977 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003978#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
3979 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003980#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003981}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003982
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003983
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003984#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003985
3986/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003987/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003988
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003989int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003990inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003991{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003992 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003993 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003994 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003995 if (packed_addr == INADDR_NONE)
3996 return 0;
3997 memcpy(dst, &packed_addr, 4);
3998 return 1;
3999 }
4000 /* Should set errno to EAFNOSUPPORT */
4001 return -1;
4002}
4003
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004004const char *
4005inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004006{
4007 if (af == AF_INET) {
4008 struct in_addr packed_addr;
4009 if (size < 16)
4010 /* Should set errno to ENOSPC. */
4011 return NULL;
4012 memcpy(&packed_addr, src, sizeof(packed_addr));
4013 return strncpy(dst, inet_ntoa(packed_addr), size);
4014 }
4015 /* Should set errno to EAFNOSUPPORT */
4016 return NULL;
4017}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004018
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004019#endif