blob: d8ea4235edff23524c5badc1fbab7888afcf9f79 [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
Martin v. Löwis11017b12006-01-14 18:12:57 +000010 portable manner, though AF_PACKET and AF_NETLINK are 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 Rossum30a685f1991-06-27 15:51:29 +000022- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000023- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000024- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000025- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000026- socket.getservbyname(servicename[, protocolname]) --> port number
27- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000028- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
29 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000030- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000031- socket.ntohs(16 bit value) --> new int object
32- socket.ntohl(32 bit value) --> new int object
33- socket.htons(16 bit value) --> new int object
34- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000035- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
36 --> List of (family, socktype, proto, canonname, sockaddr)
37- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000038- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000039- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000040- socket.inet_aton(IP address) -> 32-bit packed IP representation
41- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000042- socket.getdefaulttimeout() -> None | float
43- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044- an Internet socket address is a pair (hostname, port)
45 where hostname can be anything recognized by gethostbyname()
46 (including the dd.dd.dd.dd notation) and port is in host byte order
47- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000049- an AF_PACKET socket address is a tuple containing a string
50 specifying the ethernet interface and an integer specifying
51 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000052 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000053 specify packet-type and ha-type/addr.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000054
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000055Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000056
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000057- names starting with sock_ are socket object methods
58- names starting with socket_ are module-level functions
59- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000060
Guido van Rossum6574b3e1991-06-25 21:36:08 +000061*/
62
Thomas Wouters477c8d52006-05-27 19:21:47 +000063#ifdef __APPLE__
64 /*
65 * inet_aton is not available on OSX 10.3, yet we want to use a binary
66 * that was build on 10.4 or later to work on that release, weak linking
67 * comes to the rescue.
68 */
69# pragma weak inet_aton
70#endif
71
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000072#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000073#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000074
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000075#undef MAX
76#define MAX(x, y) ((x) < (y) ? (y) : (x))
77
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000079PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080"socket([family[, type[, proto]]]) -> socket object\n\
81\n\
82Open a socket of the given type. The family argument specifies the\n\
83address family; it defaults to AF_INET. The type argument specifies\n\
84whether this is a stream (SOCK_STREAM, this is the default)\n\
85or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
86specifying the default protocol. Keyword arguments are accepted.\n\
87\n\
88A socket object represents one endpoint of a network connection.\n\
89\n\
90Methods of socket objects (keyword arguments not allowed):\n\
91\n\
92accept() -- accept a connection, returning new socket and client address\n\
93bind(addr) -- bind the socket to a local address\n\
94close() -- close the socket\n\
95connect(addr) -- connect the socket to a remote address\n\
96connect_ex(addr) -- connect, return an error code instead of an exception\n\
97dup() -- return a new socket object identical to the current one [*]\n\
98fileno() -- return underlying file descriptor\n\
99getpeername() -- return remote address [*]\n\
100getsockname() -- return local address\n\
101getsockopt(level, optname[, buflen]) -- get socket options\n\
102gettimeout() -- return timeout or None\n\
103listen(n) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000104recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000105recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000106recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000107recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000108 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000109sendall(data[, flags]) -- send all data\n\
110send(data[, flags]) -- send data, may not send all of it\n\
111sendto(data[, flags], addr) -- send data to a given address\n\
112setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
113setsockopt(level, optname, value) -- set socket options\n\
114settimeout(None | float) -- set or clear the timeout\n\
115shutdown(how) -- shut down traffic in one or both directions\n\
116\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000117 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000118
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000119/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000120 I hope some day someone can clean this up please... */
121
Guido van Rossum9376b741999-09-15 22:01:40 +0000122/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
123 script doesn't get this right, so we hardcode some platform checks below.
124 On the other hand, not all Linux versions agree, so there the settings
125 computed by the configure script are needed! */
126
127#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000128# undef HAVE_GETHOSTBYNAME_R_3_ARG
129# undef HAVE_GETHOSTBYNAME_R_5_ARG
130# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000131#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000132
Guido van Rossum7a122991999-04-13 04:07:32 +0000133#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000134# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000135#endif
136
Guido van Rossume7de2061999-03-24 17:24:33 +0000137#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000138# if defined(_AIX) || defined(__osf__)
139# define HAVE_GETHOSTBYNAME_R_3_ARG
140# elif defined(__sun) || defined(__sgi)
141# define HAVE_GETHOSTBYNAME_R_5_ARG
142# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000143/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000144# else
145# undef HAVE_GETHOSTBYNAME_R
146# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000147#endif
148
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000149#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
150 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000151# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000152#endif
153
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000154/* To use __FreeBSD_version */
155#ifdef HAVE_SYS_PARAM_H
156#include <sys/param.h>
157#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000158/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000159 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000160#if defined(WITH_THREAD) && (defined(__APPLE__) || \
161 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000162 defined(__OpenBSD__) || defined(__NetBSD__) || \
163 defined(__VMS) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000164#define USE_GETADDRINFO_LOCK
165#endif
166
167#ifdef USE_GETADDRINFO_LOCK
168#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
169#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
170#else
171#define ACQUIRE_GETADDRINFO_LOCK
172#define RELEASE_GETADDRINFO_LOCK
173#endif
174
175#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000177#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000178
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000179#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000180# include <types.h>
181# include <io.h>
182# include <sys/ioctl.h>
183# include <utils.h>
184# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000185#endif
186
Martin v. Löwis9e437302002-12-06 12:57:26 +0000187#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000188# include <ioctl.h>
189#endif
190
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000191#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000192# define INCL_DOS
193# define INCL_DOSERRORS
194# define INCL_NOPMAPI
195# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000196#endif
197
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000198#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000199/* make sure that the reentrant (gethostbyaddr_r etc)
200 functions are declared correctly if compiling with
201 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000202
Thomas Wouters477c8d52006-05-27 19:21:47 +0000203/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000204 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000205#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000206#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000207
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000208#undef _XOPEN_SOURCE
209#include <sys/socket.h>
210#include <sys/types.h>
211#include <netinet/in.h>
212#ifdef _SS_ALIGNSIZE
213#define HAVE_GETADDRINFO 1
214#define HAVE_GETNAMEINFO 1
215#endif
216
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000217#define HAVE_INET_PTON
218#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000219#endif
220
Thomas Wouters477c8d52006-05-27 19:21:47 +0000221/* Irix 6.5 fails to define this variable at all. This is needed
222 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000223 are just busted. Same thing for Solaris. */
224#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000225#define INET_ADDRSTRLEN 16
226#endif
227
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000228/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000229#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000230#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000231#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000232
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000233/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000235#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000236
237/* Addressing includes */
238
Guido van Rossum6f489d91996-06-28 20:15:15 +0000239#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000240
241/* Non-MS WINDOWS includes */
242# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000243
Guido van Rossum9376b741999-09-15 22:01:40 +0000244/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000245# ifdef __BEOS__
246# include <net/netdb.h>
247# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
248# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000249typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000251# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000252# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000253
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000255
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000256#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000257
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000259# ifdef HAVE_FCNTL_H
260# include <fcntl.h>
261# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000262
Jeremy Hylton22308652001-02-02 03:23:09 +0000263#endif
264
Skip Montanaro7befb992004-02-10 16:50:21 +0000265#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000266
267#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000269#endif
270
Neal Norwitz39d22e52002-11-02 19:55:21 +0000271#ifndef O_NONBLOCK
272# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000273#endif
274
Trent Micka708d6e2004-09-07 17:48:26 +0000275/* include Python's addrinfo.h unless it causes trouble */
276#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
277 /* Do not include addinfo.h on some newer IRIX versions.
278 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
279 * for example, but not by 6.5.10.
280 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000281#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000282 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
283 * EAI_* constants are defined in (the already included) ws2tcpip.h.
284 */
285#else
286# include "addrinfo.h"
287#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000288
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000289#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000290int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000291const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000292#endif
293
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000294#ifdef __APPLE__
295/* On OS X, getaddrinfo returns no error indication of lookup
296 failure, so we must use the emulation instead of the libinfo
297 implementation. Unfortunately, performing an autoconf test
298 for this bug would require DNS access for the machine performing
299 the configuration, which is not acceptable. Therefore, we
300 determine the bug just by checking for __APPLE__. If this bug
301 gets ever fixed, perhaps checking for sys/version.h would be
302 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000303#ifndef HAVE_GETNAMEINFO
304/* This bug seems to be fixed in Jaguar. Ths easiest way I could
305 Find to check for Jaguar is that it has getnameinfo(), which
306 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000307#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000308#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000309
310#ifdef HAVE_INET_ATON
311#define USE_INET_ATON_WEAKLINK
312#endif
313
Jack Jansen84262fb2002-07-02 14:40:42 +0000314#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000315
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000316/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000317#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000318/* avoid clashes with the C library definition of the symbol. */
319#define getaddrinfo fake_getaddrinfo
320#define gai_strerror fake_gai_strerror
321#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000322#include "getaddrinfo.c"
323#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000324#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000325#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000326#include "getnameinfo.c"
327#endif
328
Guido van Rossumbcc20741998-08-04 22:53:56 +0000329#if defined(MS_WINDOWS) || defined(__BEOS__)
330/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000331/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000332#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000333#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000334#endif
335
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000336#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000337#define EAFNOSUPPORT WSAEAFNOSUPPORT
338#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000339#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000340
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000341#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000342#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000343#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000344#endif
345
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000346#ifndef SOCKETCLOSE
347#define SOCKETCLOSE close
348#endif
349
Hye-Shik Chang81268602004-02-02 06:05:24 +0000350#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
351#define USE_BLUETOOTH 1
352#if defined(__FreeBSD__)
353#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
354#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000355#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000356#define SOL_HCI SOL_HCI_RAW
357#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000358#define sockaddr_l2 sockaddr_l2cap
359#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000360#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000361#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
362#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000363#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000364#elif defined(__NetBSD__)
365#define sockaddr_l2 sockaddr_bt
366#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000367#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000368#define sockaddr_sco sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000369#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
370#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000371#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000372#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000373#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000374#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
375#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000376#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000377#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
378#endif
379#endif
380
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000381#ifdef __VMS
382/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
383#define SEGMENT_SIZE (32 * 1024 -1)
384#endif
385
Thomas Wouters89f507f2006-12-13 04:49:30 +0000386#define SAS2SA(x) ((struct sockaddr *)(x))
387
Martin v. Löwise9416172003-05-03 10:12:45 +0000388/*
389 * Constants for getnameinfo()
390 */
391#if !defined(NI_MAXHOST)
392#define NI_MAXHOST 1025
393#endif
394#if !defined(NI_MAXSERV)
395#define NI_MAXSERV 32
396#endif
397
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000398#ifndef INVALID_SOCKET /* MS defines this */
399#define INVALID_SOCKET (-1)
400#endif
401
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000402/* XXX There's a problem here: *static* functions are not supposed to have
403 a Py prefix (or use CapitalizedWords). Later... */
404
Guido van Rossum30a685f1991-06-27 15:51:29 +0000405/* Global variable holding the exception type for errors detected
406 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000407static PyObject *socket_error;
408static PyObject *socket_herror;
409static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000410static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000411
Tim Peters643a7fc2002-02-17 04:13:21 +0000412/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000413 The sock_type variable contains pointers to various functions,
414 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000415 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000416static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000417
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000418#if defined(HAVE_POLL_H)
419#include <poll.h>
420#elif defined(HAVE_SYS_POLL_H)
421#include <sys/poll.h>
422#endif
423
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000424#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
425/* Platform can select file descriptors beyond FD_SETSIZE */
426#define IS_SELECTABLE(s) 1
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000427#elif defined(HAVE_POLL)
428/* Instead of select(), we'll use poll() since poll() works on any fd. */
429#define IS_SELECTABLE(s) 1
430/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000431#else
432/* POSIX says selecting file descriptors beyond FD_SETSIZE
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000433 has undefined behaviour. If there's no timeout left, we don't have to
434 call select, so it's a safe, little white lie. */
435#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000436#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000437
438static PyObject*
439select_error(void)
440{
441 PyErr_SetString(socket_error, "unable to select on socket");
442 return NULL;
443}
444
Guido van Rossum30a685f1991-06-27 15:51:29 +0000445/* Convenience function to raise an error according to errno
446 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000447
Guido van Rossum73624e91994-10-10 17:59:00 +0000448static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000449set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000450{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000451#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000452 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000453 static struct {
454 int no;
455 const char *msg;
456 } *msgp, msgs[] = {
457 {WSAEINTR, "Interrupted system call"},
458 {WSAEBADF, "Bad file descriptor"},
459 {WSAEACCES, "Permission denied"},
460 {WSAEFAULT, "Bad address"},
461 {WSAEINVAL, "Invalid argument"},
462 {WSAEMFILE, "Too many open files"},
463 {WSAEWOULDBLOCK,
464 "The socket operation could not complete "
465 "without blocking"},
466 {WSAEINPROGRESS, "Operation now in progress"},
467 {WSAEALREADY, "Operation already in progress"},
468 {WSAENOTSOCK, "Socket operation on non-socket"},
469 {WSAEDESTADDRREQ, "Destination address required"},
470 {WSAEMSGSIZE, "Message too long"},
471 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
472 {WSAENOPROTOOPT, "Protocol not available"},
473 {WSAEPROTONOSUPPORT, "Protocol not supported"},
474 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
475 {WSAEOPNOTSUPP, "Operation not supported"},
476 {WSAEPFNOSUPPORT, "Protocol family not supported"},
477 {WSAEAFNOSUPPORT, "Address family not supported"},
478 {WSAEADDRINUSE, "Address already in use"},
479 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
480 {WSAENETDOWN, "Network is down"},
481 {WSAENETUNREACH, "Network is unreachable"},
482 {WSAENETRESET, "Network dropped connection on reset"},
483 {WSAECONNABORTED, "Software caused connection abort"},
484 {WSAECONNRESET, "Connection reset by peer"},
485 {WSAENOBUFS, "No buffer space available"},
486 {WSAEISCONN, "Socket is already connected"},
487 {WSAENOTCONN, "Socket is not connected"},
488 {WSAESHUTDOWN, "Can't send after socket shutdown"},
489 {WSAETOOMANYREFS, "Too many references: can't splice"},
490 {WSAETIMEDOUT, "Operation timed out"},
491 {WSAECONNREFUSED, "Connection refused"},
492 {WSAELOOP, "Too many levels of symbolic links"},
493 {WSAENAMETOOLONG, "File name too long"},
494 {WSAEHOSTDOWN, "Host is down"},
495 {WSAEHOSTUNREACH, "No route to host"},
496 {WSAENOTEMPTY, "Directory not empty"},
497 {WSAEPROCLIM, "Too many processes"},
498 {WSAEUSERS, "Too many users"},
499 {WSAEDQUOT, "Disc quota exceeded"},
500 {WSAESTALE, "Stale NFS file handle"},
501 {WSAEREMOTE, "Too many levels of remote in path"},
502 {WSASYSNOTREADY, "Network subsystem is unvailable"},
503 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
504 {WSANOTINITIALISED,
505 "Successful WSAStartup() not yet performed"},
506 {WSAEDISCON, "Graceful shutdown in progress"},
507 /* Resolver errors */
508 {WSAHOST_NOT_FOUND, "No such host is known"},
509 {WSATRY_AGAIN, "Host not found, or server failed"},
510 {WSANO_RECOVERY, "Unexpected server error encountered"},
511 {WSANO_DATA, "Valid name without requested data"},
512 {WSANO_ADDRESS, "No address, look for MX record"},
513 {0, NULL}
514 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000515 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000516 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000517 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000518
Mark Hammond46a733d2000-07-24 01:45:11 +0000519 for (msgp = msgs; msgp->msg; msgp++) {
520 if (err_no == msgp->no) {
521 msg = msgp->msg;
522 break;
523 }
524 }
525
526 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000527 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000528 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000529 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000530 }
531 return NULL;
532 }
533 else
534#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000535
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000536#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000537 if (sock_errno() != NO_ERROR) {
538 APIRET rc;
539 ULONG msglen;
540 char outbuf[100];
541 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000542
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000543 /* Retrieve socket-related error message from MPTN.MSG file */
544 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
545 myerrorcode - SOCBASEERR + 26,
546 "mptn.msg",
547 &msglen);
548 if (rc == NO_ERROR) {
549 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000550
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000551 /* OS/2 doesn't guarantee a terminator */
552 outbuf[msglen] = '\0';
553 if (strlen(outbuf) > 0) {
554 /* If non-empty msg, trim CRLF */
555 char *lastc = &outbuf[ strlen(outbuf)-1 ];
Neal Norwitz30b5c5d2005-12-19 06:05:18 +0000556 while (lastc > outbuf &&
557 isspace(Py_CHARMASK(*lastc))) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000558 /* Trim trailing whitespace (CRLF) */
559 *lastc-- = '\0';
560 }
561 }
562 v = Py_BuildValue("(is)", myerrorcode, outbuf);
563 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000564 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000565 Py_DECREF(v);
566 }
567 return NULL;
568 }
569 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000570#endif
571
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000572 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000573}
574
Guido van Rossum30a685f1991-06-27 15:51:29 +0000575
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000576static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000577set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578{
579 PyObject *v;
580
581#ifdef HAVE_HSTRERROR
582 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
583#else
584 v = Py_BuildValue("(is)", h_error, "host not found");
585#endif
586 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000587 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000588 Py_DECREF(v);
589 }
590
591 return NULL;
592}
593
594
595static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000596set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000597{
598 PyObject *v;
599
Martin v. Löwis272cb402002-03-01 08:31:07 +0000600#ifdef EAI_SYSTEM
601 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000602 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000603 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000604#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000605
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000606#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000607 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000608#else
609 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
610#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000611 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000612 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000613 Py_DECREF(v);
614 }
615
616 return NULL;
617}
618
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000619#ifdef __VMS
620/* Function to send in segments */
621static int
622sendsegmented(int sock_fd, char *buf, int len, int flags)
623{
624 int n = 0;
625 int remaining = len;
626
627 while (remaining > 0) {
628 unsigned int segment;
629
630 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
631 n = send(sock_fd, buf, segment, flags);
632 if (n < 0) {
633 return n;
634 }
635 remaining -= segment;
636 buf += segment;
637 } /* end while */
638
639 return len;
640}
641#endif
642
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000643/* Function to perform the setting of socket blocking mode
644 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000645static int
646internal_setblocking(PySocketSockObject *s, int block)
647{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000648#ifndef MS_WINDOWS
649 int delay_flag;
650#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651
652 Py_BEGIN_ALLOW_THREADS
653#ifdef __BEOS__
654 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000655 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
656 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657#else
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658#ifndef MS_WINDOWS
659#if defined(PYOS_OS2) && !defined(PYCC_GCC)
660 block = !block;
661 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000662#elif defined(__VMS)
663 block = !block;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000664 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
665#else /* !PYOS_OS2 && !__VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000666 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
667 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000668 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000669 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000670 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000671 fcntl(s->sock_fd, F_SETFL, delay_flag);
672#endif /* !PYOS_OS2 */
673#else /* MS_WINDOWS */
674 block = !block;
675 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
676#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000677#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000678 Py_END_ALLOW_THREADS
679
680 /* Since these don't return anything */
681 return 1;
682}
683
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000684/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000685 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000686 This does not raise an exception; we'll let our caller do that
687 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000688 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000689static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000690internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000691{
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000692 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000693
Guido van Rossumad654902002-07-19 12:44:59 +0000694 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000695 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000696 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000697
Guido van Rossumad654902002-07-19 12:44:59 +0000698 /* Guard against closed socket */
699 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000700 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000701
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000702 /* Prefer poll, if available, since you can poll() any fd
703 * which can't be done with select(). */
704#ifdef HAVE_POLL
705 {
706 struct pollfd pollfd;
707 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000708
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000709 pollfd.fd = s->sock_fd;
710 pollfd.events = writing ? POLLOUT : POLLIN;
711
712 /* s->sock_timeout is in seconds, timeout in ms */
713 timeout = (int)(s->sock_timeout * 1000 + 0.5);
714 n = poll(&pollfd, 1, timeout);
715 }
716#else
717 {
718 /* Construct the arguments to select */
719 fd_set fds;
720 struct timeval tv;
721 tv.tv_sec = (int)s->sock_timeout;
722 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
723 FD_ZERO(&fds);
724 FD_SET(s->sock_fd, &fds);
725
726 /* See if the socket is ready */
727 if (writing)
728 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
729 else
730 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
731 }
732#endif
733
734 if (n < 0)
735 return -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000736 if (n == 0)
737 return 1;
738 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000739}
740
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000741/* Initialize a new socket object. */
742
Tim Petersa12b4cf2002-07-18 22:38:44 +0000743static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000744
Mark Hammond62b1ab12002-07-23 06:31:15 +0000745PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000746init_sockobject(PySocketSockObject *s,
747 SOCKET_T fd, int family, int type, int proto)
748{
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000749 s->sock_fd = fd;
750 s->sock_family = family;
751 s->sock_type = type;
752 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000753 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000754
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000755 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000756
757 if (defaulttimeout >= 0.0)
758 internal_setblocking(s, 0);
759
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000760}
761
762
Guido van Rossum30a685f1991-06-27 15:51:29 +0000763/* Create a new socket object.
764 This just creates the object and initializes it.
765 If the creation fails, return NULL and set an exception (implicit
766 in NEWOBJ()). */
767
Guido van Rossum73624e91994-10-10 17:59:00 +0000768static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000769new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000770{
Guido van Rossum73624e91994-10-10 17:59:00 +0000771 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000772 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000773 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000774 if (s != NULL)
775 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000776 return s;
777}
778
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779
Guido van Rossum48a680c2001-03-02 06:34:14 +0000780/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000781 thread to be in gethostbyname or getaddrinfo */
782#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
783PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000784#endif
785
786
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787/* Convert a string specifying a host name or one of a few symbolic
788 names to a numeric IP address. This usually calls gethostbyname()
789 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000790 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000791 an error occurred; then an exception is raised. */
792
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000793static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000794setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000795{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000796 struct addrinfo hints, *res;
797 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000798 int d1, d2, d3, d4;
799 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800
Guido van Rossuma376cc51996-12-05 23:43:35 +0000801 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000802 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000803 int siz;
804 memset(&hints, 0, sizeof(hints));
805 hints.ai_family = af;
806 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
807 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000808 Py_BEGIN_ALLOW_THREADS
809 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000810 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000811 Py_END_ALLOW_THREADS
812 /* We assume that those thread-unsafe getaddrinfo() versions
813 *are* safe regarding their return value, ie. that a
814 subsequent call to getaddrinfo() does not destroy the
815 outcome of the first call. */
816 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000817 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000818 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000819 return -1;
820 }
821 switch (res->ai_family) {
822 case AF_INET:
823 siz = 4;
824 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000825#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000826 case AF_INET6:
827 siz = 16;
828 break;
829#endif
830 default:
831 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000832 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000833 "unsupported address family");
834 return -1;
835 }
836 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000837 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000838 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000839 "wildcard resolved to multiple address");
840 return -1;
841 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000842 if (res->ai_addrlen < addr_ret_size)
843 addr_ret_size = res->ai_addrlen;
844 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000845 freeaddrinfo(res);
846 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000849 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000850 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000851 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000852 "address family mismatched");
853 return -1;
854 }
855 sin = (struct sockaddr_in *)addr_ret;
856 memset((void *) sin, '\0', sizeof(*sin));
857 sin->sin_family = AF_INET;
858#ifdef HAVE_SOCKADDR_SA_LEN
859 sin->sin_len = sizeof(*sin);
860#endif
861 sin->sin_addr.s_addr = INADDR_BROADCAST;
862 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000863 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000864 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
865 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
866 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
867 struct sockaddr_in *sin;
868 sin = (struct sockaddr_in *)addr_ret;
869 sin->sin_addr.s_addr = htonl(
870 ((long) d1 << 24) | ((long) d2 << 16) |
871 ((long) d3 << 8) | ((long) d4 << 0));
872 sin->sin_family = AF_INET;
873#ifdef HAVE_SOCKADDR_SA_LEN
874 sin->sin_len = sizeof(*sin);
875#endif
876 return 4;
877 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000878 memset(&hints, 0, sizeof(hints));
879 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000880 Py_BEGIN_ALLOW_THREADS
881 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000882 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000883#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000884 if (error == EAI_NONAME && af == AF_UNSPEC) {
885 /* On Tru64 V5.1, numeric-to-addr conversion fails
886 if no address family is given. Assume IPv4 for now.*/
887 hints.ai_family = AF_INET;
888 error = getaddrinfo(name, NULL, &hints, &res);
889 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000890#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000891 Py_END_ALLOW_THREADS
892 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000893 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000894 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000895 return -1;
896 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000897 if (res->ai_addrlen < addr_ret_size)
898 addr_ret_size = res->ai_addrlen;
899 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000900 freeaddrinfo(res);
901 switch (addr_ret->sa_family) {
902 case AF_INET:
903 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000904#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000905 case AF_INET6:
906 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000907#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000908 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000909 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000910 return -1;
911 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000912}
913
Guido van Rossum30a685f1991-06-27 15:51:29 +0000914
Guido van Rossum30a685f1991-06-27 15:51:29 +0000915/* Create a string object representing an IP address.
916 This is always a string of the form 'dd.dd.dd.dd' (with variable
917 size numbers). */
918
Guido van Rossum73624e91994-10-10 17:59:00 +0000919static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000920makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000921{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000922 char buf[NI_MAXHOST];
923 int error;
924
925 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
926 NI_NUMERICHOST);
927 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000928 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000929 return NULL;
930 }
Guido van Rossum32c4ac02007-08-15 03:56:40 +0000931 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932}
933
934
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000935#ifdef USE_BLUETOOTH
936/* Convert a string representation of a Bluetooth address into a numeric
937 address. Returns the length (6), or raises an exception and returns -1 if
938 an error occurred. */
939
940static int
941setbdaddr(char *name, bdaddr_t *bdaddr)
942{
943 unsigned int b0, b1, b2, b3, b4, b5;
944 char ch;
945 int n;
946
947 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
948 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
949 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
950 bdaddr->b[0] = b0;
951 bdaddr->b[1] = b1;
952 bdaddr->b[2] = b2;
953 bdaddr->b[3] = b3;
954 bdaddr->b[4] = b4;
955 bdaddr->b[5] = b5;
956 return 6;
957 } else {
958 PyErr_SetString(socket_error, "bad bluetooth address");
959 return -1;
960 }
961}
962
963/* Create a string representation of the Bluetooth address. This is always a
964 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
965 value (zero padded if necessary). */
966
967static PyObject *
968makebdaddr(bdaddr_t *bdaddr)
969{
970 char buf[(6 * 2) + 5 + 1];
971
972 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
973 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
974 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
Guido van Rossum32c4ac02007-08-15 03:56:40 +0000975 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000976}
977#endif
978
979
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980/* Create an object representing the given socket address,
981 suitable for passing it back to bind(), connect() etc.
982 The family field of the sockaddr structure is inspected
983 to determine what kind of address it really is. */
984
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000985/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000987makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000988{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000989 if (addrlen == 0) {
990 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000991 Py_INCREF(Py_None);
992 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000993 }
994
Guido van Rossumbcc20741998-08-04 22:53:56 +0000995#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000996 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000997 addr->sa_family = AF_INET;
998#endif
999
Guido van Rossum30a685f1991-06-27 15:51:29 +00001000 switch (addr->sa_family) {
1001
1002 case AF_INET:
1003 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001004 struct sockaddr_in *a;
1005 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +00001006 PyObject *ret = NULL;
1007 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001008 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +00001009 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1010 Py_DECREF(addrobj);
1011 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001012 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001014
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001015#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001016 case AF_UNIX:
1017 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001018 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001019#ifdef linux
1020 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1021 addrlen -= (sizeof(*a) - sizeof(a->sun_path));
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001022 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001023 }
1024 else
1025#endif /* linux */
1026 {
1027 /* regular NULL-terminated string */
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001028 return PyUnicode_FromString(a->sun_path);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001029 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001030 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001031#endif /* AF_UNIX */
1032
Martin v. Löwis11017b12006-01-14 18:12:57 +00001033#if defined(AF_NETLINK)
1034 case AF_NETLINK:
1035 {
1036 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
Martin v. Löwisd0560052006-01-15 07:49:20 +00001037 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001038 }
1039#endif /* AF_NETLINK */
1040
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001041#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001042 case AF_INET6:
1043 {
1044 struct sockaddr_in6 *a;
1045 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1046 PyObject *ret = NULL;
1047 if (addrobj) {
1048 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001049 ret = Py_BuildValue("Oiii",
1050 addrobj,
1051 ntohs(a->sin6_port),
1052 a->sin6_flowinfo,
1053 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001054 Py_DECREF(addrobj);
1055 }
1056 return ret;
1057 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001058#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001060#ifdef USE_BLUETOOTH
1061 case AF_BLUETOOTH:
1062 switch (proto) {
1063
1064 case BTPROTO_L2CAP:
1065 {
1066 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1067 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1068 PyObject *ret = NULL;
1069 if (addrobj) {
1070 ret = Py_BuildValue("Oi",
1071 addrobj,
1072 _BT_L2_MEMB(a, psm));
1073 Py_DECREF(addrobj);
1074 }
1075 return ret;
1076 }
1077
1078 case BTPROTO_RFCOMM:
1079 {
1080 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1081 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1082 PyObject *ret = NULL;
1083 if (addrobj) {
1084 ret = Py_BuildValue("Oi",
1085 addrobj,
1086 _BT_RC_MEMB(a, channel));
1087 Py_DECREF(addrobj);
1088 }
1089 return ret;
1090 }
1091
Thomas Wouterscf297e42007-02-23 15:07:44 +00001092 case BTPROTO_HCI:
1093 {
1094 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
1095 PyObject *ret = NULL;
1096 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1097 return ret;
1098 }
1099
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001100#if !defined(__FreeBSD__)
1101 case BTPROTO_SCO:
1102 {
1103 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1104 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1105 }
1106#endif
1107
1108 }
1109#endif
1110
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001111#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001112 case AF_PACKET:
1113 {
1114 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1115 char *ifname = "";
1116 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001117 /* need to look up interface name give index */
1118 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001119 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001120 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001121 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001122 }
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001123 return Py_BuildValue("shbhy#",
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001124 ifname,
1125 ntohs(a->sll_protocol),
1126 a->sll_pkttype,
1127 a->sll_hatype,
1128 a->sll_addr,
1129 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001130 }
1131#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001132
Guido van Rossum30a685f1991-06-27 15:51:29 +00001133 /* More cases here... */
1134
1135 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001136 /* If we don't know the address family, don't raise an
Guido van Rossum9ce8e382007-08-09 21:06:37 +00001137 exception -- return it as an (int, bytes) tuple. */
1138 return Py_BuildValue("iy#",
Guido van Rossumaa948df1997-05-07 17:41:48 +00001139 addr->sa_family,
1140 addr->sa_data,
1141 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001142
Guido van Rossum30a685f1991-06-27 15:51:29 +00001143 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001144}
1145
Guido van Rossum30a685f1991-06-27 15:51:29 +00001146
1147/* Parse a socket address argument according to the socket object's
1148 address family. Return 1 if the address was in the proper format,
1149 0 of not. The address is returned through addr_ret, its length
1150 through len_ret. */
1151
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001152static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001153getsockaddrarg(PySocketSockObject *s, PyObject *args,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001154 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001155{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001156 switch (s->sock_family) {
1157
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001158#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001159 case AF_UNIX:
1160 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001161 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001162 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001163 int len;
Guido van Rossum7e488981998-10-08 02:25:24 +00001164 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001165 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001166
1167 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001168#ifdef linux
1169 if (len > 0 && path[0] == 0) {
1170 /* Linux abstract namespace extension */
1171 if (len > sizeof addr->sun_path) {
1172 PyErr_SetString(socket_error,
1173 "AF_UNIX path too long");
1174 return 0;
1175 }
1176 }
1177 else
1178#endif /* linux */
1179 {
1180 /* regular NULL-terminated string */
1181 if (len >= sizeof addr->sun_path) {
1182 PyErr_SetString(socket_error,
1183 "AF_UNIX path too long");
1184 return 0;
1185 }
1186 addr->sun_path[len] = 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001187 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001188 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001189 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001190#if defined(PYOS_OS2)
1191 *len_ret = sizeof(*addr);
1192#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001193 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001194#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001195 return 1;
1196 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001197#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001198
Martin v. Löwis11017b12006-01-14 18:12:57 +00001199#if defined(AF_NETLINK)
1200 case AF_NETLINK:
1201 {
1202 struct sockaddr_nl* addr;
1203 int pid, groups;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001204 addr = (struct sockaddr_nl *)addr_ret;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001205 if (!PyTuple_Check(args)) {
1206 PyErr_Format(
1207 PyExc_TypeError,
1208 "getsockaddrarg: "
1209 "AF_NETLINK address must be tuple, not %.500s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001210 Py_Type(args)->tp_name);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001211 return 0;
1212 }
1213 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1214 return 0;
1215 addr->nl_family = AF_NETLINK;
1216 addr->nl_pid = pid;
1217 addr->nl_groups = groups;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001218 *len_ret = sizeof(*addr);
1219 return 1;
1220 }
1221#endif
1222
Guido van Rossum30a685f1991-06-27 15:51:29 +00001223 case AF_INET:
1224 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001225 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001226 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001227 int port, result;
Guido van Rossume4dad902000-12-01 13:13:11 +00001228 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001229 PyErr_Format(
1230 PyExc_TypeError,
1231 "getsockaddrarg: "
1232 "AF_INET address must be tuple, not %.500s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001233 Py_Type(args)->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001234 return 0;
1235 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001236 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
Martin v. Löwis2548c732003-04-18 10:39:54 +00001237 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001238 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001239 addr=(struct sockaddr_in*)addr_ret;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001240 result = setipaddr(host, (struct sockaddr *)addr,
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001241 sizeof(*addr), AF_INET);
1242 PyMem_Free(host);
1243 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001244 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001245 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001246 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001247 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001248 return 1;
1249 }
1250
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001251#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001252 case AF_INET6:
1253 {
1254 struct sockaddr_in6* addr;
1255 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001256 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001257 flowinfo = scope_id = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001258 if (!PyTuple_Check(args)) {
1259 PyErr_Format(
1260 PyExc_TypeError,
1261 "getsockaddrarg: "
1262 "AF_INET6 address must be tuple, not %.500s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001263 Py_Type(args)->tp_name);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001264 return 0;
1265 }
1266 if (!PyArg_ParseTuple(args, "eti|ii",
Martin v. Löwis2548c732003-04-18 10:39:54 +00001267 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001268 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001269 return 0;
1270 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001271 addr = (struct sockaddr_in6*)addr_ret;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001272 result = setipaddr(host, (struct sockaddr *)addr,
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001273 sizeof(*addr), AF_INET6);
1274 PyMem_Free(host);
1275 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001276 return 0;
1277 addr->sin6_family = s->sock_family;
1278 addr->sin6_port = htons((short)port);
1279 addr->sin6_flowinfo = flowinfo;
1280 addr->sin6_scope_id = scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001281 *len_ret = sizeof *addr;
1282 return 1;
1283 }
1284#endif
1285
Hye-Shik Chang81268602004-02-02 06:05:24 +00001286#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001287 case AF_BLUETOOTH:
1288 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001289 switch (s->sock_proto) {
1290 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001291 {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001292 struct sockaddr_l2 *addr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001293 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001294
Thomas Wouters89f507f2006-12-13 04:49:30 +00001295 addr = (struct sockaddr_l2 *)addr_ret;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001296 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1297 if (!PyArg_ParseTuple(args, "si", &straddr,
1298 &_BT_L2_MEMB(addr, psm))) {
1299 PyErr_SetString(socket_error, "getsockaddrarg: "
1300 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001301 return 0;
1302 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001303 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1304 return 0;
1305
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001306 *len_ret = sizeof *addr;
1307 return 1;
1308 }
1309 case BTPROTO_RFCOMM:
1310 {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001311 struct sockaddr_rc *addr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001312 char *straddr;
1313
Thomas Wouters89f507f2006-12-13 04:49:30 +00001314 addr = (struct sockaddr_rc *)addr_ret;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001315 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1316 if (!PyArg_ParseTuple(args, "si", &straddr,
1317 &_BT_RC_MEMB(addr, channel))) {
1318 PyErr_SetString(socket_error, "getsockaddrarg: "
1319 "wrong format");
1320 return 0;
1321 }
1322 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1323 return 0;
1324
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001325 *len_ret = sizeof *addr;
1326 return 1;
1327 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001328 case BTPROTO_HCI:
1329 {
1330 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
1331 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1332 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1333 PyErr_SetString(socket_error, "getsockaddrarg: "
1334 "wrong format");
1335 return 0;
1336 }
1337 *len_ret = sizeof *addr;
1338 return 1;
1339 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001340#if !defined(__FreeBSD__)
1341 case BTPROTO_SCO:
1342 {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001343 struct sockaddr_sco *addr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001344 char *straddr;
1345
Thomas Wouters89f507f2006-12-13 04:49:30 +00001346 addr = (struct sockaddr_sco *)addr_ret;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001347 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001348 if (!PyBytes_Check(args)) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001349 PyErr_SetString(socket_error, "getsockaddrarg: "
1350 "wrong format");
1351 return 0;
1352 }
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001353 straddr = PyBytes_AS_STRING(args);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001354 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1355 return 0;
1356
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001357 *len_ret = sizeof *addr;
1358 return 1;
1359 }
1360#endif
1361 default:
1362 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1363 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001364 }
1365 }
1366#endif
1367
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001368#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001369 case AF_PACKET:
1370 {
1371 struct sockaddr_ll* addr;
1372 struct ifreq ifr;
1373 char *interfaceName;
1374 int protoNumber;
1375 int hatype = 0;
1376 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001377 char *haddr = NULL;
1378 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001379
Thomas Wouters477c8d52006-05-27 19:21:47 +00001380 if (!PyTuple_Check(args)) {
1381 PyErr_Format(
1382 PyExc_TypeError,
1383 "getsockaddrarg: "
1384 "AF_PACKET address must be tuple, not %.500s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001385 Py_Type(args)->tp_name);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001386 return 0;
1387 }
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001388 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1389 &protoNumber, &pkttype, &hatype,
1390 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001391 return 0;
1392 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1393 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001394 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001395 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001396 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001397 }
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001398 if (halen > 8) {
1399 PyErr_SetString(PyExc_ValueError,
1400 "Hardware address must be 8 bytes or less");
1401 return 0;
1402 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001403 addr = (struct sockaddr_ll*)addr_ret;
1404 addr->sll_family = AF_PACKET;
1405 addr->sll_protocol = htons((short)protoNumber);
1406 addr->sll_ifindex = ifr.ifr_ifindex;
1407 addr->sll_pkttype = pkttype;
1408 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001409 if (halen != 0) {
1410 memcpy(&addr->sll_addr, haddr, halen);
1411 }
1412 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001413 *len_ret = sizeof *addr;
1414 return 1;
1415 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001416#endif
1417
Guido van Rossum30a685f1991-06-27 15:51:29 +00001418 /* More cases here... */
1419
1420 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001421 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001422 return 0;
1423
1424 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001425}
1426
Guido van Rossum30a685f1991-06-27 15:51:29 +00001427
Guido van Rossum48a680c2001-03-02 06:34:14 +00001428/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001429 Return 1 if the family is known, 0 otherwise. The length is returned
1430 through len_ret. */
1431
1432static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001433getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001434{
1435 switch (s->sock_family) {
1436
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001437#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001438 case AF_UNIX:
1439 {
1440 *len_ret = sizeof (struct sockaddr_un);
1441 return 1;
1442 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001443#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001444#if defined(AF_NETLINK)
1445 case AF_NETLINK:
1446 {
1447 *len_ret = sizeof (struct sockaddr_nl);
1448 return 1;
1449 }
1450#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001451
1452 case AF_INET:
1453 {
1454 *len_ret = sizeof (struct sockaddr_in);
1455 return 1;
1456 }
1457
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001458#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001459 case AF_INET6:
1460 {
1461 *len_ret = sizeof (struct sockaddr_in6);
1462 return 1;
1463 }
1464#endif
1465
Hye-Shik Chang81268602004-02-02 06:05:24 +00001466#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001467 case AF_BLUETOOTH:
1468 {
1469 switch(s->sock_proto)
1470 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001471
1472 case BTPROTO_L2CAP:
1473 *len_ret = sizeof (struct sockaddr_l2);
1474 return 1;
1475 case BTPROTO_RFCOMM:
1476 *len_ret = sizeof (struct sockaddr_rc);
1477 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001478 case BTPROTO_HCI:
1479 *len_ret = sizeof (struct sockaddr_hci);
1480 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001481#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001482 case BTPROTO_SCO:
1483 *len_ret = sizeof (struct sockaddr_sco);
1484 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001485#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001486 default:
1487 PyErr_SetString(socket_error, "getsockaddrlen: "
1488 "unknown BT protocol");
1489 return 0;
1490
Martin v. Löwis12af0482004-01-31 12:34:17 +00001491 }
1492 }
1493#endif
1494
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001495#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001496 case AF_PACKET:
1497 {
1498 *len_ret = sizeof (struct sockaddr_ll);
1499 return 1;
1500 }
1501#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001502
Guido van Rossum710e1df1992-06-12 10:39:36 +00001503 /* More cases here... */
1504
1505 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001506 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001507 return 0;
1508
1509 }
1510}
1511
1512
Guido van Rossum30a685f1991-06-27 15:51:29 +00001513/* s.accept() method */
1514
Guido van Rossum73624e91994-10-10 17:59:00 +00001515static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001516sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001517{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001518 sock_addr_t addrbuf;
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001519 SOCKET_T newfd = INVALID_SOCKET;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001520 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001521 PyObject *sock = NULL;
1522 PyObject *addr = NULL;
1523 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001524 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001525
Guido van Rossum710e1df1992-06-12 10:39:36 +00001526 if (!getsockaddrlen(s, &addrlen))
1527 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001528 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001529
Neal Norwitz082b2df2006-02-07 07:04:46 +00001530 if (!IS_SELECTABLE(s))
1531 return select_error();
1532
Guido van Rossum73624e91994-10-10 17:59:00 +00001533 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001534 timeout = internal_select(s, 0);
1535 if (!timeout)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001536 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001537 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001538
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001539 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001540 PyErr_SetString(socket_timeout, "timed out");
1541 return NULL;
1542 }
1543
Fred Drakea04eaad2000-06-30 02:46:07 +00001544 if (newfd == INVALID_SOCKET)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001545 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001546
Guido van Rossum30a685f1991-06-27 15:51:29 +00001547 /* Create the new object with unspecified family,
1548 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001549 sock = (PyObject *) new_sockobject(newfd,
1550 s->sock_family,
1551 s->sock_type,
1552 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001553
Barry Warsaw752300b1997-01-03 17:18:10 +00001554 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001555 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001556 goto finally;
1557 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001558 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001559 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001560 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001561 goto finally;
1562
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001563 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001564
Guido van Rossum67f7a382002-06-06 21:08:16 +00001565finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001566 Py_XDECREF(sock);
1567 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001568 return res;
1569}
1570
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001571PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001572"accept() -> (socket object, address info)\n\
1573\n\
1574Wait for an incoming connection. Return a new socket representing the\n\
1575connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001576info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001577
Guido van Rossum11ba0942002-06-13 15:07:44 +00001578/* s.setblocking(flag) method. Argument:
1579 False -- non-blocking mode; same as settimeout(0)
1580 True -- blocking mode; same as settimeout(None)
1581*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001582
Guido van Rossum73624e91994-10-10 17:59:00 +00001583static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001584sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001585{
1586 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001587
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001588 block = PyInt_AsLong(arg);
1589 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001590 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001591
Guido van Rossum11ba0942002-06-13 15:07:44 +00001592 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001593 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001594
Guido van Rossum73624e91994-10-10 17:59:00 +00001595 Py_INCREF(Py_None);
1596 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001597}
Guido van Rossume4485b01994-09-07 14:32:49 +00001598
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001599PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001600"setblocking(flag)\n\
1601\n\
1602Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001603setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001604setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001605
Guido van Rossum11ba0942002-06-13 15:07:44 +00001606/* s.settimeout(timeout) method. Argument:
1607 None -- no timeout, blocking mode; same as setblocking(True)
1608 0.0 -- non-blocking mode; same as setblocking(False)
1609 > 0 -- timeout mode; operations time out after timeout seconds
1610 < 0 -- illegal; raises an exception
1611*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001612static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001613sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001614{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001615 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001616
1617 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001618 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001619 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001620 timeout = PyFloat_AsDouble(arg);
1621 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001622 if (!PyErr_Occurred())
1623 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001624 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001625 return NULL;
1626 }
1627 }
1628
Guido van Rossum11ba0942002-06-13 15:07:44 +00001629 s->sock_timeout = timeout;
1630 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001631
1632 Py_INCREF(Py_None);
1633 return Py_None;
1634}
1635
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001636PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001637"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001638\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001639Set a timeout on socket operations. 'timeout' can be a float,\n\
1640giving in seconds, or None. Setting a timeout of None disables\n\
1641the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001642Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001643
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001644/* s.gettimeout() method.
1645 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001646static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001647sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001648{
1649 if (s->sock_timeout < 0.0) {
1650 Py_INCREF(Py_None);
1651 return Py_None;
1652 }
1653 else
1654 return PyFloat_FromDouble(s->sock_timeout);
1655}
1656
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001657PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001658"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001659\n\
1660Returns the timeout in floating seconds associated with socket \n\
1661operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001662operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001663
Guido van Rossumaee08791992-09-08 09:05:33 +00001664/* s.setsockopt() method.
1665 With an integer third argument, sets an integer option.
1666 With a string third argument, sets an option from a buffer;
1667 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001668
Guido van Rossum73624e91994-10-10 17:59:00 +00001669static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001670sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001671{
1672 int level;
1673 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001674 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001675 char *buf;
1676 int buflen;
1677 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001678
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001679 if (PyArg_ParseTuple(args, "iii:setsockopt",
1680 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001681 buf = (char *) &flag;
1682 buflen = sizeof flag;
1683 }
1684 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001685 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001686 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1687 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001688 return NULL;
1689 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001690 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001691 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001692 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001693 Py_INCREF(Py_None);
1694 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001695}
1696
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001697PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001698"setsockopt(level, option, value)\n\
1699\n\
1700Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001701The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001702
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001703
Guido van Rossumaee08791992-09-08 09:05:33 +00001704/* s.getsockopt() method.
1705 With two arguments, retrieves an integer option.
1706 With a third integer argument, retrieves a string buffer of that size;
1707 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001708
Guido van Rossum73624e91994-10-10 17:59:00 +00001709static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001710sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001711{
1712 int level;
1713 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001714 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001715 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001716 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001717
Guido van Rossumbcc20741998-08-04 22:53:56 +00001718#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001719 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001720 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001721 return NULL;
1722#else
1723
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001724 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1725 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001726 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001727
Guido van Rossumbe32c891996-06-20 16:25:29 +00001728 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001729 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001730 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001731 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001732 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001733 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001734 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001735 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001736 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001737#ifdef __VMS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001738 /* socklen_t is unsigned so no negative test is needed,
1739 test buflen == 0 is previously done */
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001740 if (buflen > 1024) {
1741#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001742 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001743#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001744 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001745 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001746 return NULL;
1747 }
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001748 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001749 if (buf == NULL)
1750 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001751 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001752 (void *)PyBytes_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001753 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001754 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001755 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001756 }
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001757 if (PyBytes_Resize(buf, buflen) < 0) {
1758 Py_DECREF(buf);
1759 return NULL;
1760 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001761 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001762#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001763}
1764
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001765PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001766"getsockopt(level, option[, buffersize]) -> value\n\
1767\n\
1768Get a socket option. See the Unix manual for level and option.\n\
1769If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001770string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001771
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001772
Fred Drake728819a2000-07-01 03:40:12 +00001773/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001774
Guido van Rossum73624e91994-10-10 17:59:00 +00001775static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001776sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001777{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001778 sock_addr_t addrbuf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001779 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001780 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001781
Thomas Wouters89f507f2006-12-13 04:49:30 +00001782 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001783 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001784 Py_BEGIN_ALLOW_THREADS
Thomas Wouters89f507f2006-12-13 04:49:30 +00001785 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001786 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001787 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001788 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001789 Py_INCREF(Py_None);
1790 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001791}
1792
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001793PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001794"bind(address)\n\
1795\n\
1796Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001797pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001798sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001799
Guido van Rossum30a685f1991-06-27 15:51:29 +00001800
1801/* s.close() method.
1802 Set the file descriptor to -1 so operations tried subsequently
1803 will surely fail. */
1804
Guido van Rossum73624e91994-10-10 17:59:00 +00001805static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001806sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001807{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001808 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001809
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001810 if ((fd = s->sock_fd) != -1) {
1811 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001812 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001813 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001814 Py_END_ALLOW_THREADS
1815 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001816 Py_INCREF(Py_None);
1817 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001818}
1819
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001820PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001821"close()\n\
1822\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001823Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001824
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001825static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001826internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1827 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001828{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001829 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001830
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001831 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001832 res = connect(s->sock_fd, addr, addrlen);
1833
1834#ifdef MS_WINDOWS
1835
1836 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001837 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1838 IS_SELECTABLE(s)) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001839 /* This is a mess. Best solution: trust select */
1840 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001841 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001842 struct timeval tv;
1843 tv.tv_sec = (int)s->sock_timeout;
1844 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1845 FD_ZERO(&fds);
1846 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001847 FD_ZERO(&fds_exc);
1848 FD_SET(s->sock_fd, &fds_exc);
1849 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001850 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001851 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001852 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001853 } else if (res > 0) {
1854 if (FD_ISSET(s->sock_fd, &fds))
1855 /* The socket is in the writeable set - this
1856 means connected */
1857 res = 0;
1858 else {
1859 /* As per MS docs, we need to call getsockopt()
1860 to get the underlying error */
1861 int res_size = sizeof res;
1862 /* It must be in the exception set */
1863 assert(FD_ISSET(s->sock_fd, &fds_exc));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001864 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
Mark Hammonda57ec932004-08-03 05:06:26 +00001865 (char *)&res, &res_size))
1866 /* getsockopt also clears WSAGetLastError,
1867 so reset it back. */
1868 WSASetLastError(res);
1869 else
1870 res = WSAGetLastError();
1871 }
1872 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001873 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001874 }
1875 }
1876
1877 if (res < 0)
1878 res = WSAGetLastError();
1879
1880#else
1881
1882 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001883 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001884 timeout = internal_select(s, 1);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001885 if (timeout == 0) {
1886 res = connect(s->sock_fd, addr, addrlen);
1887 if (res < 0 && errno == EISCONN)
1888 res = 0;
1889 }
1890 else if (timeout == -1)
1891 res = errno; /* had error */
1892 else
1893 res = EWOULDBLOCK; /* timed out */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001894 }
1895 }
1896
1897 if (res < 0)
1898 res = errno;
1899
1900#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001901 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001902
1903 return res;
1904}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001905
Fred Drake728819a2000-07-01 03:40:12 +00001906/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001907
Guido van Rossum73624e91994-10-10 17:59:00 +00001908static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001909sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001910{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001911 sock_addr_t addrbuf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001912 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001913 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001914 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001915
Thomas Wouters89f507f2006-12-13 04:49:30 +00001916 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001917 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001918
Guido van Rossum73624e91994-10-10 17:59:00 +00001919 Py_BEGIN_ALLOW_THREADS
Thomas Wouters89f507f2006-12-13 04:49:30 +00001920 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001921 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001922
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001923 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001924 PyErr_SetString(socket_timeout, "timed out");
1925 return NULL;
1926 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001927 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001928 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001929 Py_INCREF(Py_None);
1930 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001931}
1932
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001933PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001934"connect(address)\n\
1935\n\
1936Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001937is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001938
Guido van Rossum30a685f1991-06-27 15:51:29 +00001939
Fred Drake728819a2000-07-01 03:40:12 +00001940/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001941
1942static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001943sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001944{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001945 sock_addr_t addrbuf;
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001946 int addrlen;
1947 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001948 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001949
Thomas Wouters89f507f2006-12-13 04:49:30 +00001950 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001951 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001952
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001953 Py_BEGIN_ALLOW_THREADS
Thomas Wouters89f507f2006-12-13 04:49:30 +00001954 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001955 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001956
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001957 /* Signals are not errors (though they may raise exceptions). Adapted
1958 from PyErr_SetFromErrnoWithFilenameObject(). */
1959#ifdef EINTR
1960 if (res == EINTR && PyErr_CheckSignals())
1961 return NULL;
1962#endif
1963
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001964 return PyInt_FromLong((long) res);
1965}
1966
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001967PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001968"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001969\n\
1970This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001971instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001972
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001973
Guido van Rossumed233a51992-06-23 09:07:03 +00001974/* s.fileno() method */
1975
Guido van Rossum73624e91994-10-10 17:59:00 +00001976static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001977sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001978{
Fred Drakea04eaad2000-06-30 02:46:07 +00001979#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001980 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001981#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001982 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001983#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001984}
1985
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001986PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001987"fileno() -> integer\n\
1988\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001989Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001990
Guido van Rossumed233a51992-06-23 09:07:03 +00001991
Guido van Rossumbe32c891996-06-20 16:25:29 +00001992#ifndef NO_DUP
1993/* s.dup() method */
1994
1995static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001996sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001997{
Fred Drakea04eaad2000-06-30 02:46:07 +00001998 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001999 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002000
Guido van Rossumbe32c891996-06-20 16:25:29 +00002001 newfd = dup(s->sock_fd);
2002 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002003 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002004 sock = (PyObject *) new_sockobject(newfd,
2005 s->sock_family,
2006 s->sock_type,
2007 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002008 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002009 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002010 return sock;
2011}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002012
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002013PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002014"dup() -> socket object\n\
2015\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002016Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002017
Guido van Rossumbe32c891996-06-20 16:25:29 +00002018#endif
2019
2020
Guido van Rossumc89705d1992-11-26 08:54:07 +00002021/* s.getsockname() method */
2022
Guido van Rossum73624e91994-10-10 17:59:00 +00002023static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002024sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002025{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002026 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002027 int res;
2028 socklen_t addrlen;
2029
Guido van Rossumc89705d1992-11-26 08:54:07 +00002030 if (!getsockaddrlen(s, &addrlen))
2031 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002032 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002033 Py_BEGIN_ALLOW_THREADS
Thomas Wouters89f507f2006-12-13 04:49:30 +00002034 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002035 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00002036 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002037 return s->errorhandler();
Thomas Wouters89f507f2006-12-13 04:49:30 +00002038 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002039 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002040}
2041
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002042PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002043"getsockname() -> address info\n\
2044\n\
2045Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002046info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002047
Guido van Rossumc89705d1992-11-26 08:54:07 +00002048
Guido van Rossumb6775db1994-08-01 11:34:53 +00002049#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002050/* s.getpeername() method */
2051
Guido van Rossum73624e91994-10-10 17:59:00 +00002052static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002053sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002054{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002055 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002056 int res;
2057 socklen_t addrlen;
2058
Guido van Rossumc89705d1992-11-26 08:54:07 +00002059 if (!getsockaddrlen(s, &addrlen))
2060 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002061 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002062 Py_BEGIN_ALLOW_THREADS
Thomas Wouters89f507f2006-12-13 04:49:30 +00002063 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002064 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00002065 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002066 return s->errorhandler();
Thomas Wouters89f507f2006-12-13 04:49:30 +00002067 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002068 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002069}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002070
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002071PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002072"getpeername() -> address info\n\
2073\n\
2074Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002075info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002076
Guido van Rossumb6775db1994-08-01 11:34:53 +00002077#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002078
2079
Guido van Rossum30a685f1991-06-27 15:51:29 +00002080/* s.listen(n) method */
2081
Guido van Rossum73624e91994-10-10 17:59:00 +00002082static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002083sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002084{
2085 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002086 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002087
2088 backlog = PyInt_AsLong(arg);
2089 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002090 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002091 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00002092 if (backlog < 1)
2093 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002094 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00002095 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002096 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002097 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002098 Py_INCREF(Py_None);
2099 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002100}
2101
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002102PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002103"listen(backlog)\n\
2104\n\
2105Enable a server to accept connections. The backlog argument must be at\n\
2106least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002107will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002108
2109
Thomas Wouters477c8d52006-05-27 19:21:47 +00002110/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002111 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002112 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002113 * the buffer, do it in the caller. This function returns the number of bytes
2114 * succesfully read. If there was an error, it returns -1. Note that it is
2115 * also possible that we return a number of bytes smaller than the request
2116 * bytes.
2117 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002118static ssize_t
Thomas Wouters477c8d52006-05-27 19:21:47 +00002119sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2120{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002121 ssize_t outlen = -1;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002122 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002123#ifdef __VMS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002124 int remaining;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002125 char *read_buf;
2126#endif
2127
2128 if (!IS_SELECTABLE(s)) {
2129 select_error();
2130 return -1;
2131 }
Guido van Rossumc2de7c02007-08-03 22:27:51 +00002132 if (len == 0) {
2133 /* If 0 bytes were requested, do nothing. */
2134 return 0;
2135 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002136
2137#ifndef __VMS
2138 Py_BEGIN_ALLOW_THREADS
2139 timeout = internal_select(s, 0);
2140 if (!timeout)
2141 outlen = recv(s->sock_fd, cbuf, len, flags);
2142 Py_END_ALLOW_THREADS
2143
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002144 if (timeout == 1) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002145 PyErr_SetString(socket_timeout, "timed out");
2146 return -1;
2147 }
2148 if (outlen < 0) {
2149 /* Note: the call to errorhandler() ALWAYS indirectly returned
2150 NULL, so ignore its return value */
2151 s->errorhandler();
2152 return -1;
2153 }
2154#else
2155 read_buf = cbuf;
2156 remaining = len;
2157 while (remaining != 0) {
2158 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002159 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002160
2161 segment = remaining /SEGMENT_SIZE;
2162 if (segment != 0) {
2163 segment = SEGMENT_SIZE;
2164 }
2165 else {
2166 segment = remaining;
2167 }
2168
2169 Py_BEGIN_ALLOW_THREADS
2170 timeout = internal_select(s, 0);
2171 if (!timeout)
2172 nread = recv(s->sock_fd, read_buf, segment, flags);
2173 Py_END_ALLOW_THREADS
2174
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002175 if (timeout == 1) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002176 PyErr_SetString(socket_timeout, "timed out");
2177 return -1;
2178 }
2179 if (nread < 0) {
2180 s->errorhandler();
2181 return -1;
2182 }
2183 if (nread != remaining) {
2184 read_buf += nread;
2185 break;
2186 }
2187
2188 remaining -= segment;
2189 read_buf += segment;
2190 }
2191 outlen = read_buf - cbuf;
2192#endif /* !__VMS */
2193
2194 return outlen;
2195}
2196
Guido van Rossum48a680c2001-03-02 06:34:14 +00002197
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002198/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002199
Guido van Rossum73624e91994-10-10 17:59:00 +00002200static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002201sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002202{
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002203 int recvlen, flags = 0;
2204 ssize_t outlen;
Guido van Rossum73624e91994-10-10 17:59:00 +00002205 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002206
Thomas Wouters477c8d52006-05-27 19:21:47 +00002207 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002208 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002209
Thomas Wouters477c8d52006-05-27 19:21:47 +00002210 if (recvlen < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002211 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002212 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002213 return NULL;
2214 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002215
Thomas Wouters477c8d52006-05-27 19:21:47 +00002216 /* Allocate a new string. */
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002217 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002218 if (buf == NULL)
2219 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002220
Thomas Wouters477c8d52006-05-27 19:21:47 +00002221 /* Call the guts */
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002222 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002223 if (outlen < 0) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002224 /* An error occurred, release the string and return an
Thomas Wouters477c8d52006-05-27 19:21:47 +00002225 error. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002226 Py_DECREF(buf);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002227 return NULL;
2228 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002229 if (outlen != recvlen) {
2230 /* We did not read as many bytes as we anticipated, resize the
2231 string if possible and be succesful. */
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002232 if (PyBytes_Resize(buf, outlen) < 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002233 /* Oopsy, not so succesful after all. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002234 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002235 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002236
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002237 return buf;
2238}
2239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002240PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002241"recv(buffersize[, flags]) -> data\n\
2242\n\
2243Receive up to buffersize bytes from the socket. For the optional flags\n\
2244argument, see the Unix manual. When no data is available, block until\n\
2245at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002246the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002247
Guido van Rossum30a685f1991-06-27 15:51:29 +00002248
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002249/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002250
Thomas Wouters477c8d52006-05-27 19:21:47 +00002251static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002252sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002253{
2254 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2255
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002256 int recvlen = 0, flags = 0;
2257 ssize_t readlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002258 char *buf;
2259 int buflen;
2260
2261 /* Get the buffer's memory */
Guido van Rossumd8faa362007-04-27 19:54:29 +00002262 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w#|ii:recv_into", kwlist,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002263 &buf, &buflen, &recvlen, &flags))
2264 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002265
2266 if (recvlen < 0) {
2267 PyErr_SetString(PyExc_ValueError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002268 "negative buffersize in recv_into");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002269 return NULL;
2270 }
2271 if (recvlen == 0) {
2272 /* If nbytes was not specified, use the buffer's length */
2273 recvlen = buflen;
2274 }
2275
2276 /* Check if the buffer is large enough */
2277 if (buflen < recvlen) {
2278 PyErr_SetString(PyExc_ValueError,
2279 "buffer too small for requested bytes");
2280 return NULL;
2281 }
2282
2283 /* Call the guts */
2284 readlen = sock_recv_guts(s, buf, recvlen, flags);
2285 if (readlen < 0) {
2286 /* Return an error. */
2287 return NULL;
2288 }
2289
2290 /* Return the number of bytes read. Note that we do not do anything
2291 special here in the case that readlen < recvlen. */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002292 return PyInt_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002293}
2294
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002295PyDoc_STRVAR(recv_into_doc,
2296"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002297\n\
2298A version of recv() that stores its data into a buffer rather than creating \n\
2299a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2300is not specified (or 0), receive up to the size available in the given buffer.\n\
2301\n\
2302See recv() for documentation about the flags.");
2303
2304
2305/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002306 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters477c8d52006-05-27 19:21:47 +00002307 * char buffer. If you have any inc/def ref to do to the objects that contain
2308 * the buffer, do it in the caller. This function returns the number of bytes
2309 * succesfully read. If there was an error, it returns -1. Note that it is
2310 * also possible that we return a number of bytes smaller than the request
2311 * bytes.
2312 *
2313 * 'addr' is a return value for the address object. Note that you must decref
2314 * it yourself.
2315 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002316static ssize_t
Thomas Wouters477c8d52006-05-27 19:21:47 +00002317sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
2318 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002319{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002320 sock_addr_t addrbuf;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002321 int timeout;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002322 ssize_t n = -1;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002323 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002324
Thomas Wouters477c8d52006-05-27 19:21:47 +00002325 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002326
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002327 if (!getsockaddrlen(s, &addrlen))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002328 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002329
Thomas Wouters477c8d52006-05-27 19:21:47 +00002330 if (!IS_SELECTABLE(s)) {
2331 select_error();
2332 return -1;
2333 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002334
Guido van Rossum73624e91994-10-10 17:59:00 +00002335 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002336 memset(&addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002337 timeout = internal_select(s, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002338 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002339#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002340#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002341 n = recvfrom(s->sock_fd, cbuf, len, flags,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002342 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002343#else
Thomas Wouters477c8d52006-05-27 19:21:47 +00002344 n = recvfrom(s->sock_fd, cbuf, len, flags,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002345 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002346#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002347#else
Thomas Wouters477c8d52006-05-27 19:21:47 +00002348 n = recvfrom(s->sock_fd, cbuf, len, flags,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002349 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002350#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002351 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002352 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002353
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002354 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002355 PyErr_SetString(socket_timeout, "timed out");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002356 return -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002357 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002358 if (n < 0) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002359 s->errorhandler();
2360 return -1;
Guido van Rossum7c53b771995-09-13 18:39:47 +00002361 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002362
Thomas Wouters89f507f2006-12-13 04:49:30 +00002363 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
Thomas Wouters477c8d52006-05-27 19:21:47 +00002364 addrlen, s->sock_proto)))
2365 return -1;
2366
2367 return n;
2368}
2369
2370/* s.recvfrom(nbytes [,flags]) method */
2371
2372static PyObject *
2373sock_recvfrom(PySocketSockObject *s, PyObject *args)
2374{
2375 PyObject *buf = NULL;
2376 PyObject *addr = NULL;
2377 PyObject *ret = NULL;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002378 int recvlen, flags = 0;
2379 ssize_t outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002380
2381 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002382 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002383
Guido van Rossumd8faa362007-04-27 19:54:29 +00002384 if (recvlen < 0) {
2385 PyErr_SetString(PyExc_ValueError,
2386 "negative buffersize in recvfrom");
2387 return NULL;
2388 }
2389
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002390 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002391 if (buf == NULL)
2392 return NULL;
2393
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002394 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
Thomas Wouters477c8d52006-05-27 19:21:47 +00002395 recvlen, flags, &addr);
2396 if (outlen < 0) {
Barry Warsaw752300b1997-01-03 17:18:10 +00002397 goto finally;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002398 }
2399
2400 if (outlen != recvlen) {
2401 /* We did not read as many bytes as we anticipated, resize the
2402 string if possible and be succesful. */
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002403 if (PyBytes_Resize(buf, outlen) < 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002404 /* Oopsy, not so succesful after all. */
2405 goto finally;
2406 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002407
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002408 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002409
2410finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002411 Py_XDECREF(buf);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002412 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002413 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002414}
2415
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002416PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002417"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2418\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002419Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002420
Thomas Wouters477c8d52006-05-27 19:21:47 +00002421
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002422/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002423
2424static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002425sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002426{
2427 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2428
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002429 int recvlen = 0, flags = 0;
2430 ssize_t readlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002431 char *buf;
2432 int buflen;
2433
2434 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002435
Guido van Rossumd8faa362007-04-27 19:54:29 +00002436 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w#|ii:recvfrom_into",
2437 kwlist, &buf, &buflen,
2438 &recvlen, &flags))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002439 return NULL;
2440 assert(buf != 0 && buflen > 0);
2441
2442 if (recvlen < 0) {
2443 PyErr_SetString(PyExc_ValueError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002444 "negative buffersize in recvfrom_into");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002445 return NULL;
2446 }
2447 if (recvlen == 0) {
2448 /* If nbytes was not specified, use the buffer's length */
2449 recvlen = buflen;
2450 }
2451
2452 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2453 if (readlen < 0) {
2454 /* Return an error */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002455 Py_XDECREF(addr);
2456 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002457 }
2458
2459 /* Return the number of bytes read and the address. Note that we do
2460 not do anything special here in the case that readlen < recvlen. */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002461 return Py_BuildValue("lN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002462}
2463
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002464PyDoc_STRVAR(recvfrom_into_doc,
2465"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002466\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002467Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002468
2469
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002470/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002471
Guido van Rossum73624e91994-10-10 17:59:00 +00002472static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002473sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002474{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002475 char *buf;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002476 int len, n = -1, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002477
Guido van Rossum43713e52000-02-29 13:59:29 +00002478 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002479 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002480
Neal Norwitz082b2df2006-02-07 07:04:46 +00002481 if (!IS_SELECTABLE(s))
2482 return select_error();
2483
Guido van Rossum73624e91994-10-10 17:59:00 +00002484 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002485 timeout = internal_select(s, 1);
2486 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002487#ifdef __VMS
2488 n = sendsegmented(s->sock_fd, buf, len, flags);
2489#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002490 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002491#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002492 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002493
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002494 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002495 PyErr_SetString(socket_timeout, "timed out");
2496 return NULL;
2497 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002498 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002499 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002500 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002501}
2502
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002503PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002504"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002505\n\
2506Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002507argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002508sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002509
2510
2511/* s.sendall(data [,flags]) method */
2512
2513static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002514sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002515{
2516 char *buf;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002517 int len, n = -1, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002518
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002519 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2520 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002521
Neal Norwitz082b2df2006-02-07 07:04:46 +00002522 if (!IS_SELECTABLE(s))
2523 return select_error();
2524
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002525 Py_BEGIN_ALLOW_THREADS
2526 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002527 timeout = internal_select(s, 1);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002528 n = -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002529 if (timeout)
2530 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002531#ifdef __VMS
2532 n = sendsegmented(s->sock_fd, buf, len, flags);
2533#else
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002534 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002535#endif
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002536 if (n < 0)
2537 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002538 buf += n;
2539 len -= n;
2540 } while (len > 0);
2541 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002542
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002543 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002544 PyErr_SetString(socket_timeout, "timed out");
2545 return NULL;
2546 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002547 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002548 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002549
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002550 Py_INCREF(Py_None);
2551 return Py_None;
2552}
2553
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002554PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002555"sendall(data[, flags])\n\
2556\n\
2557Send a data string to the socket. For the optional flags\n\
2558argument, see the Unix manual. This calls send() repeatedly\n\
2559until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002560to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002561
Guido van Rossum30a685f1991-06-27 15:51:29 +00002562
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002563/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002564
Guido van Rossum73624e91994-10-10 17:59:00 +00002565static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002566sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002567{
Guido van Rossum73624e91994-10-10 17:59:00 +00002568 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002569 char *buf;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002570 sock_addr_t addrbuf;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002571 int addrlen, len, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002572
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002573 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002574 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002575 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002576 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2577 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002578 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002579 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002580
Neal Norwitz082b2df2006-02-07 07:04:46 +00002581 if (!IS_SELECTABLE(s))
2582 return select_error();
2583
Thomas Wouters89f507f2006-12-13 04:49:30 +00002584 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2585 return NULL;
2586
Guido van Rossum73624e91994-10-10 17:59:00 +00002587 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002588 timeout = internal_select(s, 1);
2589 if (!timeout)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002590 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002591 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002592
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002593 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002594 PyErr_SetString(socket_timeout, "timed out");
2595 return NULL;
2596 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002597 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002598 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002599 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002600}
2601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002602PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002603"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002604\n\
2605Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002606For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002607
Guido van Rossum30a685f1991-06-27 15:51:29 +00002608
2609/* s.shutdown(how) method */
2610
Guido van Rossum73624e91994-10-10 17:59:00 +00002611static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002612sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002613{
2614 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002615 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002616
2617 how = PyInt_AsLong(arg);
2618 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002619 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002620 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002621 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002622 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002623 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002624 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002625 Py_INCREF(Py_None);
2626 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002627}
2628
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002629PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002630"shutdown(flag)\n\
2631\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002632Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2633of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002634
Guido van Rossum30a685f1991-06-27 15:51:29 +00002635
2636/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002637
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002638static PyMethodDef sock_methods[] = {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002639 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
2640 accept_doc},
2641 {"bind", (PyCFunction)sock_bind, METH_O,
2642 bind_doc},
2643 {"close", (PyCFunction)sock_close, METH_NOARGS,
2644 close_doc},
2645 {"connect", (PyCFunction)sock_connect, METH_O,
2646 connect_doc},
2647 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2648 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002649#ifndef NO_DUP
Thomas Wouters477c8d52006-05-27 19:21:47 +00002650 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
2651 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002652#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002653 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2654 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002655#ifdef HAVE_GETPEERNAME
Thomas Wouters477c8d52006-05-27 19:21:47 +00002656 {"getpeername", (PyCFunction)sock_getpeername,
2657 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002658#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002659 {"getsockname", (PyCFunction)sock_getsockname,
2660 METH_NOARGS, getsockname_doc},
2661 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2662 getsockopt_doc},
2663 {"listen", (PyCFunction)sock_listen, METH_O,
2664 listen_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +00002665 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2666 recv_doc},
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002667 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2668 recv_into_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +00002669 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2670 recvfrom_doc},
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002671 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2672 recvfrom_into_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +00002673 {"send", (PyCFunction)sock_send, METH_VARARGS,
2674 send_doc},
2675 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
2676 sendall_doc},
2677 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
2678 sendto_doc},
2679 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
2680 setblocking_doc},
2681 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
2682 settimeout_doc},
2683 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
2684 gettimeout_doc},
2685 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
2686 setsockopt_doc},
2687 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
2688 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002689 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002690};
2691
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002692/* SockObject members */
2693static PyMemberDef sock_memberlist[] = {
2694 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
2695 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
2696 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
2697 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
2698 {0},
2699};
Guido van Rossum30a685f1991-06-27 15:51:29 +00002700
Guido van Rossum73624e91994-10-10 17:59:00 +00002701/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002702 First close the file description. */
2703
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002704static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002705sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002706{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002707 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002708 (void) SOCKETCLOSE(s->sock_fd);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002709 Py_Type(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002710}
2711
Guido van Rossum30a685f1991-06-27 15:51:29 +00002712
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002713static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002714sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002715{
Fred Drakea04eaad2000-06-30 02:46:07 +00002716#if SIZEOF_SOCKET_T > SIZEOF_LONG
2717 if (s->sock_fd > LONG_MAX) {
2718 /* this can occur on Win64, and actually there is a special
2719 ugly printf formatter for decimal pointer length integer
2720 printing, only bother if necessary*/
2721 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002722 "no printf formatter to display "
2723 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002724 return NULL;
2725 }
2726#endif
Walter Dörwalda7eb93e2007-06-05 13:41:53 +00002727 return PyUnicode_FromFormat(
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002728 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002729 (long)s->sock_fd, s->sock_family,
2730 s->sock_type,
2731 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002732}
2733
2734
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002735/* Create a new, uninitialized socket object. */
2736
2737static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002738sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002739{
2740 PyObject *new;
2741
2742 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002743 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002744 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002745 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002746 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002747 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002748 return new;
2749}
2750
2751
2752/* Initialize a new socket object. */
2753
2754/*ARGSUSED*/
2755static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002756sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002757{
2758 PySocketSockObject *s = (PySocketSockObject *)self;
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002759 PyObject *fdobj = NULL;
2760 SOCKET_T fd = INVALID_SOCKET;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002761 int family = AF_INET, type = SOCK_STREAM, proto = 0;
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002762 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002763
2764 if (!PyArg_ParseTupleAndKeywords(args, kwds,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002765 "|iiiO:socket", keywords,
2766 &family, &type, &proto, &fdobj))
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002767 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002768
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002769 if (fdobj != NULL) {
2770 fd = PyLong_AsLongLong(fdobj);
2771 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
2772 return -1;
2773 if (fd == INVALID_SOCKET) {
2774 PyErr_SetString(PyExc_ValueError,
2775 "can't use invalid socket value");
2776 return -1;
2777 }
2778 }
2779 else {
2780 Py_BEGIN_ALLOW_THREADS
2781 fd = socket(family, type, proto);
2782 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002783
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002784 if (fd == INVALID_SOCKET) {
2785 set_error();
2786 return -1;
2787 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002788 }
2789 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002790
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002791 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002792
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002793}
2794
2795
Guido van Rossumb6775db1994-08-01 11:34:53 +00002796/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002797
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002798static PyTypeObject sock_type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002799 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002800 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002801 sizeof(PySocketSockObject), /* tp_basicsize */
2802 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002803 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002804 0, /* tp_print */
2805 0, /* tp_getattr */
2806 0, /* tp_setattr */
2807 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002808 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002809 0, /* tp_as_number */
2810 0, /* tp_as_sequence */
2811 0, /* tp_as_mapping */
2812 0, /* tp_hash */
2813 0, /* tp_call */
2814 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002815 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002816 0, /* tp_setattro */
2817 0, /* tp_as_buffer */
2818 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002819 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002820 0, /* tp_traverse */
2821 0, /* tp_clear */
2822 0, /* tp_richcompare */
2823 0, /* tp_weaklistoffset */
2824 0, /* tp_iter */
2825 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002826 sock_methods, /* tp_methods */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002827 sock_memberlist, /* tp_members */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002828 0, /* tp_getset */
2829 0, /* tp_base */
2830 0, /* tp_dict */
2831 0, /* tp_descr_get */
2832 0, /* tp_descr_set */
2833 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002834 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002835 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002836 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002837 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002838};
2839
Guido van Rossum30a685f1991-06-27 15:51:29 +00002840
Guido van Rossum81194471991-07-27 21:42:02 +00002841/* Python interface to gethostname(). */
2842
2843/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002844static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002845socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00002846{
2847 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002848 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00002849 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002850 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002851 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002852 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002853 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002854 buf[sizeof buf - 1] = '\0';
Guido van Rossum32c4ac02007-08-15 03:56:40 +00002855 return PyUnicode_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002856}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002857
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002858PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002859"gethostname() -> string\n\
2860\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002861Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002862
Guido van Rossumff4949e1992-08-05 19:58:53 +00002863
Guido van Rossum30a685f1991-06-27 15:51:29 +00002864/* Python interface to gethostbyname(name). */
2865
2866/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002867static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002868socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002869{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002870 char *name;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002871 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002872
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002873 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002874 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002875 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002876 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002877 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002878}
2879
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002880PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002881"gethostbyname(host) -> address\n\
2882\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002883Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002884
2885
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002886/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2887
2888static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002889gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002890{
2891 char **pch;
2892 PyObject *rtn_tuple = (PyObject *)NULL;
2893 PyObject *name_list = (PyObject *)NULL;
2894 PyObject *addr_list = (PyObject *)NULL;
2895 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002896
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002897 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002898 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002899 set_herror(h_errno);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002900 return NULL;
2901 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002902
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002903 if (h->h_addrtype != af) {
2904#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002905 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002906 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002907 (char *)strerror(EAFNOSUPPORT));
2908#else
2909 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002910 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002911 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002912#endif
2913 return NULL;
2914 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002915
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002916 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002917
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002918 case AF_INET:
2919 if (alen < sizeof(struct sockaddr_in))
2920 return NULL;
2921 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002922
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002923#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002924 case AF_INET6:
2925 if (alen < sizeof(struct sockaddr_in6))
2926 return NULL;
2927 break;
2928#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002929
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002930 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002931
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002932 if ((name_list = PyList_New(0)) == NULL)
2933 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002934
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002935 if ((addr_list = PyList_New(0)) == NULL)
2936 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002937
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002938 /* SF #1511317: h_aliases can be NULL */
2939 if (h->h_aliases) {
2940 for (pch = h->h_aliases; *pch != NULL; pch++) {
2941 int status;
Guido van Rossum32c4ac02007-08-15 03:56:40 +00002942 tmp = PyUnicode_FromString(*pch);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002943 if (tmp == NULL)
2944 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002945
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002946 status = PyList_Append(name_list, tmp);
2947 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002948
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002949 if (status)
2950 goto err;
2951 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002952 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002953
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002954 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2955 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002956
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002957 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002958
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002959 case AF_INET:
2960 {
2961 struct sockaddr_in sin;
2962 memset(&sin, 0, sizeof(sin));
2963 sin.sin_family = af;
2964#ifdef HAVE_SOCKADDR_SA_LEN
2965 sin.sin_len = sizeof(sin);
2966#endif
2967 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2968 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002969
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002970 if (pch == h->h_addr_list && alen >= sizeof(sin))
2971 memcpy((char *) addr, &sin, sizeof(sin));
2972 break;
2973 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002974
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002975#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002976 case AF_INET6:
2977 {
2978 struct sockaddr_in6 sin6;
2979 memset(&sin6, 0, sizeof(sin6));
2980 sin6.sin6_family = af;
2981#ifdef HAVE_SOCKADDR_SA_LEN
2982 sin6.sin6_len = sizeof(sin6);
2983#endif
2984 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2985 tmp = makeipaddr((struct sockaddr *)&sin6,
2986 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002987
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002988 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2989 memcpy((char *) addr, &sin6, sizeof(sin6));
2990 break;
2991 }
2992#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002993
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002994 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002995 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002996 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002997 return NULL;
2998 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002999
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003000 if (tmp == NULL)
3001 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003002
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003003 status = PyList_Append(addr_list, tmp);
3004 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003005
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003006 if (status)
3007 goto err;
3008 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003009
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003010 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003011
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003012 err:
3013 Py_XDECREF(name_list);
3014 Py_XDECREF(addr_list);
3015 return rtn_tuple;
3016}
3017
3018
3019/* Python interface to gethostbyname_ex(name). */
3020
3021/*ARGSUSED*/
3022static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003023socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003024{
3025 char *name;
3026 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00003027#ifdef ENABLE_IPV6
3028 struct sockaddr_storage addr;
3029#else
3030 struct sockaddr_in addr;
3031#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00003032 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00003033 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003034#ifdef HAVE_GETHOSTBYNAME_R
3035 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003036#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
3037 struct hostent_data data;
3038#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003039 char buf[16384];
3040 int buf_len = (sizeof buf) - 1;
3041 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003042#endif
3043#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003044 int result;
3045#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003046#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003047
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003048 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003049 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003050 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003051 return NULL;
3052 Py_BEGIN_ALLOW_THREADS
3053#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003054#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003055 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
3056 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003057#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003058 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003059#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00003060 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003061 result = gethostbyname_r(name, &hp_allocated, &data);
3062 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003063#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003064#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003065#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003066 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003067#endif
3068 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003069#endif /* HAVE_GETHOSTBYNAME_R */
3070 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003071 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003072 addr.ss_family.
3073 Therefore, we cast the sockaddr_storage into sockaddr to
3074 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00003075 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003076 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003077 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003078#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003079 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00003080#endif
3081 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003082}
3083
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003084PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003085"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
3086\n\
3087Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003088for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00003089
3090
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003091/* Python interface to gethostbyaddr(IP). */
3092
3093/*ARGSUSED*/
3094static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003095socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003096{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003097#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003098 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003099#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00003100 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003101#endif
3102 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003103 char *ip_num;
3104 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00003105 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003106#ifdef HAVE_GETHOSTBYNAME_R
3107 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003108#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
3109 struct hostent_data data;
3110#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003111 char buf[16384];
3112 int buf_len = (sizeof buf) - 1;
3113 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003114#endif
3115#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003116 int result;
3117#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003118#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003119 char *ap;
3120 int al;
3121 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003122
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003123 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003124 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003125 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00003126 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003127 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003128 af = sa->sa_family;
3129 ap = NULL;
3130 al = 0;
3131 switch (af) {
3132 case AF_INET:
3133 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3134 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3135 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003136#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003137 case AF_INET6:
3138 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3139 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3140 break;
3141#endif
3142 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003143 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003144 return NULL;
3145 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003146 Py_BEGIN_ALLOW_THREADS
3147#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003148#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003149 result = gethostbyaddr_r(ap, al, af,
3150 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003151 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003152#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003153 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003154 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003155#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00003156 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003157 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003158 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003159#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003160#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003161#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003162 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003163#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003164 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003165#endif /* HAVE_GETHOSTBYNAME_R */
3166 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003167 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003168#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003169 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003170#endif
3171 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003172}
3173
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003174PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003175"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3176\n\
3177Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003178for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003179
Guido van Rossum30a685f1991-06-27 15:51:29 +00003180
3181/* Python interface to getservbyname(name).
3182 This only returns the port number, since the other info is already
3183 known or not useful (like the list of aliases). */
3184
3185/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003186static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003187socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003188{
Barry Warsaw11b91a02004-06-28 00:50:43 +00003189 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003190 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003191 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00003192 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00003193 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00003194 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003195 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00003196 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003197 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00003198 return NULL;
3199 }
Guido van Rossum73624e91994-10-10 17:59:00 +00003200 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003201}
3202
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003203PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003204"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003205\n\
3206Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003207The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3208otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003209
Guido van Rossum30a685f1991-06-27 15:51:29 +00003210
Barry Warsaw11b91a02004-06-28 00:50:43 +00003211/* Python interface to getservbyport(port).
3212 This only returns the service name, since the other info is already
3213 known or not useful (like the list of aliases). */
3214
3215/*ARGSUSED*/
3216static PyObject *
3217socket_getservbyport(PyObject *self, PyObject *args)
3218{
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003219 unsigned short port;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003220 char *proto=NULL;
3221 struct servent *sp;
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003222 if (!PyArg_ParseTuple(args, "H|s:getservbyport", &port, &proto))
Barry Warsaw11b91a02004-06-28 00:50:43 +00003223 return NULL;
3224 Py_BEGIN_ALLOW_THREADS
3225 sp = getservbyport(htons(port), proto);
3226 Py_END_ALLOW_THREADS
3227 if (sp == NULL) {
3228 PyErr_SetString(socket_error, "port/proto not found");
3229 return NULL;
3230 }
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003231 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003232}
3233
3234PyDoc_STRVAR(getservbyport_doc,
3235"getservbyport(port[, protocolname]) -> string\n\
3236\n\
3237Return the service name from a port number and protocol name.\n\
3238The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3239otherwise any protocol will match.");
3240
Guido van Rossum3901d851996-12-19 16:35:04 +00003241/* Python interface to getprotobyname(name).
3242 This only returns the protocol number, since the other info is
3243 already known or not useful (like the list of aliases). */
3244
3245/*ARGSUSED*/
3246static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003247socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003248{
3249 char *name;
3250 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003251#ifdef __BEOS__
3252/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003253 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00003254 return NULL;
3255#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003256 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00003257 return NULL;
3258 Py_BEGIN_ALLOW_THREADS
3259 sp = getprotobyname(name);
3260 Py_END_ALLOW_THREADS
3261 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003262 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00003263 return NULL;
3264 }
3265 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003266#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003267}
3268
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003269PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003270"getprotobyname(name) -> integer\n\
3271\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003272Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003273
Guido van Rossum3901d851996-12-19 16:35:04 +00003274
Dave Cole331708b2004-08-09 04:51:41 +00003275#ifdef HAVE_SOCKETPAIR
3276/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003277 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003278 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003279
3280/*ARGSUSED*/
3281static PyObject *
3282socket_socketpair(PyObject *self, PyObject *args)
3283{
3284 PySocketSockObject *s0 = NULL, *s1 = NULL;
3285 SOCKET_T sv[2];
3286 int family, type = SOCK_STREAM, proto = 0;
3287 PyObject *res = NULL;
3288
3289#if defined(AF_UNIX)
3290 family = AF_UNIX;
3291#else
3292 family = AF_INET;
3293#endif
3294 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3295 &family, &type, &proto))
3296 return NULL;
3297 /* Create a pair of socket fds */
3298 if (socketpair(family, type, proto, sv) < 0)
3299 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003300 s0 = new_sockobject(sv[0], family, type, proto);
3301 if (s0 == NULL)
3302 goto finally;
3303 s1 = new_sockobject(sv[1], family, type, proto);
3304 if (s1 == NULL)
3305 goto finally;
3306 res = PyTuple_Pack(2, s0, s1);
3307
3308finally:
3309 if (res == NULL) {
3310 if (s0 == NULL)
3311 SOCKETCLOSE(sv[0]);
3312 if (s1 == NULL)
3313 SOCKETCLOSE(sv[1]);
3314 }
3315 Py_XDECREF(s0);
3316 Py_XDECREF(s1);
3317 return res;
3318}
3319
3320PyDoc_STRVAR(socketpair_doc,
3321"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3322\n\
3323Create a pair of socket objects from the sockets returned by the platform\n\
3324socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003325The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003326AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003327
3328#endif /* HAVE_SOCKETPAIR */
3329
3330
Guido van Rossum006bf911996-06-12 04:04:55 +00003331static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003332socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003333{
3334 int x1, x2;
3335
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003336 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003337 return NULL;
3338 }
Guido van Rossum018919a2007-01-15 00:07:32 +00003339 if (x1 < 0) {
3340 PyErr_SetString(PyExc_OverflowError,
3341 "can't convert negative number to unsigned long");
3342 return NULL;
3343 }
3344 x2 = (unsigned int)ntohs((unsigned short)x1);
Guido van Rossum006bf911996-06-12 04:04:55 +00003345 return PyInt_FromLong(x2);
3346}
3347
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003348PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003349"ntohs(integer) -> integer\n\
3350\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003351Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003352
3353
Guido van Rossum006bf911996-06-12 04:04:55 +00003354static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003355socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003356{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003357 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003358
Guido van Rossumddefaf32007-01-14 03:31:43 +00003359 if (PyLong_Check(arg)) {
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003360 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003361 if (x == (unsigned long) -1 && PyErr_Occurred())
3362 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003363#if SIZEOF_LONG > 4
3364 {
3365 unsigned long y;
3366 /* only want the trailing 32 bits */
3367 y = x & 0xFFFFFFFFUL;
3368 if (y ^ x)
3369 return PyErr_Format(PyExc_OverflowError,
3370 "long int larger than 32 bits");
3371 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003372 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003373#endif
3374 }
3375 else
Tim Peters58141872002-08-06 22:25:02 +00003376 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003377 "expected int/long, %s found",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003378 Py_Type(arg)->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003379 if (x == (unsigned long) -1 && PyErr_Occurred())
3380 return NULL;
Guido van Rossum018919a2007-01-15 00:07:32 +00003381 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003382}
3383
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003384PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003385"ntohl(integer) -> integer\n\
3386\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003387Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003388
3389
Guido van Rossum006bf911996-06-12 04:04:55 +00003390static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003391socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003392{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003393 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003394
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003395 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003396 return NULL;
3397 }
Guido van Rossum018919a2007-01-15 00:07:32 +00003398 if (x1 < 0) {
3399 PyErr_SetString(PyExc_OverflowError,
3400 "can't convert negative number to unsigned long");
3401 return NULL;
3402 }
3403 x2 = (unsigned int)htons((unsigned short)x1);
Guido van Rossum006bf911996-06-12 04:04:55 +00003404 return PyInt_FromLong(x2);
3405}
3406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003407PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003408"htons(integer) -> integer\n\
3409\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003410Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003411
3412
Guido van Rossum006bf911996-06-12 04:04:55 +00003413static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003414socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003415{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003416 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003417
Guido van Rossumddefaf32007-01-14 03:31:43 +00003418 if (PyLong_Check(arg)) {
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003419 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003420 if (x == (unsigned long) -1 && PyErr_Occurred())
3421 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003422#if SIZEOF_LONG > 4
3423 {
3424 unsigned long y;
3425 /* only want the trailing 32 bits */
3426 y = x & 0xFFFFFFFFUL;
3427 if (y ^ x)
3428 return PyErr_Format(PyExc_OverflowError,
3429 "long int larger than 32 bits");
3430 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003431 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003432#endif
3433 }
3434 else
Tim Peters58141872002-08-06 22:25:02 +00003435 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003436 "expected int/long, %s found",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003437 Py_Type(arg)->tp_name);
Guido van Rossum018919a2007-01-15 00:07:32 +00003438 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003439}
3440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003441PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003442"htonl(integer) -> integer\n\
3443\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003444Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003445
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003446/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003447
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003448PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003449"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003450\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003451Convert 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 +00003452binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003453
3454static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003455socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003456{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003457#ifndef INADDR_NONE
3458#define INADDR_NONE (-1)
3459#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003460#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003461 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003462#endif
3463
3464#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Tim Peters1df9fdd2003-02-13 03:13:40 +00003465 /* Have to use inet_addr() instead */
3466 unsigned long packed_addr;
3467#endif
3468 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003469
Tim Peters1df9fdd2003-02-13 03:13:40 +00003470 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003471 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003472
Tim Peters1df9fdd2003-02-13 03:13:40 +00003473
3474#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00003475
3476#ifdef USE_INET_ATON_WEAKLINK
3477 if (inet_aton != NULL) {
3478#endif
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003479 if (inet_aton(ip_addr, &buf))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003480 return PyBytes_FromStringAndSize((char *)(&buf),
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003481 sizeof(buf));
3482
3483 PyErr_SetString(socket_error,
3484 "illegal IP address string passed to inet_aton");
3485 return NULL;
3486
Thomas Wouters477c8d52006-05-27 19:21:47 +00003487#ifdef USE_INET_ATON_WEAKLINK
3488 } else {
3489#endif
3490
3491#endif
3492
3493#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3494
Georg Brandld2e3ba72005-08-26 08:34:00 +00003495 /* special-case this address as inet_addr might return INADDR_NONE
3496 * for this */
3497 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3498 packed_addr = 0xFFFFFFFF;
3499 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00003500
Georg Brandld2e3ba72005-08-26 08:34:00 +00003501 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003502
Georg Brandld2e3ba72005-08-26 08:34:00 +00003503 if (packed_addr == INADDR_NONE) { /* invalid address */
3504 PyErr_SetString(socket_error,
3505 "illegal IP address string passed to inet_aton");
3506 return NULL;
3507 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003508 }
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003509 return PyBytes_FromStringAndSize((char *) &packed_addr,
3510 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00003511
3512#ifdef USE_INET_ATON_WEAKLINK
3513 }
3514#endif
3515
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003516#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003517}
3518
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003519PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003520"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003521\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003522Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003523
3524static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003525socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003526{
3527 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003528 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003529 struct in_addr packed_addr;
3530
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003531 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003532 return NULL;
3533 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003534
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003535 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003536 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003537 "packed IP wrong length for inet_ntoa");
3538 return NULL;
3539 }
3540
3541 memcpy(&packed_addr, packed_str, addr_len);
3542
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003543 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003544}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003545
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003546#ifdef HAVE_INET_PTON
3547
3548PyDoc_STRVAR(inet_pton_doc,
3549"inet_pton(af, ip) -> packed IP address string\n\
3550\n\
3551Convert an IP address from string format to a packed string suitable\n\
3552for use with low-level network functions.");
3553
3554static PyObject *
3555socket_inet_pton(PyObject *self, PyObject *args)
3556{
3557 int af;
3558 char* ip;
3559 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003560#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003561 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003562#else
3563 char packed[sizeof(struct in_addr)];
3564#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003565 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3566 return NULL;
3567 }
3568
Martin v. Löwis04697e82004-06-02 12:35:29 +00003569#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003570 if(af == AF_INET6) {
3571 PyErr_SetString(socket_error,
3572 "can't use AF_INET6, IPv6 is disabled");
3573 return NULL;
3574 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003575#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003576
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003577 retval = inet_pton(af, ip, packed);
3578 if (retval < 0) {
3579 PyErr_SetFromErrno(socket_error);
3580 return NULL;
3581 } else if (retval == 0) {
3582 PyErr_SetString(socket_error,
3583 "illegal IP address string passed to inet_pton");
3584 return NULL;
3585 } else if (af == AF_INET) {
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003586 return PyBytes_FromStringAndSize(packed,
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003587 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003588#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003589 } else if (af == AF_INET6) {
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003590 return PyBytes_FromStringAndSize(packed,
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003591 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003592#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003593 } else {
3594 PyErr_SetString(socket_error, "unknown address family");
3595 return NULL;
3596 }
3597}
Thomas Wouters477c8d52006-05-27 19:21:47 +00003598
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003599PyDoc_STRVAR(inet_ntop_doc,
3600"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3601\n\
3602Convert a packed IP address of the given family to string format.");
3603
3604static PyObject *
3605socket_inet_ntop(PyObject *self, PyObject *args)
3606{
3607 int af;
3608 char* packed;
3609 int len;
3610 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003611#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003612 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003613#else
3614 char ip[INET_ADDRSTRLEN + 1];
3615#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00003616
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003617 /* Guarantee NUL-termination for PyUnicode_FromString() below */
Jeremy Hylton80961f32004-11-07 14:24:25 +00003618 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003619
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003620 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003621 return NULL;
3622 }
3623
3624 if (af == AF_INET) {
3625 if (len != sizeof(struct in_addr)) {
3626 PyErr_SetString(PyExc_ValueError,
3627 "invalid length of packed IP address string");
3628 return NULL;
3629 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003630#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003631 } else if (af == AF_INET6) {
3632 if (len != sizeof(struct in6_addr)) {
3633 PyErr_SetString(PyExc_ValueError,
3634 "invalid length of packed IP address string");
3635 return NULL;
3636 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003637#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003638 } else {
3639 PyErr_Format(PyExc_ValueError,
3640 "unknown address family %d", af);
3641 return NULL;
3642 }
3643
3644 retval = inet_ntop(af, packed, ip, sizeof(ip));
3645 if (!retval) {
3646 PyErr_SetFromErrno(socket_error);
3647 return NULL;
3648 } else {
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003649 return PyUnicode_FromString(retval);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003650 }
3651
3652 /* NOTREACHED */
3653 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3654 return NULL;
3655}
3656
3657#endif /* HAVE_INET_PTON */
3658
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003659/* Python interface to getaddrinfo(host, port). */
3660
3661/*ARGSUSED*/
3662static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003663socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003664{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003665 struct addrinfo hints, *res;
3666 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003667 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003668 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003669 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003670 char *hptr, *pptr;
3671 int family, socktype, protocol, flags;
3672 int error;
3673 PyObject *all = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003674 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003675
3676 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003677 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003678 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3679 &hobj, &pobj, &family, &socktype,
3680 &protocol, &flags)) {
3681 return NULL;
3682 }
3683 if (hobj == Py_None) {
3684 hptr = NULL;
3685 } else if (PyUnicode_Check(hobj)) {
3686 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3687 if (!idna)
3688 return NULL;
Guido van Rossumb5b22702007-05-18 18:55:53 +00003689 assert(PyBytes_Check(idna));
3690 hptr = PyBytes_AsString(idna);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003691 } else if (PyString_Check(hobj)) {
3692 hptr = PyString_AsString(hobj);
3693 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00003694 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2548c732003-04-18 10:39:54 +00003695 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003696 return NULL;
3697 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00003698 if (PyInt_CheckExact(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003699 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003700 pptr = pbuf;
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003701 } else if (PyUnicode_Check(pobj)) {
3702 pptr = PyUnicode_AsString(pobj);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003703 } else if (PyString_Check(pobj)) {
3704 pptr = PyString_AsString(pobj);
3705 } else if (pobj == Py_None) {
3706 pptr = (char *)NULL;
3707 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003708 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003709 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003710 }
3711 memset(&hints, 0, sizeof(hints));
3712 hints.ai_family = family;
3713 hints.ai_socktype = socktype;
3714 hints.ai_protocol = protocol;
3715 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003716 Py_BEGIN_ALLOW_THREADS
3717 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003718 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003719 Py_END_ALLOW_THREADS
3720 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003721 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003722 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003723 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003724 }
3725
3726 if ((all = PyList_New(0)) == NULL)
3727 goto err;
3728 for (res = res0; res; res = res->ai_next) {
Guido van Rossum9ce8e382007-08-09 21:06:37 +00003729 PyObject *single;
Guido van Rossum716aac02001-10-12 18:59:27 +00003730 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003731 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003732 if (addr == NULL)
3733 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003734 single = Py_BuildValue("iiisO", res->ai_family,
3735 res->ai_socktype, res->ai_protocol,
3736 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003737 addr);
3738 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003739 if (single == NULL)
3740 goto err;
3741
3742 if (PyList_Append(all, single))
3743 goto err;
3744 Py_XDECREF(single);
3745 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003746 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003747 if (res0)
3748 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003749 return all;
3750 err:
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003751 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003752 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003753 if (res0)
3754 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003755 return (PyObject *)NULL;
3756}
3757
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003758PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003759"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3760 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003761\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003762Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003763
3764/* Python interface to getnameinfo(sa, flags). */
3765
3766/*ARGSUSED*/
3767static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003768socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003769{
3770 PyObject *sa = (PyObject *)NULL;
3771 int flags;
3772 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003773 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003774 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3775 struct addrinfo hints, *res = NULL;
3776 int error;
3777 PyObject *ret = (PyObject *)NULL;
3778
3779 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003780 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003781 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003782 if (!PyArg_ParseTuple(sa, "si|ii",
3783 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003784 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003785 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003786 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003787 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003788 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003789 Py_BEGIN_ALLOW_THREADS
3790 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003791 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003792 Py_END_ALLOW_THREADS
3793 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003794 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003795 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003796 goto fail;
3797 }
3798 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003799 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003800 "sockaddr resolved to multiple addresses");
3801 goto fail;
3802 }
3803 switch (res->ai_family) {
3804 case AF_INET:
3805 {
3806 char *t1;
3807 int t2;
3808 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003809 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003810 "IPv4 sockaddr must be 2 tuple");
3811 goto fail;
3812 }
3813 break;
3814 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003815#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003816 case AF_INET6:
3817 {
3818 struct sockaddr_in6 *sin6;
3819 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3820 sin6->sin6_flowinfo = flowinfo;
3821 sin6->sin6_scope_id = scope_id;
3822 break;
3823 }
3824#endif
3825 }
3826 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3827 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3828 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003829 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003830 goto fail;
3831 }
3832 ret = Py_BuildValue("ss", hbuf, pbuf);
3833
3834fail:
3835 if (res)
3836 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003837 return ret;
3838}
3839
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003840PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003841"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003842\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003843Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003844
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003845
3846/* Python API to getting and setting the default timeout value. */
3847
3848static PyObject *
3849socket_getdefaulttimeout(PyObject *self)
3850{
3851 if (defaulttimeout < 0.0) {
3852 Py_INCREF(Py_None);
3853 return Py_None;
3854 }
3855 else
3856 return PyFloat_FromDouble(defaulttimeout);
3857}
3858
3859PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003860"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003861\n\
3862Returns the default timeout in floating seconds for new socket objects.\n\
3863A value of None indicates that new socket objects have no timeout.\n\
3864When the socket module is first imported, the default is None.");
3865
3866static PyObject *
3867socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3868{
3869 double timeout;
3870
3871 if (arg == Py_None)
3872 timeout = -1.0;
3873 else {
3874 timeout = PyFloat_AsDouble(arg);
3875 if (timeout < 0.0) {
3876 if (!PyErr_Occurred())
3877 PyErr_SetString(PyExc_ValueError,
3878 "Timeout value out of range");
3879 return NULL;
3880 }
3881 }
3882
3883 defaulttimeout = timeout;
3884
3885 Py_INCREF(Py_None);
3886 return Py_None;
3887}
3888
3889PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003890"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003891\n\
3892Set the default timeout in floating seconds for new socket objects.\n\
3893A value of None indicates that new socket objects have no timeout.\n\
3894When the socket module is first imported, the default is None.");
3895
3896
Guido van Rossum30a685f1991-06-27 15:51:29 +00003897/* List of functions exported by this module. */
3898
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003899static PyMethodDef socket_methods[] = {
3900 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003901 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003902 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003903 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003904 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003905 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003906 {"gethostname", socket_gethostname,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003907 METH_NOARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003908 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003909 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003910 {"getservbyport", socket_getservbyport,
3911 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003912 {"getprotobyname", socket_getprotobyname,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003913 METH_VARARGS, getprotobyname_doc},
Dave Cole331708b2004-08-09 04:51:41 +00003914#ifdef HAVE_SOCKETPAIR
3915 {"socketpair", socket_socketpair,
3916 METH_VARARGS, socketpair_doc},
3917#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003918 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003919 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003920 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003921 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003922 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003923 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003924 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003925 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003926 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003927 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003928 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003929 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003930#ifdef HAVE_INET_PTON
3931 {"inet_pton", socket_inet_pton,
3932 METH_VARARGS, inet_pton_doc},
3933 {"inet_ntop", socket_inet_ntop,
3934 METH_VARARGS, inet_ntop_doc},
3935#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003936 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003937 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003938 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003939 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003940 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003941 METH_NOARGS, getdefaulttimeout_doc},
3942 {"setdefaulttimeout", socket_setdefaulttimeout,
3943 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003944 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003945};
3946
Guido van Rossum30a685f1991-06-27 15:51:29 +00003947
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003948#ifdef MS_WINDOWS
3949#define OS_INIT_DEFINED
3950
3951/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003952
3953static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003954os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003955{
3956 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003957}
3958
3959static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003960os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003961{
3962 WSADATA WSAData;
3963 int ret;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003964 ret = WSAStartup(0x0101, &WSAData);
3965 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003966 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003967 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003968 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003969 case WSASYSNOTREADY:
3970 PyErr_SetString(PyExc_ImportError,
3971 "WSAStartup failed: network not ready");
3972 break;
3973 case WSAVERNOTSUPPORTED:
3974 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003975 PyErr_SetString(
3976 PyExc_ImportError,
3977 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003978 break;
3979 default:
Walter Dörwald0bbd8ab2007-06-05 13:49:43 +00003980 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003981 break;
3982 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003983 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003984}
3985
Guido van Rossum8d665e61996-06-26 18:22:49 +00003986#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003987
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003988
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003989#ifdef PYOS_OS2
3990#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003991
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003992/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003993
3994static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003995os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003996{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003997#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003998 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003999
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004000 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004001 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004002 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004003
Walter Dörwald0bbd8ab2007-06-05 13:49:43 +00004004 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004005
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004006 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004007#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004008 /* No need to initialise sockets with GCC/EMX */
4009 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00004010#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004011}
4012
4013#endif /* PYOS_OS2 */
4014
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004015
4016#ifndef OS_INIT_DEFINED
4017static int
4018os_init(void)
4019{
4020 return 1; /* Success */
4021}
4022#endif
4023
4024
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004025/* C API table - always add new things to the end for binary
4026 compatibility. */
4027static
4028PySocketModule_APIObject PySocketModuleAPI =
4029{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004030 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00004031 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004032};
4033
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004034
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004035/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004036
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004037 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004038 "socket.py" which implements some additional functionality.
4039 The import of "_socket" may fail with an ImportError exception if
4040 os-specific initialization fails. On Windows, this does WINSOCK
4041 initialization. When WINSOCK is initialized succesfully, a call to
4042 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004043*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004044
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004045PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00004046"Implementation module for socket operations.\n\
4047\n\
4048See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004049
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004050PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00004051init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004052{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004053 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00004054
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004055 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004056 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004057
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00004058 Py_Type(&sock_type) = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004059 m = Py_InitModule3(PySocket_MODULE_NAME,
4060 socket_methods,
4061 socket_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00004062 if (m == NULL)
4063 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004064
4065 socket_error = PyErr_NewException("socket.error", NULL, NULL);
4066 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004067 return;
Brett Cannon06c34792004-03-23 23:16:54 +00004068 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004069 Py_INCREF(socket_error);
4070 PyModule_AddObject(m, "error", socket_error);
4071 socket_herror = PyErr_NewException("socket.herror",
4072 socket_error, NULL);
4073 if (socket_herror == NULL)
4074 return;
4075 Py_INCREF(socket_herror);
4076 PyModule_AddObject(m, "herror", socket_herror);
4077 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004078 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004079 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004080 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004081 Py_INCREF(socket_gaierror);
4082 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00004083 socket_timeout = PyErr_NewException("socket.timeout",
4084 socket_error, NULL);
4085 if (socket_timeout == NULL)
4086 return;
4087 Py_INCREF(socket_timeout);
4088 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004089 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00004090 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004091 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004092 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004093 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00004094 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004095 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004096 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004097
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004098#ifdef ENABLE_IPV6
4099 has_ipv6 = Py_True;
4100#else
4101 has_ipv6 = Py_False;
4102#endif
4103 Py_INCREF(has_ipv6);
4104 PyModule_AddObject(m, "has_ipv6", has_ipv6);
4105
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004106 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00004107 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004108 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
4109 ) != 0)
4110 return;
4111
Guido van Rossum09be4091999-08-09 14:40:40 +00004112 /* Address families (we only support AF_INET and AF_UNIX) */
4113#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00004114 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004115#endif
Fred Drake4baedc12002-04-01 14:53:37 +00004116 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004117#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004118 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004119#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004120#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00004121 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004122#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004123#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004124 /* Amateur Radio AX.25 */
4125 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004126#endif
4127#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004128 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004129#endif
4130#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00004131 /* Appletalk DDP */
4132 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004133#endif
4134#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004135 /* Amateur radio NetROM */
4136 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004137#endif
4138#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00004139 /* Multiprotocol bridge */
4140 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004141#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004142#ifdef AF_ATMPVC
4143 /* ATM PVCs */
4144 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
4145#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004146#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00004147 /* Reserved for Werner's ATM */
4148 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004149#endif
4150#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00004151 /* Reserved for X.25 project */
4152 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004153#endif
4154#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004155 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004156#endif
4157#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004158 /* Amateur Radio X.25 PLP */
4159 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004160#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004161#ifdef AF_DECnet
4162 /* Reserved for DECnet project */
4163 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
4164#endif
4165#ifdef AF_NETBEUI
4166 /* Reserved for 802.2LLC project */
4167 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
4168#endif
4169#ifdef AF_SECURITY
4170 /* Security callback pseudo AF */
4171 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
4172#endif
4173#ifdef AF_KEY
4174 /* PF_KEY key management API */
4175 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
4176#endif
4177#ifdef AF_NETLINK
4178 /* */
4179 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
Martin v. Löwis11017b12006-01-14 18:12:57 +00004180 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004181#ifdef NETLINK_SKIP
Martin v. Löwis11017b12006-01-14 18:12:57 +00004182 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004183#endif
4184#ifdef NETLINK_W1
4185 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
4186#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004187 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4188 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004189#ifdef NETLINK_TCPDIAG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004190 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004191#endif
4192#ifdef NETLINK_NFLOG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004193 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004194#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004195#ifdef NETLINK_XFRM
Martin v. Löwis11017b12006-01-14 18:12:57 +00004196 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004197#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004198#ifdef NETLINK_ARPD
Martin v. Löwis11017b12006-01-14 18:12:57 +00004199 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004200#endif
4201#ifdef NETLINK_ROUTE6
Martin v. Löwis11017b12006-01-14 18:12:57 +00004202 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004203#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004204 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004205#ifdef NETLINK_DNRTMSG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004206 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004207#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004208#ifdef NETLINK_TAPBASE
Martin v. Löwis11017b12006-01-14 18:12:57 +00004209 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004210#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004211#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004212#ifdef AF_ROUTE
4213 /* Alias to emulate 4.4BSD */
4214 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
4215#endif
4216#ifdef AF_ASH
4217 /* Ash */
4218 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
4219#endif
4220#ifdef AF_ECONET
4221 /* Acorn Econet */
4222 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
4223#endif
4224#ifdef AF_ATMSVC
4225 /* ATM SVCs */
4226 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
4227#endif
4228#ifdef AF_SNA
4229 /* Linux SNA Project (nutters!) */
4230 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
4231#endif
4232#ifdef AF_IRDA
4233 /* IRDA sockets */
4234 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
4235#endif
4236#ifdef AF_PPPOX
4237 /* PPPoX sockets */
4238 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
4239#endif
4240#ifdef AF_WANPIPE
4241 /* Wanpipe API Sockets */
4242 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
4243#endif
4244#ifdef AF_LLC
4245 /* Linux LLC */
4246 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
4247#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004248
Hye-Shik Chang81268602004-02-02 06:05:24 +00004249#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00004250 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4251 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004252 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4253 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004254 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004255#if !defined(__FreeBSD__)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004256 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
4257 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
Martin v. Löwis12af0482004-01-31 12:34:17 +00004258 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004259#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004260 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004261 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4262 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004263#endif
4264
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00004265#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00004266 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
4267 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
4268 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
4269 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
4270 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
4271 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
4272 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4273 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4274 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004275#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004276
4277 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00004278 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4279 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004280#ifndef __BEOS__
4281/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004282 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4283 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004284#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004285 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004286#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004287#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004288
4289#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004290 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004291#endif
4292#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004293 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004294#endif
4295#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004296 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004297#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004298#ifdef SO_EXCLUSIVEADDRUSE
4299 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4300#endif
4301
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004302#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004303 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004304#endif
4305#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004306 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004307#endif
4308#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004309 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004310#endif
4311#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004312 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004313#endif
4314#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004315 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004316#endif
4317#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004318 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004319#endif
4320#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004321 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004322#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004323#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004324 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004325#endif
4326#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004327 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004328#endif
4329#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004330 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004331#endif
4332#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004333 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004334#endif
4335#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004336 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004337#endif
4338#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004339 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004340#endif
4341#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004342 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004343#endif
4344#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004345 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004346#endif
4347
4348 /* Maximum number of connections for "listen" */
4349#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004350 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004351#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004352 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004353#endif
4354
4355 /* Flags for send, recv */
4356#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004357 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004358#endif
4359#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004360 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004361#endif
4362#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004363 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004364#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004365#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004366 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004367#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004368#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004369 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004370#endif
4371#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004372 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004373#endif
4374#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004375 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004376#endif
4377#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004378 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004379#endif
4380#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004381 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004382#endif
4383#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004384 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004385#endif
4386
4387 /* Protocol level and numbers, usable for [gs]etsockopt */
4388#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004389 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004390#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004391#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004392 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004393#else
Fred Drake4baedc12002-04-01 14:53:37 +00004394 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004395#endif
4396#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004397 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004398#endif
4399#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004400 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004401#endif
4402#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004403 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004404#endif
4405#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004406 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004407#endif
4408#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004409 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004410#endif
4411#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004412 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004413#else
Fred Drake4baedc12002-04-01 14:53:37 +00004414 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004415#endif
4416#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004417 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004418#else
Fred Drake4baedc12002-04-01 14:53:37 +00004419 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004420#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004421#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004422 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004423#else
Fred Drake4baedc12002-04-01 14:53:37 +00004424 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004425#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004426#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004427 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004428#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004429#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004430 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004431#else
Fred Drake4baedc12002-04-01 14:53:37 +00004432 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004433#endif
4434#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004435 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004436#endif
4437#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004438 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004439#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004440#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004441 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004442#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004443#ifdef IPPROTO_IPV6
4444 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4445#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004446#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004447 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004448#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004449#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004450 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004451#else
Fred Drake4baedc12002-04-01 14:53:37 +00004452 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004453#endif
4454#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004455 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004456#endif
4457#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004458 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004459#endif
4460#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004461 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004462#else
Fred Drake4baedc12002-04-01 14:53:37 +00004463 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004464#endif
4465#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004466 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004467#endif
4468#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004469 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004470#endif
4471#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004472 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004473#endif
4474#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004475 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004476#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004477#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004478 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004479#endif
4480#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004481 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004482#endif
4483#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004484 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004485#endif
4486#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004487 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004488#endif
4489#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004490 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004491#endif
4492#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004493 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004494#endif
4495#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004496 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004497#endif
4498#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004499 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004500#endif
4501#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004502 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004503#endif
4504#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004505 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004506#endif
4507#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004508 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004509#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004510#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004511 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004512#endif
4513#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004514 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004515#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004516#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004517 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004518#endif
4519#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004520 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004521#endif
4522#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004523 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004524#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004525#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004526 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004527#endif
4528/**/
4529#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004530 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004531#else
Fred Drake4baedc12002-04-01 14:53:37 +00004532 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004533#endif
4534#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004535 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004536#endif
4537
4538 /* Some port configuration */
4539#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004540 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004541#else
Fred Drake4baedc12002-04-01 14:53:37 +00004542 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004543#endif
4544#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004545 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004546#else
Fred Drake4baedc12002-04-01 14:53:37 +00004547 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004548#endif
4549
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004550 /* Some reserved IP v.4 addresses */
4551#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004552 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004553#else
Fred Drake4baedc12002-04-01 14:53:37 +00004554 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004555#endif
4556#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004557 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004558#else
Fred Drake4baedc12002-04-01 14:53:37 +00004559 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004560#endif
4561#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004562 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004563#else
Fred Drake4baedc12002-04-01 14:53:37 +00004564 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004565#endif
4566#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004567 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004568#else
Fred Drake4baedc12002-04-01 14:53:37 +00004569 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004570#endif
4571#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004572 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4573 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004574#else
Fred Drake4baedc12002-04-01 14:53:37 +00004575 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004576#endif
4577#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004578 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4579 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004580#else
Fred Drake4baedc12002-04-01 14:53:37 +00004581 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004582#endif
4583#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004584 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004585#else
Fred Drake4baedc12002-04-01 14:53:37 +00004586 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004587#endif
4588
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004589 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004590#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004591 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004592#endif
4593#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004594 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004595#endif
4596#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004597 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004598#endif
4599#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004600 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004601#endif
4602#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004603 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004604#endif
4605#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004606 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004607#endif
4608#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004609 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004610#endif
4611#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004612 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004613#endif
4614#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004615 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004616#endif
4617#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004618 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004619#endif
4620#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004621 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004622#endif
4623#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004624 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004625#endif
4626#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004627 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004628#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004629#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004630 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4631 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004632#endif
4633#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004634 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4635 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004636#endif
4637#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004638 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004639#endif
4640
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004641 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4642#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004643 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004644#endif
4645#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004646 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004647#endif
4648#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004649 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004650#endif
4651#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004652 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004653#endif
4654#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004655 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004656#endif
4657#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004658 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004659#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004660 /* Additional IPV6 socket options, defined in RFC 3493 */
4661#ifdef IPV6_V6ONLY
4662 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4663#endif
4664 /* Advanced IPV6 socket options, from RFC 3542 */
4665#ifdef IPV6_CHECKSUM
4666 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4667#endif
4668#ifdef IPV6_DONTFRAG
4669 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4670#endif
4671#ifdef IPV6_DSTOPTS
4672 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4673#endif
4674#ifdef IPV6_HOPLIMIT
4675 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4676#endif
4677#ifdef IPV6_HOPOPTS
4678 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4679#endif
4680#ifdef IPV6_NEXTHOP
4681 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4682#endif
4683#ifdef IPV6_PATHMTU
4684 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4685#endif
4686#ifdef IPV6_PKTINFO
4687 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4688#endif
4689#ifdef IPV6_RECVDSTOPTS
4690 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4691#endif
4692#ifdef IPV6_RECVHOPLIMIT
4693 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4694#endif
4695#ifdef IPV6_RECVHOPOPTS
4696 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4697#endif
4698#ifdef IPV6_RECVPKTINFO
4699 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4700#endif
4701#ifdef IPV6_RECVRTHDR
4702 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4703#endif
4704#ifdef IPV6_RECVTCLASS
4705 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4706#endif
4707#ifdef IPV6_RTHDR
4708 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4709#endif
4710#ifdef IPV6_RTHDRDSTOPTS
4711 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4712#endif
4713#ifdef IPV6_RTHDR_TYPE_0
4714 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4715#endif
4716#ifdef IPV6_RECVPATHMTU
4717 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4718#endif
4719#ifdef IPV6_TCLASS
4720 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4721#endif
4722#ifdef IPV6_USE_MIN_MTU
4723 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4724#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004725
Guido van Rossum09be4091999-08-09 14:40:40 +00004726 /* TCP options */
4727#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004728 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004729#endif
4730#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004731 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004732#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004733#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004734 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004735#endif
4736#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004737 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004738#endif
4739#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004740 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004741#endif
4742#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004743 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004744#endif
4745#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004746 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004747#endif
4748#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004749 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004750#endif
4751#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004752 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004753#endif
4754#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004755 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004756#endif
4757#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004758 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004759#endif
4760#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004761 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004762#endif
4763
Guido van Rossum09be4091999-08-09 14:40:40 +00004764
4765 /* IPX options */
4766#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004767 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004768#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004769
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004770 /* get{addr,name}info parameters */
4771#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004772 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004773#endif
4774#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004775 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004776#endif
4777#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004778 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004779#endif
4780#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004781 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004782#endif
4783#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004784 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004785#endif
4786#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004787 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004788#endif
4789#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004790 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004791#endif
4792#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004793 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004794#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004795#ifdef EAI_OVERFLOW
4796 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4797#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004798#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004799 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004800#endif
4801#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004802 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004803#endif
4804#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004805 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004806#endif
4807#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004808 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004809#endif
4810#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004811 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004812#endif
4813#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004814 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004815#endif
4816#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004817 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004818#endif
4819#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004820 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004821#endif
4822#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004823 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004824#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004825#ifdef AI_NUMERICSERV
4826 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4827#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004828#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004829 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004830#endif
4831#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004832 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004833#endif
4834#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004835 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004836#endif
4837#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004838 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004839#endif
4840#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004841 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004842#endif
4843#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004844 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004845#endif
4846#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004847 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004848#endif
4849#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004850 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004851#endif
4852#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004853 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004854#endif
4855#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004856 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004857#endif
4858#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004859 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004860#endif
4861#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004862 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004863#endif
4864#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004865 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004866#endif
4867
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004868 /* shutdown() parameters */
4869#ifdef SHUT_RD
4870 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4871#elif defined(SD_RECEIVE)
4872 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4873#else
4874 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4875#endif
4876#ifdef SHUT_WR
4877 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4878#elif defined(SD_SEND)
4879 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4880#else
4881 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4882#endif
4883#ifdef SHUT_RDWR
4884 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4885#elif defined(SD_BOTH)
4886 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4887#else
4888 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4889#endif
4890
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004891 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004892#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4893 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004894#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004895}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004896
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004897
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004898#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004899
4900/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004901/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004902
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004903int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004904inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004905{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004906 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004907 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004908 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004909 if (packed_addr == INADDR_NONE)
4910 return 0;
4911 memcpy(dst, &packed_addr, 4);
4912 return 1;
4913 }
4914 /* Should set errno to EAFNOSUPPORT */
4915 return -1;
4916}
4917
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004918const char *
4919inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004920{
4921 if (af == AF_INET) {
4922 struct in_addr packed_addr;
4923 if (size < 16)
4924 /* Should set errno to ENOSPC. */
4925 return NULL;
4926 memcpy(&packed_addr, src, sizeof(packed_addr));
4927 return strncpy(dst, inet_ntoa(packed_addr), size);
4928 }
4929 /* Should set errno to EAFNOSUPPORT */
4930 return NULL;
4931}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004932
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004933#endif