blob: c21d5997796b042c4b53d81b577c3d501962b414 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Jeremy Hylton22308652001-02-02 03:23:09 +000010 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000011- No read/write operations (use sendall/recv or makefile instead).
12- Additional restrictions apply on some non-Unix platforms (compensated
13 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossum27e177d1995-03-16 15:43:47 +000017- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000018- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
19 a subclass of socket.error
20- socket.herror: exception raised for gethostby* errors,
21 a subclass of socket.error
Guido van Rossum83a072d2002-09-03 19:10:18 +000022- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
23 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000024- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000025- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000027- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000028- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum83a072d2002-09-03 19:10:18 +000029- socket.socket([family[, type [, proto]]]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000030- socket.ntohs(16 bit value) --> new int object
31- socket.ntohl(32 bit value) --> new int object
32- socket.htons(16 bit value) --> new int object
33- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000034- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
35 --> List of (family, socktype, proto, canonname, sockaddr)
36- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000037- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000038- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000039- socket.inet_aton(IP address) -> 32-bit packed IP representation
40- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000041- socket.getdefaulttimeout() -> None | float
42- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000043- an Internet socket address is a pair (hostname, port)
44 where hostname can be anything recognized by gethostbyname()
45 (including the dd.dd.dd.dd notation) and port is in host byte order
46- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000047- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000048- an AF_PACKET socket address is a tuple containing a string
49 specifying the ethernet interface and an integer specifying
50 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000051 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
52 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000053 networking code, but accepted since they are returned by the
54 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000055
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000056Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000058- names starting with sock_ are socket object methods
59- names starting with socket_ are module-level functions
60- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000061
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062*/
63
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000064#include "Python.h"
65
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000066#undef MAX
67#define MAX(x, y) ((x) < (y) ? (y) : (x))
68
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000069/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000070PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000071"socket([family[, type[, proto]]]) -> socket object\n\
72\n\
73Open a socket of the given type. The family argument specifies the\n\
74address family; it defaults to AF_INET. The type argument specifies\n\
75whether this is a stream (SOCK_STREAM, this is the default)\n\
76or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
77specifying the default protocol. Keyword arguments are accepted.\n\
78\n\
79A socket object represents one endpoint of a network connection.\n\
80\n\
81Methods of socket objects (keyword arguments not allowed):\n\
82\n\
83accept() -- accept a connection, returning new socket and client address\n\
84bind(addr) -- bind the socket to a local address\n\
85close() -- close the socket\n\
86connect(addr) -- connect the socket to a remote address\n\
87connect_ex(addr) -- connect, return an error code instead of an exception\n\
88dup() -- return a new socket object identical to the current one [*]\n\
89fileno() -- return underlying file descriptor\n\
90getpeername() -- return remote address [*]\n\
91getsockname() -- return local address\n\
92getsockopt(level, optname[, buflen]) -- get socket options\n\
93gettimeout() -- return timeout or None\n\
94listen(n) -- start listening for incoming connections\n\
95makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
96recv(buflen[, flags]) -- receive data\n\
97recvfrom(buflen[, flags]) -- receive data and sender's address\n\
98sendall(data[, flags]) -- send all data\n\
99send(data[, flags]) -- send data, may not send all of it\n\
100sendto(data[, flags], addr) -- send data to a given address\n\
101setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
102setsockopt(level, optname, value) -- set socket options\n\
103settimeout(None | float) -- set or clear the timeout\n\
104shutdown(how) -- shut down traffic in one or both directions\n\
105\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000106 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000107
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000108/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
109 I hope some day someone can clean this up please... */
110
Guido van Rossum9376b741999-09-15 22:01:40 +0000111/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
112 script doesn't get this right, so we hardcode some platform checks below.
113 On the other hand, not all Linux versions agree, so there the settings
114 computed by the configure script are needed! */
115
116#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000117# undef HAVE_GETHOSTBYNAME_R_3_ARG
118# undef HAVE_GETHOSTBYNAME_R_5_ARG
119# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000120#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000121
Guido van Rossum7a122991999-04-13 04:07:32 +0000122#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000123# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000124#endif
125
Guido van Rossume7de2061999-03-24 17:24:33 +0000126#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000127# if defined(_AIX) || defined(__osf__)
128# define HAVE_GETHOSTBYNAME_R_3_ARG
129# elif defined(__sun) || defined(__sgi)
130# define HAVE_GETHOSTBYNAME_R_5_ARG
131# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000132/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000133# else
134# undef HAVE_GETHOSTBYNAME_R
135# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000136#endif
137
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000138#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
139 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000140# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000141#endif
142
Just van Rossum1040d2c2003-05-09 07:53:18 +0000143/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000144 (this includes the getaddrinfo emulation) protect access with a lock. */
Just van Rossum16e426b2003-05-09 08:12:00 +0000145#if defined(WITH_THREAD) && (defined(__APPLE__) || defined(__FreeBSD__) || \
146 defined(__OpenBSD__) || defined(__NetBSD__) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000147#define USE_GETADDRINFO_LOCK
148#endif
149
150#ifdef USE_GETADDRINFO_LOCK
151#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
152#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
153#else
154#define ACQUIRE_GETADDRINFO_LOCK
155#define RELEASE_GETADDRINFO_LOCK
156#endif
157
158#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000160#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000161
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000162#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163# include <types.h>
164# include <io.h>
165# include <sys/ioctl.h>
166# include <utils.h>
167# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000168#endif
169
Martin v. Löwis9e437302002-12-06 12:57:26 +0000170#if defined(__VMS)
171#if ! defined(_SOCKADDR_LEN)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000172# ifdef getaddrinfo
173# undef getaddrinfo
174# endif
175# include "TCPIP_IOCTL_ROUTINE"
176#else
177# include <ioctl.h>
178#endif
Martin v. Löwis9e437302002-12-06 12:57:26 +0000179#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000180
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000181#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000182# define INCL_DOS
183# define INCL_DOSERRORS
184# define INCL_NOPMAPI
185# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000186#endif
187
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000188#if defined(__sgi)&&_COMPILER_VERSION>700 && !_SGIAPI
189/* make sure that the reentrant (gethostbyaddr_r etc)
190 functions are declared correctly if compiling with
191 MIPSPro 7.x in ANSI C mode (default) */
192#define _SGIAPI 1
193#include "netdb.h"
194#endif
195
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000196/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000197#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000198#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000199
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000200/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000201#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000202#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000203
204/* Addressing includes */
205
Guido van Rossum6f489d91996-06-28 20:15:15 +0000206#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000207
208/* Non-MS WINDOWS includes */
209# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000210
Guido van Rossum9376b741999-09-15 22:01:40 +0000211/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000212# ifdef __BEOS__
213# include <net/netdb.h>
214# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
215# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000216typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000217# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000218# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000219# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000220
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000221# ifndef RISCOS
222# include <fcntl.h>
223# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000224# include <sys/ioctl.h>
225# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000227int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000228# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000229# endif
230
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000231#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000232
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000233/* MS_WINDOWS includes */
234# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000235
Jeremy Hylton22308652001-02-02 03:23:09 +0000236#endif
237
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000238#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000240#endif
241
242#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000243# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000244#endif
245
Neal Norwitz39d22e52002-11-02 19:55:21 +0000246#ifndef O_NONBLOCK
247# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000248#endif
249
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000250#include "addrinfo.h"
251
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000252#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000253int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000254const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000255#endif
256
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000257#ifdef __APPLE__
258/* On OS X, getaddrinfo returns no error indication of lookup
259 failure, so we must use the emulation instead of the libinfo
260 implementation. Unfortunately, performing an autoconf test
261 for this bug would require DNS access for the machine performing
262 the configuration, which is not acceptable. Therefore, we
263 determine the bug just by checking for __APPLE__. If this bug
264 gets ever fixed, perhaps checking for sys/version.h would be
265 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000266#ifndef HAVE_GETNAMEINFO
267/* This bug seems to be fixed in Jaguar. Ths easiest way I could
268 Find to check for Jaguar is that it has getnameinfo(), which
269 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000270#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000271#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000272#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000273
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000274/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000275#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000276/* avoid clashes with the C library definition of the symbol. */
277#define getaddrinfo fake_getaddrinfo
278#define gai_strerror fake_gai_strerror
279#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000280#include "getaddrinfo.c"
281#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000282#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000283#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000284#include "getnameinfo.c"
285#endif
286
Guido van Rossumbcc20741998-08-04 22:53:56 +0000287#if defined(MS_WINDOWS) || defined(__BEOS__)
288/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000289/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000290#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000291#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000292#endif
293
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000294#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000295#define EAFNOSUPPORT WSAEAFNOSUPPORT
296#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000297#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000298
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000299#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000300#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000301#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000302#endif
303
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000304#ifndef SOCKETCLOSE
305#define SOCKETCLOSE close
306#endif
307
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000308#ifdef __VMS
309/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
310#define SEGMENT_SIZE 65535
311#endif
312
Martin v. Löwise9416172003-05-03 10:12:45 +0000313/*
314 * Constants for getnameinfo()
315 */
316#if !defined(NI_MAXHOST)
317#define NI_MAXHOST 1025
318#endif
319#if !defined(NI_MAXSERV)
320#define NI_MAXSERV 32
321#endif
322
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000323/* XXX There's a problem here: *static* functions are not supposed to have
324 a Py prefix (or use CapitalizedWords). Later... */
325
Guido van Rossum30a685f1991-06-27 15:51:29 +0000326/* Global variable holding the exception type for errors detected
327 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000328static PyObject *socket_error;
329static PyObject *socket_herror;
330static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000331static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000332
Guido van Rossum48a680c2001-03-02 06:34:14 +0000333#ifdef RISCOS
334/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
335static int taskwindow;
336#endif
337
Tim Peters643a7fc2002-02-17 04:13:21 +0000338/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000339 The sock_type variable contains pointers to various functions,
340 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000341 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000342static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000343
Guido van Rossum30a685f1991-06-27 15:51:29 +0000344/* Convenience function to raise an error according to errno
345 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000346
Guido van Rossum73624e91994-10-10 17:59:00 +0000347static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000348set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000350#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000351 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000352 static struct {
353 int no;
354 const char *msg;
355 } *msgp, msgs[] = {
356 {WSAEINTR, "Interrupted system call"},
357 {WSAEBADF, "Bad file descriptor"},
358 {WSAEACCES, "Permission denied"},
359 {WSAEFAULT, "Bad address"},
360 {WSAEINVAL, "Invalid argument"},
361 {WSAEMFILE, "Too many open files"},
362 {WSAEWOULDBLOCK,
363 "The socket operation could not complete "
364 "without blocking"},
365 {WSAEINPROGRESS, "Operation now in progress"},
366 {WSAEALREADY, "Operation already in progress"},
367 {WSAENOTSOCK, "Socket operation on non-socket"},
368 {WSAEDESTADDRREQ, "Destination address required"},
369 {WSAEMSGSIZE, "Message too long"},
370 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
371 {WSAENOPROTOOPT, "Protocol not available"},
372 {WSAEPROTONOSUPPORT, "Protocol not supported"},
373 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
374 {WSAEOPNOTSUPP, "Operation not supported"},
375 {WSAEPFNOSUPPORT, "Protocol family not supported"},
376 {WSAEAFNOSUPPORT, "Address family not supported"},
377 {WSAEADDRINUSE, "Address already in use"},
378 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
379 {WSAENETDOWN, "Network is down"},
380 {WSAENETUNREACH, "Network is unreachable"},
381 {WSAENETRESET, "Network dropped connection on reset"},
382 {WSAECONNABORTED, "Software caused connection abort"},
383 {WSAECONNRESET, "Connection reset by peer"},
384 {WSAENOBUFS, "No buffer space available"},
385 {WSAEISCONN, "Socket is already connected"},
386 {WSAENOTCONN, "Socket is not connected"},
387 {WSAESHUTDOWN, "Can't send after socket shutdown"},
388 {WSAETOOMANYREFS, "Too many references: can't splice"},
389 {WSAETIMEDOUT, "Operation timed out"},
390 {WSAECONNREFUSED, "Connection refused"},
391 {WSAELOOP, "Too many levels of symbolic links"},
392 {WSAENAMETOOLONG, "File name too long"},
393 {WSAEHOSTDOWN, "Host is down"},
394 {WSAEHOSTUNREACH, "No route to host"},
395 {WSAENOTEMPTY, "Directory not empty"},
396 {WSAEPROCLIM, "Too many processes"},
397 {WSAEUSERS, "Too many users"},
398 {WSAEDQUOT, "Disc quota exceeded"},
399 {WSAESTALE, "Stale NFS file handle"},
400 {WSAEREMOTE, "Too many levels of remote in path"},
401 {WSASYSNOTREADY, "Network subsystem is unvailable"},
402 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
403 {WSANOTINITIALISED,
404 "Successful WSAStartup() not yet performed"},
405 {WSAEDISCON, "Graceful shutdown in progress"},
406 /* Resolver errors */
407 {WSAHOST_NOT_FOUND, "No such host is known"},
408 {WSATRY_AGAIN, "Host not found, or server failed"},
409 {WSANO_RECOVERY, "Unexpected server error encountered"},
410 {WSANO_DATA, "Valid name without requested data"},
411 {WSANO_ADDRESS, "No address, look for MX record"},
412 {0, NULL}
413 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000414 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000415 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000416 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000417
Mark Hammond46a733d2000-07-24 01:45:11 +0000418 for (msgp = msgs; msgp->msg; msgp++) {
419 if (err_no == msgp->no) {
420 msg = msgp->msg;
421 break;
422 }
423 }
424
425 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000426 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000427 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000428 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000429 }
430 return NULL;
431 }
432 else
433#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000434
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000435#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000436 if (sock_errno() != NO_ERROR) {
437 APIRET rc;
438 ULONG msglen;
439 char outbuf[100];
440 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000441
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000442 /* Retrieve socket-related error message from MPTN.MSG file */
443 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
444 myerrorcode - SOCBASEERR + 26,
445 "mptn.msg",
446 &msglen);
447 if (rc == NO_ERROR) {
448 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000449
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000450 /* OS/2 doesn't guarantee a terminator */
451 outbuf[msglen] = '\0';
452 if (strlen(outbuf) > 0) {
453 /* If non-empty msg, trim CRLF */
454 char *lastc = &outbuf[ strlen(outbuf)-1 ];
455 while (lastc > outbuf && isspace(*lastc)) {
456 /* Trim trailing whitespace (CRLF) */
457 *lastc-- = '\0';
458 }
459 }
460 v = Py_BuildValue("(is)", myerrorcode, outbuf);
461 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000462 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000463 Py_DECREF(v);
464 }
465 return NULL;
466 }
467 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000468#endif
469
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000470#if defined(RISCOS)
471 if (_inet_error.errnum != NULL) {
472 PyObject *v;
473 v = Py_BuildValue("(is)", errno, _inet_err());
474 if (v != NULL) {
475 PyErr_SetObject(socket_error, v);
476 Py_DECREF(v);
477 }
478 return NULL;
479 }
480#endif
481
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000482 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000483}
484
Guido van Rossum30a685f1991-06-27 15:51:29 +0000485
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000486static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000487set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000488{
489 PyObject *v;
490
491#ifdef HAVE_HSTRERROR
492 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
493#else
494 v = Py_BuildValue("(is)", h_error, "host not found");
495#endif
496 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000497 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000498 Py_DECREF(v);
499 }
500
501 return NULL;
502}
503
504
505static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000506set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000507{
508 PyObject *v;
509
Martin v. Löwis272cb402002-03-01 08:31:07 +0000510#ifdef EAI_SYSTEM
511 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000512 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000513 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000514#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000515
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000516#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000517 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000518#else
519 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
520#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000521 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000522 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000523 Py_DECREF(v);
524 }
525
526 return NULL;
527}
528
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000529/* Function to perform the setting of socket blocking mode
530 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000531static int
532internal_setblocking(PySocketSockObject *s, int block)
533{
534#ifndef RISCOS
535#ifndef MS_WINDOWS
536 int delay_flag;
537#endif
538#endif
539
540 Py_BEGIN_ALLOW_THREADS
541#ifdef __BEOS__
542 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000543 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
544 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000545#else
546#ifndef RISCOS
547#ifndef MS_WINDOWS
548#if defined(PYOS_OS2) && !defined(PYCC_GCC)
549 block = !block;
550 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000551#elif defined(__VMS)
552 block = !block;
553 ioctl(s->sock_fd, FIONBIO, (char *)&block);
554#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000555 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
556 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000557 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000558 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000559 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000560 fcntl(s->sock_fd, F_SETFL, delay_flag);
561#endif /* !PYOS_OS2 */
562#else /* MS_WINDOWS */
563 block = !block;
564 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
565#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000566#else /* RISCOS */
567 block = !block;
568 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000569#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000570#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000571 Py_END_ALLOW_THREADS
572
573 /* Since these don't return anything */
574 return 1;
575}
576
Guido van Rossum11ba0942002-06-13 15:07:44 +0000577/* Do a select() on the socket, if necessary (sock_timeout > 0).
578 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000579 This does not raise an exception; we'll let our caller do that
580 after they've reacquired the interpreter lock.
581 Returns 1 on timeout, 0 otherwise. */
582static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000583internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584{
585 fd_set fds;
586 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000587 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000588
Guido van Rossumad654902002-07-19 12:44:59 +0000589 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000590 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000591 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000592
Guido van Rossumad654902002-07-19 12:44:59 +0000593 /* Guard against closed socket */
594 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000595 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000596
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597 /* Construct the arguments to select */
598 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000599 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600 FD_ZERO(&fds);
601 FD_SET(s->sock_fd, &fds);
602
603 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000604 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000605 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000606 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000607 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
608 if (n == 0)
609 return 1;
610 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000611}
612
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000613/* Initialize a new socket object. */
614
Tim Petersa12b4cf2002-07-18 22:38:44 +0000615static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000616
Mark Hammond62b1ab12002-07-23 06:31:15 +0000617PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000618init_sockobject(PySocketSockObject *s,
619 SOCKET_T fd, int family, int type, int proto)
620{
621#ifdef RISCOS
622 int block = 1;
623#endif
624 s->sock_fd = fd;
625 s->sock_family = family;
626 s->sock_type = type;
627 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000628 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000629
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000630 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000631
632 if (defaulttimeout >= 0.0)
633 internal_setblocking(s, 0);
634
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000635#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000636 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000637 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000638#endif
639}
640
641
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642/* Create a new socket object.
643 This just creates the object and initializes it.
644 If the creation fails, return NULL and set an exception (implicit
645 in NEWOBJ()). */
646
Guido van Rossum73624e91994-10-10 17:59:00 +0000647static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000648new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000649{
Guido van Rossum73624e91994-10-10 17:59:00 +0000650 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000651 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000652 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000653 if (s != NULL)
654 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000655 return s;
656}
657
Guido van Rossum30a685f1991-06-27 15:51:29 +0000658
Guido van Rossum48a680c2001-03-02 06:34:14 +0000659/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000660 thread to be in gethostbyname or getaddrinfo */
661#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
662PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000663#endif
664
665
Guido van Rossum30a685f1991-06-27 15:51:29 +0000666/* Convert a string specifying a host name or one of a few symbolic
667 names to a numeric IP address. This usually calls gethostbyname()
668 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000669 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000670 an error occurred; then an exception is raised. */
671
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000672static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000673setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000674{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000675 struct addrinfo hints, *res;
676 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000677 int d1, d2, d3, d4;
678 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000679
Guido van Rossuma376cc51996-12-05 23:43:35 +0000680 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000681 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000682 int siz;
683 memset(&hints, 0, sizeof(hints));
684 hints.ai_family = af;
685 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
686 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000687 Py_BEGIN_ALLOW_THREADS
688 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000689 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000690 Py_END_ALLOW_THREADS
691 /* We assume that those thread-unsafe getaddrinfo() versions
692 *are* safe regarding their return value, ie. that a
693 subsequent call to getaddrinfo() does not destroy the
694 outcome of the first call. */
695 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000696 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000697 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000698 return -1;
699 }
700 switch (res->ai_family) {
701 case AF_INET:
702 siz = 4;
703 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000704#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000705 case AF_INET6:
706 siz = 16;
707 break;
708#endif
709 default:
710 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000711 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000712 "unsupported address family");
713 return -1;
714 }
715 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000716 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000717 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000718 "wildcard resolved to multiple address");
719 return -1;
720 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000721 if (res->ai_addrlen < addr_ret_size)
722 addr_ret_size = res->ai_addrlen;
723 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000724 freeaddrinfo(res);
725 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000726 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000727 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000728 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000729 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000730 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000731 "address family mismatched");
732 return -1;
733 }
734 sin = (struct sockaddr_in *)addr_ret;
735 memset((void *) sin, '\0', sizeof(*sin));
736 sin->sin_family = AF_INET;
737#ifdef HAVE_SOCKADDR_SA_LEN
738 sin->sin_len = sizeof(*sin);
739#endif
740 sin->sin_addr.s_addr = INADDR_BROADCAST;
741 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000742 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000743 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
744 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
745 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
746 struct sockaddr_in *sin;
747 sin = (struct sockaddr_in *)addr_ret;
748 sin->sin_addr.s_addr = htonl(
749 ((long) d1 << 24) | ((long) d2 << 16) |
750 ((long) d3 << 8) | ((long) d4 << 0));
751 sin->sin_family = AF_INET;
752#ifdef HAVE_SOCKADDR_SA_LEN
753 sin->sin_len = sizeof(*sin);
754#endif
755 return 4;
756 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000757 memset(&hints, 0, sizeof(hints));
758 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000759 Py_BEGIN_ALLOW_THREADS
760 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000761 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000762#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000763 if (error == EAI_NONAME && af == AF_UNSPEC) {
764 /* On Tru64 V5.1, numeric-to-addr conversion fails
765 if no address family is given. Assume IPv4 for now.*/
766 hints.ai_family = AF_INET;
767 error = getaddrinfo(name, NULL, &hints, &res);
768 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000769#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000770 Py_END_ALLOW_THREADS
771 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000772 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000773 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000774 return -1;
775 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000776 if (res->ai_addrlen < addr_ret_size)
777 addr_ret_size = res->ai_addrlen;
778 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000779 freeaddrinfo(res);
780 switch (addr_ret->sa_family) {
781 case AF_INET:
782 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000783#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000784 case AF_INET6:
785 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000786#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000787 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000788 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000789 return -1;
790 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791}
792
Guido van Rossum30a685f1991-06-27 15:51:29 +0000793
Guido van Rossum30a685f1991-06-27 15:51:29 +0000794/* Create a string object representing an IP address.
795 This is always a string of the form 'dd.dd.dd.dd' (with variable
796 size numbers). */
797
Guido van Rossum73624e91994-10-10 17:59:00 +0000798static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000799makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000800{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000801 char buf[NI_MAXHOST];
802 int error;
803
804 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
805 NI_NUMERICHOST);
806 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000807 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000808 return NULL;
809 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000810 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000811}
812
813
814/* Create an object representing the given socket address,
815 suitable for passing it back to bind(), connect() etc.
816 The family field of the sockaddr structure is inspected
817 to determine what kind of address it really is. */
818
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000820static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000821makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000823 if (addrlen == 0) {
824 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000825 Py_INCREF(Py_None);
826 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000827 }
828
Guido van Rossumbcc20741998-08-04 22:53:56 +0000829#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000830 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000831 addr->sa_family = AF_INET;
832#endif
833
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834 switch (addr->sa_family) {
835
836 case AF_INET:
837 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000838 struct sockaddr_in *a;
839 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000840 PyObject *ret = NULL;
841 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000842 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000843 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
844 Py_DECREF(addrobj);
845 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000846 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000849#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850 case AF_UNIX:
851 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000853 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000855#endif /* AF_UNIX */
856
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000857#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000858 case AF_INET6:
859 {
860 struct sockaddr_in6 *a;
861 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
862 PyObject *ret = NULL;
863 if (addrobj) {
864 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000865 ret = Py_BuildValue("Oiii",
866 addrobj,
867 ntohs(a->sin6_port),
868 a->sin6_flowinfo,
869 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000870 Py_DECREF(addrobj);
871 }
872 return ret;
873 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000874#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000875
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000876#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000877 case AF_PACKET:
878 {
879 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
880 char *ifname = "";
881 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000882 /* need to look up interface name give index */
883 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000884 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000885 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000886 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000887 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000888 return Py_BuildValue("shbhs#",
889 ifname,
890 ntohs(a->sll_protocol),
891 a->sll_pkttype,
892 a->sll_hatype,
893 a->sll_addr,
894 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000895 }
896#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000897
Guido van Rossum30a685f1991-06-27 15:51:29 +0000898 /* More cases here... */
899
900 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000901 /* If we don't know the address family, don't raise an
902 exception -- return it as a tuple. */
903 return Py_BuildValue("is#",
904 addr->sa_family,
905 addr->sa_data,
906 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000907
Guido van Rossum30a685f1991-06-27 15:51:29 +0000908 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000909}
910
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911
912/* Parse a socket address argument according to the socket object's
913 address family. Return 1 if the address was in the proper format,
914 0 of not. The address is returned through addr_ret, its length
915 through len_ret. */
916
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000917static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000918getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000919 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000920{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000921 switch (s->sock_family) {
922
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +0000923#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000924 case AF_UNIX:
925 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000926 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000927 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000928 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000929 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000930 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000932 if (len > sizeof addr->sun_path) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000933 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +0000934 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935 return 0;
936 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000937 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000938 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000939 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000940 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000941 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942 return 1;
943 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000944#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000945
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946 case AF_INET:
947 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000948 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000949 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000950 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000951 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000952 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000953 PyErr_Format(
954 PyExc_TypeError,
955 "getsockaddrarg: "
956 "AF_INET address must be tuple, not %.500s",
957 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +0000958 return 0;
959 }
Martin v. Löwis2548c732003-04-18 10:39:54 +0000960 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
961 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000962 return 0;
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000963 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000964 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000965 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000966 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000967 *addr_ret = (struct sockaddr *) addr;
968 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000969 return 1;
970 }
971
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000972#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000973 case AF_INET6:
974 {
975 struct sockaddr_in6* addr;
976 char *host;
977 int port, flowinfo, scope_id;
978 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
979 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +0000980 if (!PyArg_ParseTuple(args, "eti|ii",
981 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000982 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000983 return 0;
984 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000985 if (setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6) < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000986 return 0;
987 addr->sin6_family = s->sock_family;
988 addr->sin6_port = htons((short)port);
989 addr->sin6_flowinfo = flowinfo;
990 addr->sin6_scope_id = scope_id;
991 *addr_ret = (struct sockaddr *) addr;
992 *len_ret = sizeof *addr;
993 return 1;
994 }
995#endif
996
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000997#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000998 case AF_PACKET:
999 {
1000 struct sockaddr_ll* addr;
1001 struct ifreq ifr;
1002 char *interfaceName;
1003 int protoNumber;
1004 int hatype = 0;
1005 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001006 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001007
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001008 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
1009 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +00001010 return 0;
1011 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1012 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001013 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001014 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001015 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001016 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001017 addr = &(s->sock_addr.ll);
1018 addr->sll_family = AF_PACKET;
1019 addr->sll_protocol = htons((short)protoNumber);
1020 addr->sll_ifindex = ifr.ifr_ifindex;
1021 addr->sll_pkttype = pkttype;
1022 addr->sll_hatype = hatype;
1023 *addr_ret = (struct sockaddr *) addr;
1024 *len_ret = sizeof *addr;
1025 return 1;
1026 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001027#endif
1028
Guido van Rossum30a685f1991-06-27 15:51:29 +00001029 /* More cases here... */
1030
1031 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001032 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033 return 0;
1034
1035 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001036}
1037
Guido van Rossum30a685f1991-06-27 15:51:29 +00001038
Guido van Rossum48a680c2001-03-02 06:34:14 +00001039/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001040 Return 1 if the family is known, 0 otherwise. The length is returned
1041 through len_ret. */
1042
1043static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001044getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001045{
1046 switch (s->sock_family) {
1047
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00001048#if defined(AF_UNIX) && !defined(PYOS_OS2)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001049 case AF_UNIX:
1050 {
1051 *len_ret = sizeof (struct sockaddr_un);
1052 return 1;
1053 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001054#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001055
1056 case AF_INET:
1057 {
1058 *len_ret = sizeof (struct sockaddr_in);
1059 return 1;
1060 }
1061
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001062#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001063 case AF_INET6:
1064 {
1065 *len_ret = sizeof (struct sockaddr_in6);
1066 return 1;
1067 }
1068#endif
1069
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001070#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001071 case AF_PACKET:
1072 {
1073 *len_ret = sizeof (struct sockaddr_ll);
1074 return 1;
1075 }
1076#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001077
Guido van Rossum710e1df1992-06-12 10:39:36 +00001078 /* More cases here... */
1079
1080 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001081 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001082 return 0;
1083
1084 }
1085}
1086
1087
Guido van Rossum30a685f1991-06-27 15:51:29 +00001088/* s.accept() method */
1089
Guido van Rossum73624e91994-10-10 17:59:00 +00001090static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001091sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001092{
1093 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +00001094 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001095 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001096 PyObject *sock = NULL;
1097 PyObject *addr = NULL;
1098 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001099 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001100
Guido van Rossum710e1df1992-06-12 10:39:36 +00001101 if (!getsockaddrlen(s, &addrlen))
1102 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001103 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001104
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001105#ifdef MS_WINDOWS
1106 newfd = INVALID_SOCKET;
1107#else
1108 newfd = -1;
1109#endif
1110
Guido van Rossum73624e91994-10-10 17:59:00 +00001111 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001112 timeout = internal_select(s, 0);
1113 if (!timeout)
1114 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf,
1115 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001116 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001117
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001118 if (timeout) {
1119 PyErr_SetString(socket_timeout, "timed out");
1120 return NULL;
1121 }
1122
Fred Drakea04eaad2000-06-30 02:46:07 +00001123#ifdef MS_WINDOWS
1124 if (newfd == INVALID_SOCKET)
1125#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001126 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001127#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001128 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001129
Guido van Rossum30a685f1991-06-27 15:51:29 +00001130 /* Create the new object with unspecified family,
1131 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001132 sock = (PyObject *) new_sockobject(newfd,
1133 s->sock_family,
1134 s->sock_type,
1135 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001136
Barry Warsaw752300b1997-01-03 17:18:10 +00001137 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001138 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001139 goto finally;
1140 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001141 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001142 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001143 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001144 goto finally;
1145
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001146 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001147
Guido van Rossum67f7a382002-06-06 21:08:16 +00001148finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001149 Py_XDECREF(sock);
1150 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001151 return res;
1152}
1153
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001154PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001155"accept() -> (socket object, address info)\n\
1156\n\
1157Wait for an incoming connection. Return a new socket representing the\n\
1158connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001159info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001160
Guido van Rossum11ba0942002-06-13 15:07:44 +00001161/* s.setblocking(flag) method. Argument:
1162 False -- non-blocking mode; same as settimeout(0)
1163 True -- blocking mode; same as settimeout(None)
1164*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001165
Guido van Rossum73624e91994-10-10 17:59:00 +00001166static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001167sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001168{
1169 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001170
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001171 block = PyInt_AsLong(arg);
1172 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001173 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001174
Guido van Rossum11ba0942002-06-13 15:07:44 +00001175 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001176 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001177
Guido van Rossum73624e91994-10-10 17:59:00 +00001178 Py_INCREF(Py_None);
1179 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001180}
Guido van Rossume4485b01994-09-07 14:32:49 +00001181
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001182PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001183"setblocking(flag)\n\
1184\n\
1185Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001186setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001187setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001188
Guido van Rossum11ba0942002-06-13 15:07:44 +00001189/* s.settimeout(timeout) method. Argument:
1190 None -- no timeout, blocking mode; same as setblocking(True)
1191 0.0 -- non-blocking mode; same as setblocking(False)
1192 > 0 -- timeout mode; operations time out after timeout seconds
1193 < 0 -- illegal; raises an exception
1194*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001195static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001196sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001197{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001198 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001199
1200 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001201 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001202 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001203 timeout = PyFloat_AsDouble(arg);
1204 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001205 if (!PyErr_Occurred())
1206 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001207 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001208 return NULL;
1209 }
1210 }
1211
Guido van Rossum11ba0942002-06-13 15:07:44 +00001212 s->sock_timeout = timeout;
1213 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001214
1215 Py_INCREF(Py_None);
1216 return Py_None;
1217}
1218
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001219PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001220"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001221\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001222Set a timeout on socket operations. 'timeout' can be a float,\n\
1223giving in seconds, or None. Setting a timeout of None disables\n\
1224the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001225Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001226
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001227/* s.gettimeout() method.
1228 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001229static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001230sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001231{
1232 if (s->sock_timeout < 0.0) {
1233 Py_INCREF(Py_None);
1234 return Py_None;
1235 }
1236 else
1237 return PyFloat_FromDouble(s->sock_timeout);
1238}
1239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001240PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001241"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001242\n\
1243Returns the timeout in floating seconds associated with socket \n\
1244operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001245operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001246
Guido van Rossum48a680c2001-03-02 06:34:14 +00001247#ifdef RISCOS
1248/* s.sleeptaskw(1 | 0) method */
1249
1250static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001251sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001252{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001253 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001254 block = PyInt_AsLong(arg);
1255 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001256 return NULL;
1257 Py_BEGIN_ALLOW_THREADS
1258 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1259 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001260
Guido van Rossum67f7a382002-06-06 21:08:16 +00001261 Py_INCREF(Py_None);
1262 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001263}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001264PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001265"sleeptaskw(flag)\n\
1266\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001267Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001268#endif
1269
1270
Guido van Rossumaee08791992-09-08 09:05:33 +00001271/* s.setsockopt() method.
1272 With an integer third argument, sets an integer option.
1273 With a string third argument, sets an option from a buffer;
1274 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001275
Guido van Rossum73624e91994-10-10 17:59:00 +00001276static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001277sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001278{
1279 int level;
1280 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001281 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001282 char *buf;
1283 int buflen;
1284 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001285
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001286 if (PyArg_ParseTuple(args, "iii:setsockopt",
1287 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001288 buf = (char *) &flag;
1289 buflen = sizeof flag;
1290 }
1291 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001292 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001293 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1294 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001295 return NULL;
1296 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001297 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001298 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001299 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001300 Py_INCREF(Py_None);
1301 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001302}
1303
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001304PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001305"setsockopt(level, option, value)\n\
1306\n\
1307Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001308The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001309
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001310
Guido van Rossumaee08791992-09-08 09:05:33 +00001311/* s.getsockopt() method.
1312 With two arguments, retrieves an integer option.
1313 With a third integer argument, retrieves a string buffer of that size;
1314 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001315
Guido van Rossum73624e91994-10-10 17:59:00 +00001316static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001317sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001318{
1319 int level;
1320 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001321 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001323 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001324
Guido van Rossumbcc20741998-08-04 22:53:56 +00001325#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001326 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001327 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001328 return NULL;
1329#else
1330
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001331 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1332 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001333 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001334
Guido van Rossumbe32c891996-06-20 16:25:29 +00001335 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001336 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001337 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001338 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001339 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001340 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001341 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001342 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001343 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001344#ifdef __VMS
1345 if (buflen > 1024) {
1346#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001347 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001348#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001349 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001350 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001351 return NULL;
1352 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001353 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001354 if (buf == NULL)
1355 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001356 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001357 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001358 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001359 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001360 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001361 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001362 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001363 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001364#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001365}
1366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001367PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001368"getsockopt(level, option[, buffersize]) -> value\n\
1369\n\
1370Get a socket option. See the Unix manual for level and option.\n\
1371If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001372string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001373
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001374
Fred Drake728819a2000-07-01 03:40:12 +00001375/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376
Guido van Rossum73624e91994-10-10 17:59:00 +00001377static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001378sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001379{
1380 struct sockaddr *addr;
1381 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001382 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001383
Fred Drake728819a2000-07-01 03:40:12 +00001384 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001385 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001386 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001387 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001388 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001389 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001390 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001391 Py_INCREF(Py_None);
1392 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001393}
1394
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001395PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001396"bind(address)\n\
1397\n\
1398Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001399pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001400sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001401
Guido van Rossum30a685f1991-06-27 15:51:29 +00001402
1403/* s.close() method.
1404 Set the file descriptor to -1 so operations tried subsequently
1405 will surely fail. */
1406
Guido van Rossum73624e91994-10-10 17:59:00 +00001407static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001408sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001409{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001410 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001411
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001412 if ((fd = s->sock_fd) != -1) {
1413 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001414 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001415 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001416 Py_END_ALLOW_THREADS
1417 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001418 Py_INCREF(Py_None);
1419 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001420}
1421
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001422PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001423"close()\n\
1424\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001425Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001426
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001427static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001428internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1429 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001430{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001431 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001432
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001433 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001434 res = connect(s->sock_fd, addr, addrlen);
1435
1436#ifdef MS_WINDOWS
1437
1438 if (s->sock_timeout > 0.0) {
1439 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001440 /* This is a mess. Best solution: trust select */
1441 fd_set fds;
1442 struct timeval tv;
1443 tv.tv_sec = (int)s->sock_timeout;
1444 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1445 FD_ZERO(&fds);
1446 FD_SET(s->sock_fd, &fds);
1447 res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001448 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001449 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001450 timeout = 1;
1451 } else if (res > 0)
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001452 res = 0;
1453 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001454 }
1455 }
1456
1457 if (res < 0)
1458 res = WSAGetLastError();
1459
1460#else
1461
1462 if (s->sock_timeout > 0.0) {
1463 if (res < 0 && errno == EINPROGRESS) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001464 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001465 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001466 if (res < 0 && errno == EISCONN)
1467 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001468 }
1469 }
1470
1471 if (res < 0)
1472 res = errno;
1473
1474#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001475 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001476
1477 return res;
1478}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001479
Fred Drake728819a2000-07-01 03:40:12 +00001480/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001481
Guido van Rossum73624e91994-10-10 17:59:00 +00001482static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001483sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001484{
1485 struct sockaddr *addr;
1486 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001487 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001488 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001489
Fred Drake728819a2000-07-01 03:40:12 +00001490 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001491 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001492
Guido van Rossum73624e91994-10-10 17:59:00 +00001493 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001494 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001495 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001496
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001497 if (timeout) {
1498 PyErr_SetString(socket_timeout, "timed out");
1499 return NULL;
1500 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001501 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001502 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001503 Py_INCREF(Py_None);
1504 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001505}
1506
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001507PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001508"connect(address)\n\
1509\n\
1510Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001511is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001512
Guido van Rossum30a685f1991-06-27 15:51:29 +00001513
Fred Drake728819a2000-07-01 03:40:12 +00001514/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001515
1516static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001517sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001518{
1519 struct sockaddr *addr;
1520 int addrlen;
1521 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001522 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001523
Fred Drake728819a2000-07-01 03:40:12 +00001524 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001525 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001526
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001527 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001528 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001529 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001530
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001531 return PyInt_FromLong((long) res);
1532}
1533
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001534PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001535"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001536\n\
1537This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001538instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001539
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001540
Guido van Rossumed233a51992-06-23 09:07:03 +00001541/* s.fileno() method */
1542
Guido van Rossum73624e91994-10-10 17:59:00 +00001543static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001544sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001545{
Fred Drakea04eaad2000-06-30 02:46:07 +00001546#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001547 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001548#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001549 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001550#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001551}
1552
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001553PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001554"fileno() -> integer\n\
1555\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001556Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001557
Guido van Rossumed233a51992-06-23 09:07:03 +00001558
Guido van Rossumbe32c891996-06-20 16:25:29 +00001559#ifndef NO_DUP
1560/* s.dup() method */
1561
1562static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001563sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001564{
Fred Drakea04eaad2000-06-30 02:46:07 +00001565 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001566 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001567
Guido van Rossumbe32c891996-06-20 16:25:29 +00001568 newfd = dup(s->sock_fd);
1569 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001570 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001571 sock = (PyObject *) new_sockobject(newfd,
1572 s->sock_family,
1573 s->sock_type,
1574 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001575 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001576 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001577 return sock;
1578}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001580PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001581"dup() -> socket object\n\
1582\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001583Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001584
Guido van Rossumbe32c891996-06-20 16:25:29 +00001585#endif
1586
1587
Guido van Rossumc89705d1992-11-26 08:54:07 +00001588/* s.getsockname() method */
1589
Guido van Rossum73624e91994-10-10 17:59:00 +00001590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001591sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001592{
1593 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001594 int res;
1595 socklen_t addrlen;
1596
Guido van Rossumc89705d1992-11-26 08:54:07 +00001597 if (!getsockaddrlen(s, &addrlen))
1598 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001599 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001600 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001601 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001602 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001603 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001604 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001605 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001606}
1607
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001608PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001609"getsockname() -> address info\n\
1610\n\
1611Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001612info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001613
Guido van Rossumc89705d1992-11-26 08:54:07 +00001614
Guido van Rossumb6775db1994-08-01 11:34:53 +00001615#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001616/* s.getpeername() method */
1617
Guido van Rossum73624e91994-10-10 17:59:00 +00001618static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001619sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001620{
1621 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001622 int res;
1623 socklen_t addrlen;
1624
Guido van Rossumc89705d1992-11-26 08:54:07 +00001625 if (!getsockaddrlen(s, &addrlen))
1626 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001627 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001628 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001629 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001630 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001631 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001632 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001633 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001634}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001635
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001636PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001637"getpeername() -> address info\n\
1638\n\
1639Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001640info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001641
Guido van Rossumb6775db1994-08-01 11:34:53 +00001642#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001643
1644
Guido van Rossum30a685f1991-06-27 15:51:29 +00001645/* s.listen(n) method */
1646
Guido van Rossum73624e91994-10-10 17:59:00 +00001647static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001648sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001649{
1650 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001651 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001652
1653 backlog = PyInt_AsLong(arg);
1654 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001655 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001656 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001657 if (backlog < 1)
1658 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001659 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001660 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001661 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001662 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001663 Py_INCREF(Py_None);
1664 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001665}
1666
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001667PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001668"listen(backlog)\n\
1669\n\
1670Enable a server to accept connections. The backlog argument must be at\n\
1671least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001672will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001673
1674
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001675#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001676/* s.makefile(mode) method.
1677 Create a new open file object referring to a dupped version of
1678 the socket's file descriptor. (The dup() call is necessary so
1679 that the open file and socket objects may be closed independent
1680 of each other.)
1681 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1682
Guido van Rossum73624e91994-10-10 17:59:00 +00001683static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001684sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001685{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001686 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001687 char *mode = "r";
1688 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001689#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001690 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001691#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001692 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001693#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001694 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001695 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001696#ifdef __VMS
1697 char *mode_r = "r";
1698 char *mode_w = "w";
1699#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001700
Guido van Rossum43713e52000-02-29 13:59:29 +00001701 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001702 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001703#ifdef __VMS
1704 if (strcmp(mode,"rb") == 0) {
1705 mode = mode_r;
1706 }
1707 else {
1708 if (strcmp(mode,"wb") == 0) {
1709 mode = mode_w;
1710 }
1711 }
1712#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00001713#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001714 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1715 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001716#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001717 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001718#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001719 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001720 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001721 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001722 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001723 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001724#ifdef USE_GUSI2
1725 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001726 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001727 bufsize = 0;
1728#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001729 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1730 if (f != NULL)
1731 PyFile_SetBufSize(f, bufsize);
1732 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001733}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001734
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001735PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001736"makefile([mode[, buffersize]]) -> file object\n\
1737\n\
1738Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001739The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001740
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001741#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001742
Guido van Rossum48a680c2001-03-02 06:34:14 +00001743
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001744/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001745
Guido van Rossum73624e91994-10-10 17:59:00 +00001746static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001747sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001748{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001749 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00001750 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001751#ifdef __VMS
1752 int read_length;
1753 char *read_buf;
1754#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001755
Guido van Rossum43713e52000-02-29 13:59:29 +00001756 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001757 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001758
1759 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001760 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001761 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001762 return NULL;
1763 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001764
Guido van Rossum73624e91994-10-10 17:59:00 +00001765 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001766 if (buf == NULL)
1767 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001768
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001769#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001770 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001771 timeout = internal_select(s, 0);
1772 if (!timeout)
1773 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001774 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001775
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001776 if (timeout) {
1777 Py_DECREF(buf);
1778 PyErr_SetString(socket_timeout, "timed out");
1779 return NULL;
1780 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00001781 if (n < 0) {
1782 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001783 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001784 }
Tim Peters5de98422002-04-27 18:44:32 +00001785 if (n != len)
1786 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001787#else
1788 read_buf = PyString_AsString(buf);
1789 read_length = len;
1790 while (read_length != 0) {
1791 unsigned int segment;
1792
1793 segment = read_length /SEGMENT_SIZE;
1794 if (segment != 0) {
1795 segment = SEGMENT_SIZE;
1796 }
1797 else {
1798 segment = read_length;
1799 }
1800
1801 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001802 timeout = internal_select(s, 0);
1803 if (!timeout)
1804 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001805 Py_END_ALLOW_THREADS
1806
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001807 if (timeout) {
1808 Py_DECREF(buf);
1809 PyErr_SetString(socket_timeout, "timed out");
1810 return NULL;
1811 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001812 if (n < 0) {
1813 Py_DECREF(buf);
1814 return s->errorhandler();
1815 }
1816 if (n != read_length) {
1817 read_buf += n;
1818 break;
1819 }
1820
1821 read_length -= segment;
1822 read_buf += segment;
1823 }
1824 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
1825 {
1826 return NULL;
1827 }
1828#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001829 return buf;
1830}
1831
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001832PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001833"recv(buffersize[, flags]) -> data\n\
1834\n\
1835Receive up to buffersize bytes from the socket. For the optional flags\n\
1836argument, see the Unix manual. When no data is available, block until\n\
1837at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001838the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001839
Guido van Rossum30a685f1991-06-27 15:51:29 +00001840
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001841/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001842
Guido van Rossum73624e91994-10-10 17:59:00 +00001843static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001844sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001845{
1846 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001847 PyObject *buf = NULL;
1848 PyObject *addr = NULL;
1849 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001850 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001851 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001852
Guido van Rossum43713e52000-02-29 13:59:29 +00001853 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001854 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001855
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001856 if (!getsockaddrlen(s, &addrlen))
1857 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001858 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001859 if (buf == NULL)
1860 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001861
Guido van Rossum73624e91994-10-10 17:59:00 +00001862 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001863 memset(addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001864 timeout = internal_select(s, 0);
1865 if (!timeout)
1866 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001867#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001868#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001869 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001870#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001871 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001872#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001873#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001874 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001875#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001876 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001877 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001878
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001879 if (timeout) {
1880 Py_DECREF(buf);
1881 PyErr_SetString(socket_timeout, "timed out");
1882 return NULL;
1883 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00001884 if (n < 0) {
1885 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001886 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001887 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001888
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001889 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001890 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001891
Guido van Rossum67f7a382002-06-06 21:08:16 +00001892 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001893 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001894 goto finally;
1895
Guido van Rossum73624e91994-10-10 17:59:00 +00001896 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001897
1898finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001899 Py_XDECREF(addr);
1900 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001901 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001902}
1903
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001904PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001905"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1906\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001907Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001908
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001909/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001910
Guido van Rossum73624e91994-10-10 17:59:00 +00001911static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001912sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001913{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001914 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001915 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001916#ifdef __VMS
1917 int send_length;
1918#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00001919
Guido van Rossum43713e52000-02-29 13:59:29 +00001920 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001921 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001922
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001923#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00001924 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001925 timeout = internal_select(s, 1);
1926 if (!timeout)
1927 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001928 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001929
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001930 if (timeout) {
1931 PyErr_SetString(socket_timeout, "timed out");
1932 return NULL;
1933 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001934 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001935 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001936#else
1937 /* Divide packet into smaller segments for */
1938 /* TCP/IP Services for OpenVMS */
1939 send_length = len;
1940 while (send_length != 0) {
1941 unsigned int segment;
1942
1943 segment = send_length / SEGMENT_SIZE;
1944 if (segment != 0) {
1945 segment = SEGMENT_SIZE;
1946 }
1947 else {
1948 segment = send_length;
1949 }
1950 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001951 timeout = internal_select(s, 1);
1952 if (!timeout)
1953 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001954 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001955 if (timeout) {
1956 PyErr_SetString(socket_timeout, "timed out");
1957 return NULL;
1958 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001959 if (n < 0) {
1960 return s->errorhandler();
1961 }
1962 send_length -= segment;
1963 buf += segment;
1964 } /* end while */
1965#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00001966 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001967}
1968
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001969PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001970"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001971\n\
1972Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001973argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001974sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001975
1976
1977/* s.sendall(data [,flags]) method */
1978
1979static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001980sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001981{
1982 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001983 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001984
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001985 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1986 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001987
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001988 Py_BEGIN_ALLOW_THREADS
1989 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001990 timeout = internal_select(s, 1);
1991 if (timeout)
1992 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001993 n = send(s->sock_fd, buf, len, flags);
1994 if (n < 0)
1995 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001996 buf += n;
1997 len -= n;
1998 } while (len > 0);
1999 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002000
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002001 if (timeout) {
2002 PyErr_SetString(socket_timeout, "timed out");
2003 return NULL;
2004 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002005 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002006 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002007
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002008 Py_INCREF(Py_None);
2009 return Py_None;
2010}
2011
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002012PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002013"sendall(data[, flags])\n\
2014\n\
2015Send a data string to the socket. For the optional flags\n\
2016argument, see the Unix manual. This calls send() repeatedly\n\
2017until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002018to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002019
Guido van Rossum30a685f1991-06-27 15:51:29 +00002020
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002021/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002022
Guido van Rossum73624e91994-10-10 17:59:00 +00002023static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002024sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002025{
Guido van Rossum73624e91994-10-10 17:59:00 +00002026 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002027 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002028 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002029 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002030
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002031 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002032 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002033 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002034 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2035 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002036 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002037 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002038
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002039 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002040 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002041
Guido van Rossum73624e91994-10-10 17:59:00 +00002042 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002043 timeout = internal_select(s, 1);
2044 if (!timeout)
2045 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002046 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002047
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002048 if (timeout) {
2049 PyErr_SetString(socket_timeout, "timed out");
2050 return NULL;
2051 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002052 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002053 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002054 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002055}
2056
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002057PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002058"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002059\n\
2060Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002061For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002062
Guido van Rossum30a685f1991-06-27 15:51:29 +00002063
2064/* s.shutdown(how) method */
2065
Guido van Rossum73624e91994-10-10 17:59:00 +00002066static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002067sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002068{
2069 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002070 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002071
2072 how = PyInt_AsLong(arg);
2073 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002074 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002075 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002076 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002077 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002078 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002079 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002080 Py_INCREF(Py_None);
2081 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002082}
2083
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002084PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002085"shutdown(flag)\n\
2086\n\
2087Shut down the reading side of the socket (flag == 0), the writing side\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002088of the socket (flag == 1), or both ends (flag == 2).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002089
Guido van Rossum30a685f1991-06-27 15:51:29 +00002090
2091/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002092
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002093static PyMethodDef sock_methods[] = {
2094 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002095 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002096 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002097 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002098 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002099 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002100 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002101 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002102 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002103 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002104#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002105 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002106 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002107#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002108 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002109 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002110#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002111 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002112 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002113#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002114 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002115 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002116 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002117 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002118 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002119 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002120#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002121 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002122 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002123#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002124 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002125 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002126 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002127 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002128 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002129 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002130 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002131 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002132 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002133 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002134 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002135 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002136 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002137 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002138 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002139 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002140 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002141 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002142 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002143 shutdown_doc},
2144#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002145 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002146 sleeptaskw_doc},
2147#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002148 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002149};
2150
Guido van Rossum30a685f1991-06-27 15:51:29 +00002151
Guido van Rossum73624e91994-10-10 17:59:00 +00002152/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002153 First close the file description. */
2154
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002155static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002156sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002157{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002158 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002159 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002160 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002161}
2162
Guido van Rossum30a685f1991-06-27 15:51:29 +00002163
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002164static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002165sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002166{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002167 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002168#if SIZEOF_SOCKET_T > SIZEOF_LONG
2169 if (s->sock_fd > LONG_MAX) {
2170 /* this can occur on Win64, and actually there is a special
2171 ugly printf formatter for decimal pointer length integer
2172 printing, only bother if necessary*/
2173 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002174 "no printf formatter to display "
2175 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002176 return NULL;
2177 }
2178#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002179 PyOS_snprintf(
2180 buf, sizeof(buf),
2181 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2182 (long)s->sock_fd, s->sock_family,
2183 s->sock_type,
2184 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002185 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002186}
2187
2188
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002189/* Create a new, uninitialized socket object. */
2190
2191static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002192sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002193{
2194 PyObject *new;
2195
2196 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002197 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002198 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002199 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002200 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002201 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002202 return new;
2203}
2204
2205
2206/* Initialize a new socket object. */
2207
2208/*ARGSUSED*/
2209static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002210sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002211{
2212 PySocketSockObject *s = (PySocketSockObject *)self;
2213 SOCKET_T fd;
2214 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2215 static char *keywords[] = {"family", "type", "proto", 0};
2216
2217 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2218 "|iii:socket", keywords,
2219 &family, &type, &proto))
2220 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002221
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002222 Py_BEGIN_ALLOW_THREADS
2223 fd = socket(family, type, proto);
2224 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002225
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002226#ifdef MS_WINDOWS
2227 if (fd == INVALID_SOCKET)
2228#else
2229 if (fd < 0)
2230#endif
2231 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002232 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002233 return -1;
2234 }
2235 init_sockobject(s, fd, family, type, proto);
2236 /* From now on, ignore SIGPIPE and let the error checking
2237 do the work. */
2238#ifdef SIGPIPE
2239 (void) signal(SIGPIPE, SIG_IGN);
2240#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002241
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002242 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002243
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002244}
2245
2246
Guido van Rossumb6775db1994-08-01 11:34:53 +00002247/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002248
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002249static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002250 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002251 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002252 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002253 sizeof(PySocketSockObject), /* tp_basicsize */
2254 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002255 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002256 0, /* tp_print */
2257 0, /* tp_getattr */
2258 0, /* tp_setattr */
2259 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002260 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002261 0, /* tp_as_number */
2262 0, /* tp_as_sequence */
2263 0, /* tp_as_mapping */
2264 0, /* tp_hash */
2265 0, /* tp_call */
2266 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002267 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002268 0, /* tp_setattro */
2269 0, /* tp_as_buffer */
2270 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002271 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002272 0, /* tp_traverse */
2273 0, /* tp_clear */
2274 0, /* tp_richcompare */
2275 0, /* tp_weaklistoffset */
2276 0, /* tp_iter */
2277 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002278 sock_methods, /* tp_methods */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002279 0, /* tp_members */
2280 0, /* tp_getset */
2281 0, /* tp_base */
2282 0, /* tp_dict */
2283 0, /* tp_descr_get */
2284 0, /* tp_descr_set */
2285 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002286 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002287 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002288 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002289 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002290};
2291
Guido van Rossum30a685f1991-06-27 15:51:29 +00002292
Guido van Rossum81194471991-07-27 21:42:02 +00002293/* Python interface to gethostname(). */
2294
2295/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002296static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002297socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002298{
2299 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002300 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002301 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002302 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002303 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002304 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002305 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002306 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002307 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002308 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002309 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002310}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002311
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002312PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002313"gethostname() -> string\n\
2314\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002315Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002316
Guido van Rossumff4949e1992-08-05 19:58:53 +00002317
Guido van Rossum30a685f1991-06-27 15:51:29 +00002318/* Python interface to gethostbyname(name). */
2319
2320/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002321static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002322socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002323{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002324 char *name;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002325#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002326 struct sockaddr_storage addrbuf;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002327#else
2328 struct sockaddr_in addrbuf;
2329#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002330
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002331 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002332 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002333 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002334 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002335 return makeipaddr((struct sockaddr *)&addrbuf,
2336 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002337}
2338
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002339PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002340"gethostbyname(host) -> address\n\
2341\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002342Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002343
2344
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002345/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2346
2347static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002348gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002349{
2350 char **pch;
2351 PyObject *rtn_tuple = (PyObject *)NULL;
2352 PyObject *name_list = (PyObject *)NULL;
2353 PyObject *addr_list = (PyObject *)NULL;
2354 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002355
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002356 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002357 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002358#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002359 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002360#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002361 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002362#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002363 return NULL;
2364 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002365
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002366 if (h->h_addrtype != af) {
2367#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002368 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002369 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002370 (char *)strerror(EAFNOSUPPORT));
2371#else
2372 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002373 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002374 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002375#endif
2376 return NULL;
2377 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002378
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002379 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002380
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002381 case AF_INET:
2382 if (alen < sizeof(struct sockaddr_in))
2383 return NULL;
2384 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002385
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002386#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002387 case AF_INET6:
2388 if (alen < sizeof(struct sockaddr_in6))
2389 return NULL;
2390 break;
2391#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002392
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002393 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002394
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002395 if ((name_list = PyList_New(0)) == NULL)
2396 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002397
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002398 if ((addr_list = PyList_New(0)) == NULL)
2399 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002400
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002401 for (pch = h->h_aliases; *pch != NULL; pch++) {
2402 int status;
2403 tmp = PyString_FromString(*pch);
2404 if (tmp == NULL)
2405 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002406
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002407 status = PyList_Append(name_list, tmp);
2408 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002409
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002410 if (status)
2411 goto err;
2412 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002413
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002414 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2415 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002416
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002417 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002418
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002419 case AF_INET:
2420 {
2421 struct sockaddr_in sin;
2422 memset(&sin, 0, sizeof(sin));
2423 sin.sin_family = af;
2424#ifdef HAVE_SOCKADDR_SA_LEN
2425 sin.sin_len = sizeof(sin);
2426#endif
2427 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2428 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002429
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002430 if (pch == h->h_addr_list && alen >= sizeof(sin))
2431 memcpy((char *) addr, &sin, sizeof(sin));
2432 break;
2433 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002434
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002435#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002436 case AF_INET6:
2437 {
2438 struct sockaddr_in6 sin6;
2439 memset(&sin6, 0, sizeof(sin6));
2440 sin6.sin6_family = af;
2441#ifdef HAVE_SOCKADDR_SA_LEN
2442 sin6.sin6_len = sizeof(sin6);
2443#endif
2444 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2445 tmp = makeipaddr((struct sockaddr *)&sin6,
2446 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002447
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002448 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2449 memcpy((char *) addr, &sin6, sizeof(sin6));
2450 break;
2451 }
2452#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002453
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002454 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002455 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002456 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002457 return NULL;
2458 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002459
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002460 if (tmp == NULL)
2461 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002462
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002463 status = PyList_Append(addr_list, tmp);
2464 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002465
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002466 if (status)
2467 goto err;
2468 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002469
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002470 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002471
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002472 err:
2473 Py_XDECREF(name_list);
2474 Py_XDECREF(addr_list);
2475 return rtn_tuple;
2476}
2477
2478
2479/* Python interface to gethostbyname_ex(name). */
2480
2481/*ARGSUSED*/
2482static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002483socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002484{
2485 char *name;
2486 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002487#ifdef ENABLE_IPV6
2488 struct sockaddr_storage addr;
2489#else
2490 struct sockaddr_in addr;
2491#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002492 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002493 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002494#ifdef HAVE_GETHOSTBYNAME_R
2495 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002496#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2497 struct hostent_data data;
2498#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002499 char buf[16384];
2500 int buf_len = (sizeof buf) - 1;
2501 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002502#endif
2503#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002504 int result;
2505#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002506#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002507
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002508 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002509 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002510 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002511 return NULL;
2512 Py_BEGIN_ALLOW_THREADS
2513#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002514#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002515 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2516 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002517#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002518 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002519#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002520 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002521 result = gethostbyname_r(name, &hp_allocated, &data);
2522 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002523#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002524#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002525#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002526 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002527#endif
2528 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002529#endif /* HAVE_GETHOSTBYNAME_R */
2530 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002531 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002532 addr.ss_family.
2533 Therefore, we cast the sockaddr_storage into sockaddr to
2534 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002535 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002536 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002537 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002538#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002539 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002540#endif
2541 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002542}
2543
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002544PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002545"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2546\n\
2547Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002548for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002549
2550
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002551/* Python interface to gethostbyaddr(IP). */
2552
2553/*ARGSUSED*/
2554static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002555socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002556{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002557#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002558 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002559#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002560 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002561#endif
2562 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002563 char *ip_num;
2564 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002565 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002566#ifdef HAVE_GETHOSTBYNAME_R
2567 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002568#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2569 struct hostent_data data;
2570#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002571 char buf[16384];
2572 int buf_len = (sizeof buf) - 1;
2573 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002574#endif
2575#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002576 int result;
2577#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002578#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002579 char *ap;
2580 int al;
2581 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002582
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002583 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002584 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002585 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002586 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002587 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002588 af = sa->sa_family;
2589 ap = NULL;
2590 al = 0;
2591 switch (af) {
2592 case AF_INET:
2593 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2594 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2595 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002596#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002597 case AF_INET6:
2598 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2599 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2600 break;
2601#endif
2602 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002603 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002604 return NULL;
2605 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002606 Py_BEGIN_ALLOW_THREADS
2607#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002608#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002609 result = gethostbyaddr_r(ap, al, af,
2610 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002611 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002612#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002613 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002614 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002615#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002616 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002617 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002618 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002619#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002620#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002621#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002622 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002623#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002624 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002625#endif /* HAVE_GETHOSTBYNAME_R */
2626 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002627 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002628#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002629 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002630#endif
2631 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002632}
2633
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002634PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002635"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2636\n\
2637Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002638for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002639
Guido van Rossum30a685f1991-06-27 15:51:29 +00002640
2641/* Python interface to getservbyname(name).
2642 This only returns the port number, since the other info is already
2643 known or not useful (like the list of aliases). */
2644
2645/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002646static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002647socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002648{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002649 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002650 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002651 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002652 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002653 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002654 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002655 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002656 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002657 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002658 return NULL;
2659 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002660 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002661}
2662
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002663PyDoc_STRVAR(getservbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002664"getservbyname(servicename, protocolname) -> integer\n\
2665\n\
2666Return a port number from a service name and protocol name.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002667The protocol name should be 'tcp' or 'udp'.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002668
Guido van Rossum30a685f1991-06-27 15:51:29 +00002669
Guido van Rossum3901d851996-12-19 16:35:04 +00002670/* Python interface to getprotobyname(name).
2671 This only returns the protocol number, since the other info is
2672 already known or not useful (like the list of aliases). */
2673
2674/*ARGSUSED*/
2675static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002676socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002677{
2678 char *name;
2679 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002680#ifdef __BEOS__
2681/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002682 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002683 return NULL;
2684#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002685 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002686 return NULL;
2687 Py_BEGIN_ALLOW_THREADS
2688 sp = getprotobyname(name);
2689 Py_END_ALLOW_THREADS
2690 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002691 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00002692 return NULL;
2693 }
2694 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002695#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002696}
2697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002698PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002699"getprotobyname(name) -> integer\n\
2700\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002701Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002702
Guido van Rossum3901d851996-12-19 16:35:04 +00002703
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002704#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002705/* Create a socket object from a numeric file description.
2706 Useful e.g. if stdin is a socket.
2707 Additional arguments as for socket(). */
2708
2709/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002710static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002711socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002712{
Guido van Rossum73624e91994-10-10 17:59:00 +00002713 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002714 SOCKET_T fd;
2715 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002716 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2717 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002718 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002719 /* Dup the fd so it and the socket can be closed independently */
2720 fd = dup(fd);
2721 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002722 return set_error();
2723 s = new_sockobject(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002724 /* From now on, ignore SIGPIPE and let the error checking
2725 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002726#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002727 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002728#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002729 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002730}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002731
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002732PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002733"fromfd(fd, family, type[, proto]) -> socket object\n\
2734\n\
2735Create a socket object from the given file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002736The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002737
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002738#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002739
Guido van Rossum82a5c661998-07-07 20:45:43 +00002740
Guido van Rossum006bf911996-06-12 04:04:55 +00002741static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002742socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002743{
2744 int x1, x2;
2745
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002746 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002747 return NULL;
2748 }
2749 x2 = (int)ntohs((short)x1);
2750 return PyInt_FromLong(x2);
2751}
2752
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002753PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002754"ntohs(integer) -> integer\n\
2755\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002756Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002757
2758
Guido van Rossum006bf911996-06-12 04:04:55 +00002759static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002760socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002761{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002762 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002763
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002764 if (PyInt_Check(arg)) {
2765 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002766 if (x == (unsigned long) -1 && PyErr_Occurred())
2767 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002768 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002769 else if (PyLong_Check(arg)) {
2770 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002771 if (x == (unsigned long) -1 && PyErr_Occurred())
2772 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002773#if SIZEOF_LONG > 4
2774 {
2775 unsigned long y;
2776 /* only want the trailing 32 bits */
2777 y = x & 0xFFFFFFFFUL;
2778 if (y ^ x)
2779 return PyErr_Format(PyExc_OverflowError,
2780 "long int larger than 32 bits");
2781 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002782 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002783#endif
2784 }
2785 else
Tim Peters58141872002-08-06 22:25:02 +00002786 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002787 "expected int/long, %s found",
2788 arg->ob_type->tp_name);
2789 if (x == (unsigned long) -1 && PyErr_Occurred())
2790 return NULL;
2791 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002792}
2793
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002794PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002795"ntohl(integer) -> integer\n\
2796\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002797Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002798
2799
Guido van Rossum006bf911996-06-12 04:04:55 +00002800static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002801socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002802{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002803 unsigned long x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00002804
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002805 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002806 return NULL;
2807 }
2808 x2 = (int)htons((short)x1);
2809 return PyInt_FromLong(x2);
2810}
2811
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002812PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002813"htons(integer) -> integer\n\
2814\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002815Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002816
2817
Guido van Rossum006bf911996-06-12 04:04:55 +00002818static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002819socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00002820{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002821 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00002822
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002823 if (PyInt_Check(arg)) {
2824 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002825 if (x == (unsigned long) -1 && PyErr_Occurred())
2826 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00002827 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002828 else if (PyLong_Check(arg)) {
2829 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00002830 if (x == (unsigned long) -1 && PyErr_Occurred())
2831 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002832#if SIZEOF_LONG > 4
2833 {
2834 unsigned long y;
2835 /* only want the trailing 32 bits */
2836 y = x & 0xFFFFFFFFUL;
2837 if (y ^ x)
2838 return PyErr_Format(PyExc_OverflowError,
2839 "long int larger than 32 bits");
2840 x = y;
Tim Peters58141872002-08-06 22:25:02 +00002841 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002842#endif
2843 }
2844 else
Tim Peters58141872002-08-06 22:25:02 +00002845 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002846 "expected int/long, %s found",
2847 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00002848 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00002849}
2850
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002851PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002852"htonl(integer) -> integer\n\
2853\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002854Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002855
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002856/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002857
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002858PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002859"inet_aton(string) -> packed 32-bit IP representation\n\
2860\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002861Convert 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 +00002862binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002863
2864static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002865socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002866{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002867#ifndef INADDR_NONE
2868#define INADDR_NONE (-1)
2869#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00002870#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002871 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00002872#else
2873 /* Have to use inet_addr() instead */
2874 unsigned long packed_addr;
2875#endif
2876 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002877
Tim Peters1df9fdd2003-02-13 03:13:40 +00002878 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002879 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002880
Tim Peters1df9fdd2003-02-13 03:13:40 +00002881
2882#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002883 if (inet_aton(ip_addr, &buf))
2884 return PyString_FromStringAndSize((char *)(&buf),
2885 sizeof(buf));
2886
2887 PyErr_SetString(socket_error,
2888 "illegal IP address string passed to inet_aton");
2889 return NULL;
2890
Tim Peters1df9fdd2003-02-13 03:13:40 +00002891#else /* ! HAVE_INET_ATON */
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002892 /* XXX Problem here: inet_aton('255.255.255.255') raises
2893 an exception while it should be a valid address. */
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002894 packed_addr = inet_addr(ip_addr);
2895
2896 if (packed_addr == INADDR_NONE) { /* invalid address */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002897 PyErr_SetString(socket_error,
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002898 "illegal IP address string passed to inet_aton");
2899 return NULL;
2900 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002901 return PyString_FromStringAndSize((char *) &packed_addr,
2902 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00002903#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002904}
2905
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002906PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00002907"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002908\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002909Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002910
2911static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002912socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002913{
2914 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002915 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002916 struct in_addr packed_addr;
2917
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002918 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002919 return NULL;
2920 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002921
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002922 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002923 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002924 "packed IP wrong length for inet_ntoa");
2925 return NULL;
2926 }
2927
2928 memcpy(&packed_addr, packed_str, addr_len);
2929
2930 return PyString_FromString(inet_ntoa(packed_addr));
2931}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002932
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002933#ifdef HAVE_INET_PTON
2934
2935PyDoc_STRVAR(inet_pton_doc,
2936"inet_pton(af, ip) -> packed IP address string\n\
2937\n\
2938Convert an IP address from string format to a packed string suitable\n\
2939for use with low-level network functions.");
2940
2941static PyObject *
2942socket_inet_pton(PyObject *self, PyObject *args)
2943{
2944 int af;
2945 char* ip;
2946 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002947#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002948 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002949#else
2950 char packed[sizeof(struct in_addr)];
2951#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002952 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
2953 return NULL;
2954 }
2955
2956 retval = inet_pton(af, ip, packed);
2957 if (retval < 0) {
2958 PyErr_SetFromErrno(socket_error);
2959 return NULL;
2960 } else if (retval == 0) {
2961 PyErr_SetString(socket_error,
2962 "illegal IP address string passed to inet_pton");
2963 return NULL;
2964 } else if (af == AF_INET) {
2965 return PyString_FromStringAndSize(packed,
2966 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002967#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002968 } else if (af == AF_INET6) {
2969 return PyString_FromStringAndSize(packed,
2970 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002971#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002972 } else {
2973 PyErr_SetString(socket_error, "unknown address family");
2974 return NULL;
2975 }
2976}
2977
2978PyDoc_STRVAR(inet_ntop_doc,
2979"inet_ntop(af, packed_ip) -> string formatted IP address\n\
2980\n\
2981Convert a packed IP address of the given family to string format.");
2982
2983static PyObject *
2984socket_inet_ntop(PyObject *self, PyObject *args)
2985{
2986 int af;
2987 char* packed;
2988 int len;
2989 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002990#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002991 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002992#else
2993 char ip[INET_ADDRSTRLEN + 1];
2994#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00002995
2996 /* Guarantee NUL-termination for PyString_FromString() below */
2997 memset((void *) &ip[0], '\0', sizeof(ip) + 1);
2998
2999 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3000 return NULL;
3001 }
3002
3003 if (af == AF_INET) {
3004 if (len != sizeof(struct in_addr)) {
3005 PyErr_SetString(PyExc_ValueError,
3006 "invalid length of packed IP address string");
3007 return NULL;
3008 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003009#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003010 } else if (af == AF_INET6) {
3011 if (len != sizeof(struct in6_addr)) {
3012 PyErr_SetString(PyExc_ValueError,
3013 "invalid length of packed IP address string");
3014 return NULL;
3015 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003016#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003017 } else {
3018 PyErr_Format(PyExc_ValueError,
3019 "unknown address family %d", af);
3020 return NULL;
3021 }
3022
3023 retval = inet_ntop(af, packed, ip, sizeof(ip));
3024 if (!retval) {
3025 PyErr_SetFromErrno(socket_error);
3026 return NULL;
3027 } else {
3028 return PyString_FromString(retval);
3029 }
3030
3031 /* NOTREACHED */
3032 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3033 return NULL;
3034}
3035
3036#endif /* HAVE_INET_PTON */
3037
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003038/* Python interface to getaddrinfo(host, port). */
3039
3040/*ARGSUSED*/
3041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003042socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003043{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003044 struct addrinfo hints, *res;
3045 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003046 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003047 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003048 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003049 char *hptr, *pptr;
3050 int family, socktype, protocol, flags;
3051 int error;
3052 PyObject *all = (PyObject *)NULL;
3053 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003054 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003055
3056 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003057 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003058 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3059 &hobj, &pobj, &family, &socktype,
3060 &protocol, &flags)) {
3061 return NULL;
3062 }
3063 if (hobj == Py_None) {
3064 hptr = NULL;
3065 } else if (PyUnicode_Check(hobj)) {
3066 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3067 if (!idna)
3068 return NULL;
3069 hptr = PyString_AsString(idna);
3070 } else if (PyString_Check(hobj)) {
3071 hptr = PyString_AsString(hobj);
3072 } else {
3073 PyErr_SetString(PyExc_TypeError,
3074 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003075 return NULL;
3076 }
3077 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003078 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003079 pptr = pbuf;
3080 } else if (PyString_Check(pobj)) {
3081 pptr = PyString_AsString(pobj);
3082 } else if (pobj == Py_None) {
3083 pptr = (char *)NULL;
3084 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003085 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003086 return NULL;
3087 }
3088 memset(&hints, 0, sizeof(hints));
3089 hints.ai_family = family;
3090 hints.ai_socktype = socktype;
3091 hints.ai_protocol = protocol;
3092 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003093 Py_BEGIN_ALLOW_THREADS
3094 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003095 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003096 Py_END_ALLOW_THREADS
3097 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003098 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003099 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003100 return NULL;
3101 }
3102
3103 if ((all = PyList_New(0)) == NULL)
3104 goto err;
3105 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003106 PyObject *addr =
3107 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
3108 if (addr == NULL)
3109 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003110 single = Py_BuildValue("iiisO", res->ai_family,
3111 res->ai_socktype, res->ai_protocol,
3112 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003113 addr);
3114 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003115 if (single == NULL)
3116 goto err;
3117
3118 if (PyList_Append(all, single))
3119 goto err;
3120 Py_XDECREF(single);
3121 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003122 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003123 if (res0)
3124 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003125 return all;
3126 err:
3127 Py_XDECREF(single);
3128 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003129 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003130 if (res0)
3131 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003132 return (PyObject *)NULL;
3133}
3134
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003135PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003136"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3137 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003138\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003139Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003140
3141/* Python interface to getnameinfo(sa, flags). */
3142
3143/*ARGSUSED*/
3144static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003145socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003146{
3147 PyObject *sa = (PyObject *)NULL;
3148 int flags;
3149 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003150 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003151 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3152 struct addrinfo hints, *res = NULL;
3153 int error;
3154 PyObject *ret = (PyObject *)NULL;
3155
3156 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003157 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003158 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003159 if (!PyArg_ParseTuple(sa, "si|ii",
3160 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003161 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003162 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003163 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003164 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003165 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003166 Py_BEGIN_ALLOW_THREADS
3167 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003168 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003169 Py_END_ALLOW_THREADS
3170 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003171 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003172 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003173 goto fail;
3174 }
3175 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003176 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003177 "sockaddr resolved to multiple addresses");
3178 goto fail;
3179 }
3180 switch (res->ai_family) {
3181 case AF_INET:
3182 {
3183 char *t1;
3184 int t2;
3185 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003186 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003187 "IPv4 sockaddr must be 2 tuple");
3188 goto fail;
3189 }
3190 break;
3191 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003192#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003193 case AF_INET6:
3194 {
3195 struct sockaddr_in6 *sin6;
3196 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3197 sin6->sin6_flowinfo = flowinfo;
3198 sin6->sin6_scope_id = scope_id;
3199 break;
3200 }
3201#endif
3202 }
3203 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3204 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3205 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003206 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003207 goto fail;
3208 }
3209 ret = Py_BuildValue("ss", hbuf, pbuf);
3210
3211fail:
3212 if (res)
3213 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003214 return ret;
3215}
3216
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003217PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003218"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003219\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003220Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003221
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003222
3223/* Python API to getting and setting the default timeout value. */
3224
3225static PyObject *
3226socket_getdefaulttimeout(PyObject *self)
3227{
3228 if (defaulttimeout < 0.0) {
3229 Py_INCREF(Py_None);
3230 return Py_None;
3231 }
3232 else
3233 return PyFloat_FromDouble(defaulttimeout);
3234}
3235
3236PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003237"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003238\n\
3239Returns the default timeout in floating seconds for new socket objects.\n\
3240A value of None indicates that new socket objects have no timeout.\n\
3241When the socket module is first imported, the default is None.");
3242
3243static PyObject *
3244socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3245{
3246 double timeout;
3247
3248 if (arg == Py_None)
3249 timeout = -1.0;
3250 else {
3251 timeout = PyFloat_AsDouble(arg);
3252 if (timeout < 0.0) {
3253 if (!PyErr_Occurred())
3254 PyErr_SetString(PyExc_ValueError,
3255 "Timeout value out of range");
3256 return NULL;
3257 }
3258 }
3259
3260 defaulttimeout = timeout;
3261
3262 Py_INCREF(Py_None);
3263 return Py_None;
3264}
3265
3266PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003267"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003268\n\
3269Set the default timeout in floating seconds for new socket objects.\n\
3270A value of None indicates that new socket objects have no timeout.\n\
3271When the socket module is first imported, the default is None.");
3272
3273
Guido van Rossum30a685f1991-06-27 15:51:29 +00003274/* List of functions exported by this module. */
3275
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003276static PyMethodDef socket_methods[] = {
3277 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003278 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003279 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003280 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003281 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003282 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003283 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003284 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003285 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003286 METH_VARARGS, getservbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003287 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003288 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003289#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003290 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003291 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003292#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003293 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003294 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003295 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003296 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003297 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003298 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003299 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003300 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003301 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003302 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003303 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003304 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003305#ifdef HAVE_INET_PTON
3306 {"inet_pton", socket_inet_pton,
3307 METH_VARARGS, inet_pton_doc},
3308 {"inet_ntop", socket_inet_ntop,
3309 METH_VARARGS, inet_ntop_doc},
3310#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003311 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003312 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003313 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003314 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003315 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003316 METH_NOARGS, getdefaulttimeout_doc},
3317 {"setdefaulttimeout", socket_setdefaulttimeout,
3318 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003319 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003320};
3321
Guido van Rossum30a685f1991-06-27 15:51:29 +00003322
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003323#ifdef RISCOS
3324#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003325
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003326static int
3327os_init(void)
3328{
3329 _kernel_swi_regs r;
3330
3331 r.r[0] = 0;
3332 _kernel_swi(0x43380, &r, &r);
3333 taskwindow = r.r[0];
3334
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003335 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003336}
3337
3338#endif /* RISCOS */
3339
3340
3341#ifdef MS_WINDOWS
3342#define OS_INIT_DEFINED
3343
3344/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003345
3346static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003347os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003348{
3349 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003350}
3351
3352static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003353os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003354{
3355 WSADATA WSAData;
3356 int ret;
3357 char buf[100];
3358 ret = WSAStartup(0x0101, &WSAData);
3359 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003360 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003361 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003362 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003363 case WSASYSNOTREADY:
3364 PyErr_SetString(PyExc_ImportError,
3365 "WSAStartup failed: network not ready");
3366 break;
3367 case WSAVERNOTSUPPORTED:
3368 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003369 PyErr_SetString(
3370 PyExc_ImportError,
3371 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003372 break;
3373 default:
Tim Peters885d4572001-11-28 20:27:42 +00003374 PyOS_snprintf(buf, sizeof(buf),
3375 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003376 PyErr_SetString(PyExc_ImportError, buf);
3377 break;
3378 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003379 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003380}
3381
Guido van Rossum8d665e61996-06-26 18:22:49 +00003382#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003383
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003384
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003385#ifdef PYOS_OS2
3386#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003387
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003388/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003389
3390static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003391os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003392{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003393#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003394 char reason[64];
3395 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003396
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003397 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003398 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003399 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003400
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003401 PyOS_snprintf(reason, sizeof(reason),
3402 "OS/2 TCP/IP Error# %d", sock_errno());
3403 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003404
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003405 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003406#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003407 /* No need to initialise sockets with GCC/EMX */
3408 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003409#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003410}
3411
3412#endif /* PYOS_OS2 */
3413
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003414
3415#ifndef OS_INIT_DEFINED
3416static int
3417os_init(void)
3418{
3419 return 1; /* Success */
3420}
3421#endif
3422
3423
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003424/* C API table - always add new things to the end for binary
3425 compatibility. */
3426static
3427PySocketModule_APIObject PySocketModuleAPI =
3428{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003429 &sock_type,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003430};
3431
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003432
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003433/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003434
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003435 This module is actually called "_socket", and there's a wrapper
3436 "socket.py" which implements some additional functionality. On some
3437 platforms (e.g. Windows and OS/2), socket.py also implements a
3438 wrapper for the socket type that provides missing functionality such
3439 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3440 with an ImportError exception if os-specific initialization fails.
3441 On Windows, this does WINSOCK initialization. When WINSOCK is
3442 initialized succesfully, a call to WSACleanup() is scheduled to be
3443 made at exit time.
3444*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003445
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003446PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003447"Implementation module for socket operations.\n\
3448\n\
3449See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003450
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003451PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003452init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003453{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003454 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003455
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003456 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003457 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003458
3459 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003460 m = Py_InitModule3(PySocket_MODULE_NAME,
3461 socket_methods,
3462 socket_doc);
3463
3464 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3465 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003466 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003467 Py_INCREF(socket_error);
3468 PyModule_AddObject(m, "error", socket_error);
3469 socket_herror = PyErr_NewException("socket.herror",
3470 socket_error, NULL);
3471 if (socket_herror == NULL)
3472 return;
3473 Py_INCREF(socket_herror);
3474 PyModule_AddObject(m, "herror", socket_herror);
3475 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003476 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003477 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003478 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003479 Py_INCREF(socket_gaierror);
3480 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003481 socket_timeout = PyErr_NewException("socket.timeout",
3482 socket_error, NULL);
3483 if (socket_timeout == NULL)
3484 return;
3485 Py_INCREF(socket_timeout);
3486 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003487 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003488 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003489 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003490 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003491 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003492 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003493 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003494 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003495
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003496#ifdef ENABLE_IPV6
3497 has_ipv6 = Py_True;
3498#else
3499 has_ipv6 = Py_False;
3500#endif
3501 Py_INCREF(has_ipv6);
3502 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3503
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003504 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003505 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003506 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3507 ) != 0)
3508 return;
3509
Guido van Rossum09be4091999-08-09 14:40:40 +00003510 /* Address families (we only support AF_INET and AF_UNIX) */
3511#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003512 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003513#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003514 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003515#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003516 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003517#endif /* AF_INET6 */
Andrew MacIntyre34d3e2d2003-01-02 12:45:34 +00003518#if defined(AF_UNIX) && !defined(PYOS_OS2)
Fred Drake4baedc12002-04-01 14:53:37 +00003519 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003520#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003521#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003522 /* Amateur Radio AX.25 */
3523 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003524#endif
3525#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003526 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003527#endif
3528#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003529 /* Appletalk DDP */
3530 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003531#endif
3532#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003533 /* Amateur radio NetROM */
3534 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003535#endif
3536#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003537 /* Multiprotocol bridge */
3538 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003539#endif
3540#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003541 /* Reserved for Werner's ATM */
3542 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003543#endif
3544#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003545 /* Reserved for X.25 project */
3546 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003547#endif
3548#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003549 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003550#endif
3551#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003552 /* Amateur Radio X.25 PLP */
3553 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003554#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003555#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003556 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3557 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3558 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3559 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3560 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3561 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3562 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3563 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3564 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003565#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003566
3567 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003568 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3569 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003570#ifndef __BEOS__
3571/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003572 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3573 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003574#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00003575 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003576#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003577#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003578
3579#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003580 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003581#endif
3582#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003583 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003584#endif
3585#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003586 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003587#endif
3588#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003589 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003590#endif
3591#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003592 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003593#endif
3594#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003595 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003596#endif
3597#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003598 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003599#endif
3600#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003601 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003602#endif
3603#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003604 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003605#endif
3606#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003607 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003608#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003609#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003610 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003611#endif
3612#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003613 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003614#endif
3615#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003616 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003617#endif
3618#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003619 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003620#endif
3621#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003622 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003623#endif
3624#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003625 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003626#endif
3627#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003628 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003629#endif
3630#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003631 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003632#endif
3633
3634 /* Maximum number of connections for "listen" */
3635#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003636 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003637#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003638 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003639#endif
3640
3641 /* Flags for send, recv */
3642#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003643 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003644#endif
3645#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003646 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003647#endif
3648#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003649 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003650#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003651#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003652 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003653#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003654#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003655 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003656#endif
3657#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003658 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003659#endif
3660#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003661 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003662#endif
3663#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003664 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003665#endif
3666#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003667 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003668#endif
3669#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003670 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003671#endif
3672
3673 /* Protocol level and numbers, usable for [gs]etsockopt */
3674#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003675 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003676#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003677#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003678 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003679#else
Fred Drake4baedc12002-04-01 14:53:37 +00003680 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003681#endif
3682#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003683 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003684#endif
3685#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003686 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003687#endif
3688#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003689 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003690#endif
3691#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003692 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003693#endif
3694#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003695 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003696#endif
3697#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003698 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003699#else
Fred Drake4baedc12002-04-01 14:53:37 +00003700 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003701#endif
3702#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003703 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003704#else
Fred Drake4baedc12002-04-01 14:53:37 +00003705 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003706#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003707#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003708 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003709#else
Fred Drake4baedc12002-04-01 14:53:37 +00003710 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003711#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003712#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003713 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003714#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003715#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003716 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003717#else
Fred Drake4baedc12002-04-01 14:53:37 +00003718 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003719#endif
3720#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003721 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003722#endif
3723#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003724 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003725#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003726#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003727 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003728#endif
3729#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003730 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003731#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003732#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003733 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003734#else
Fred Drake4baedc12002-04-01 14:53:37 +00003735 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003736#endif
3737#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003738 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003739#endif
3740#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003741 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003742#endif
3743#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003744 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003745#else
Fred Drake4baedc12002-04-01 14:53:37 +00003746 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003747#endif
3748#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003749 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003750#endif
3751#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003752 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003753#endif
3754#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003755 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003756#endif
3757#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003758 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003759#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003760#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003761 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003762#endif
3763#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003764 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003765#endif
3766#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003767 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003768#endif
3769#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003770 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003771#endif
3772#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003773 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003774#endif
3775#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003776 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003777#endif
3778#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003779 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003780#endif
3781#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003782 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003783#endif
3784#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003785 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003786#endif
3787#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003788 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003789#endif
3790#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003791 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003792#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003793#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003794 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003795#endif
3796#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003797 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003798#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003799#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003800 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003801#endif
3802#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003803 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003804#endif
3805#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003806 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003807#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003808#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003809 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003810#endif
3811/**/
3812#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003813 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003814#else
Fred Drake4baedc12002-04-01 14:53:37 +00003815 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003816#endif
3817#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003818 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003819#endif
3820
3821 /* Some port configuration */
3822#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003823 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003824#else
Fred Drake4baedc12002-04-01 14:53:37 +00003825 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003826#endif
3827#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003828 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003829#else
Fred Drake4baedc12002-04-01 14:53:37 +00003830 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003831#endif
3832
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003833 /* Some reserved IP v.4 addresses */
3834#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003835 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003836#else
Fred Drake4baedc12002-04-01 14:53:37 +00003837 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003838#endif
3839#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003840 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003841#else
Fred Drake4baedc12002-04-01 14:53:37 +00003842 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003843#endif
3844#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003845 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003846#else
Fred Drake4baedc12002-04-01 14:53:37 +00003847 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003848#endif
3849#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003850 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003851#else
Fred Drake4baedc12002-04-01 14:53:37 +00003852 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003853#endif
3854#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003855 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3856 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003857#else
Fred Drake4baedc12002-04-01 14:53:37 +00003858 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003859#endif
3860#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003861 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3862 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003863#else
Fred Drake4baedc12002-04-01 14:53:37 +00003864 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003865#endif
3866#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003867 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003868#else
Fred Drake4baedc12002-04-01 14:53:37 +00003869 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003870#endif
3871
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003872 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003873#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003874 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003875#endif
3876#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003877 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003878#endif
3879#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003880 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003881#endif
3882#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003883 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003884#endif
3885#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003886 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003887#endif
3888#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003889 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003890#endif
3891#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003892 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003893#endif
3894#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003895 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003896#endif
3897#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003898 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003899#endif
3900#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003901 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003902#endif
3903#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003904 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003905#endif
3906#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003907 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003908#endif
3909#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003910 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003911#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003912#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003913 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3914 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003915#endif
3916#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003917 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3918 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003919#endif
3920#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003921 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003922#endif
3923
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003924 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3925#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003926 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003927#endif
3928#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003929 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003930#endif
3931#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003932 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003933#endif
3934#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003935 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003936#endif
3937#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003938 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003939#endif
3940#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003941 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003942#endif
3943
Guido van Rossum09be4091999-08-09 14:40:40 +00003944 /* TCP options */
3945#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003946 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003947#endif
3948#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003949 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003950#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003951#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003952 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003953#endif
3954#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003955 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003956#endif
3957#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003958 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003959#endif
3960#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003961 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003962#endif
3963#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003964 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003965#endif
3966#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003967 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003968#endif
3969#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003970 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003971#endif
3972#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003973 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003974#endif
3975#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003976 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003977#endif
3978#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003979 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003980#endif
3981
Guido van Rossum09be4091999-08-09 14:40:40 +00003982
3983 /* IPX options */
3984#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003985 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003986#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003987
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003988 /* get{addr,name}info parameters */
3989#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003990 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003991#endif
3992#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003993 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003994#endif
3995#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003996 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003997#endif
3998#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003999 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004000#endif
4001#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004002 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004003#endif
4004#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004005 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004006#endif
4007#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004008 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004009#endif
4010#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004011 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004012#endif
4013#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004014 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004015#endif
4016#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004017 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004018#endif
4019#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004020 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004021#endif
4022#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004023 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004024#endif
4025#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004026 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004027#endif
4028#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004029 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004030#endif
4031#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004032 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004033#endif
4034#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004035 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004036#endif
4037#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004038 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004039#endif
4040#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004041 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004042#endif
4043#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004044 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004045#endif
4046#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004047 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004048#endif
4049#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004050 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004051#endif
4052#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004053 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004054#endif
4055#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004056 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004057#endif
4058#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004059 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004060#endif
4061#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004062 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004063#endif
4064#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004065 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004066#endif
4067#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004068 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004069#endif
4070#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004071 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004072#endif
4073#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004074 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004075#endif
4076#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004077 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004078#endif
4079
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004080 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004081#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4082 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004083#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004084}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004085
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004086
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004087#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004088
4089/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004090/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004091
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004092int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004093inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004094{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004095 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004096 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004097 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004098 if (packed_addr == INADDR_NONE)
4099 return 0;
4100 memcpy(dst, &packed_addr, 4);
4101 return 1;
4102 }
4103 /* Should set errno to EAFNOSUPPORT */
4104 return -1;
4105}
4106
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004107const char *
4108inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004109{
4110 if (af == AF_INET) {
4111 struct in_addr packed_addr;
4112 if (size < 16)
4113 /* Should set errno to ENOSPC. */
4114 return NULL;
4115 memcpy(&packed_addr, src, sizeof(packed_addr));
4116 return strncpy(dst, inet_ntoa(packed_addr), size);
4117 }
4118 /* Should set errno to EAFNOSUPPORT */
4119 return NULL;
4120}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004121
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004122#endif