blob: 9f312ea96577ff5f7beac8c19db3601283472489 [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\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +000092_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000093bind(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\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +000097_dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098fileno() -- 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() */
Skip Montanaroeb33e5a2007-08-17 12:57:41 +0000245# if defined(PYOS_OS2) && defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000246# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000247typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000248# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000249# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000251
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000252# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000253
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000254#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000255
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000256/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000257# ifdef HAVE_FCNTL_H
258# include <fcntl.h>
259# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000260
Jeremy Hylton22308652001-02-02 03:23:09 +0000261#endif
262
Skip Montanaro7befb992004-02-10 16:50:21 +0000263#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000264
265#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000267#endif
268
Neal Norwitz39d22e52002-11-02 19:55:21 +0000269#ifndef O_NONBLOCK
270# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000271#endif
272
Trent Micka708d6e2004-09-07 17:48:26 +0000273/* include Python's addrinfo.h unless it causes trouble */
274#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
275 /* Do not include addinfo.h on some newer IRIX versions.
276 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
277 * for example, but not by 6.5.10.
278 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000279#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000280 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
281 * EAI_* constants are defined in (the already included) ws2tcpip.h.
282 */
283#else
284# include "addrinfo.h"
285#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000286
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000287#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000288#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000289int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000290const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000291#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000292#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000293
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 Rossum39eb8fa2007-11-16 01:24:05 +0000329#ifdef MS_WINDOWS
330/* On Windows a socket is really a handle not an fd */
331static SOCKET
332dup_socket(SOCKET handle)
333{
334 HANDLE newhandle;
335
336 if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)handle,
337 GetCurrentProcess(), &newhandle,
338 0, FALSE, DUPLICATE_SAME_ACCESS))
339 {
340 WSASetLastError(GetLastError());
341 return INVALID_SOCKET;
342 }
343 return (SOCKET)newhandle;
344}
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000345#define SOCKETCLOSE closesocket
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000346#else
347/* On Unix we can use dup to duplicate the file descriptor of a socket*/
348#define dup_socket(fd) dup(fd)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000349#endif
350
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000351#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000352#define EAFNOSUPPORT WSAEAFNOSUPPORT
353#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000354#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000355
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000356#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000357#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000358#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000359#endif
360
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000361#ifndef SOCKETCLOSE
362#define SOCKETCLOSE close
363#endif
364
Hye-Shik Chang81268602004-02-02 06:05:24 +0000365#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
366#define USE_BLUETOOTH 1
367#if defined(__FreeBSD__)
368#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
369#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000370#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000371#define SOL_HCI SOL_HCI_RAW
372#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000373#define sockaddr_l2 sockaddr_l2cap
374#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000375#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000376#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
377#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000378#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000379#elif defined(__NetBSD__)
380#define sockaddr_l2 sockaddr_bt
381#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000382#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000383#define sockaddr_sco sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000384#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
385#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000386#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000387#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000388#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000389#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
390#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000391#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000392#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
393#endif
394#endif
395
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000396#ifdef __VMS
397/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
398#define SEGMENT_SIZE (32 * 1024 -1)
399#endif
400
Thomas Wouters89f507f2006-12-13 04:49:30 +0000401#define SAS2SA(x) ((struct sockaddr *)(x))
402
Martin v. Löwise9416172003-05-03 10:12:45 +0000403/*
404 * Constants for getnameinfo()
405 */
406#if !defined(NI_MAXHOST)
407#define NI_MAXHOST 1025
408#endif
409#if !defined(NI_MAXSERV)
410#define NI_MAXSERV 32
411#endif
412
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000413#ifndef INVALID_SOCKET /* MS defines this */
414#define INVALID_SOCKET (-1)
415#endif
416
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000417/* XXX There's a problem here: *static* functions are not supposed to have
418 a Py prefix (or use CapitalizedWords). Later... */
419
Guido van Rossum30a685f1991-06-27 15:51:29 +0000420/* Global variable holding the exception type for errors detected
421 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000422static PyObject *socket_error;
423static PyObject *socket_herror;
424static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000425static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000426
Tim Peters643a7fc2002-02-17 04:13:21 +0000427/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000428 The sock_type variable contains pointers to various functions,
429 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000430 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000431static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000432
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000433#if defined(HAVE_POLL_H)
434#include <poll.h>
435#elif defined(HAVE_SYS_POLL_H)
436#include <sys/poll.h>
437#endif
438
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000439#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
440/* Platform can select file descriptors beyond FD_SETSIZE */
441#define IS_SELECTABLE(s) 1
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000442#elif defined(HAVE_POLL)
443/* Instead of select(), we'll use poll() since poll() works on any fd. */
444#define IS_SELECTABLE(s) 1
445/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000446#else
447/* POSIX says selecting file descriptors beyond FD_SETSIZE
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000448 has undefined behaviour. If there's no timeout left, we don't have to
449 call select, so it's a safe, little white lie. */
450#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE || s->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000451#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000452
453static PyObject*
454select_error(void)
455{
456 PyErr_SetString(socket_error, "unable to select on socket");
457 return NULL;
458}
459
Guido van Rossum30a685f1991-06-27 15:51:29 +0000460/* Convenience function to raise an error according to errno
461 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000462
Guido van Rossum73624e91994-10-10 17:59:00 +0000463static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000464set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000465{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000466#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000467 int err_no = WSAGetLastError();
Guido van Rossum3d392eb2007-11-16 00:35:22 +0000468 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
469 recognizes the error codes used by both GetLastError() and
470 WSAGetLastError */
471 if (err_no)
472 return PyErr_SetExcFromWindowsErr(socket_error, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000473#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000474
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000475#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000476 if (sock_errno() != NO_ERROR) {
477 APIRET rc;
478 ULONG msglen;
479 char outbuf[100];
480 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000481
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000482 /* Retrieve socket-related error message from MPTN.MSG file */
483 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
484 myerrorcode - SOCBASEERR + 26,
485 "mptn.msg",
486 &msglen);
487 if (rc == NO_ERROR) {
488 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000489
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000490 /* OS/2 doesn't guarantee a terminator */
491 outbuf[msglen] = '\0';
492 if (strlen(outbuf) > 0) {
493 /* If non-empty msg, trim CRLF */
494 char *lastc = &outbuf[ strlen(outbuf)-1 ];
Neal Norwitz30b5c5d2005-12-19 06:05:18 +0000495 while (lastc > outbuf &&
496 isspace(Py_CHARMASK(*lastc))) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000497 /* Trim trailing whitespace (CRLF) */
498 *lastc-- = '\0';
499 }
500 }
501 v = Py_BuildValue("(is)", myerrorcode, outbuf);
502 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000503 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000504 Py_DECREF(v);
505 }
506 return NULL;
507 }
508 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000509#endif
510
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000511 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000512}
513
Guido van Rossum30a685f1991-06-27 15:51:29 +0000514
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000515static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000516set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000517{
518 PyObject *v;
519
520#ifdef HAVE_HSTRERROR
521 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
522#else
523 v = Py_BuildValue("(is)", h_error, "host not found");
524#endif
525 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000526 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000527 Py_DECREF(v);
528 }
529
530 return NULL;
531}
532
533
534static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000535set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000536{
537 PyObject *v;
538
Martin v. Löwis272cb402002-03-01 08:31:07 +0000539#ifdef EAI_SYSTEM
540 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000541 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000542 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000543#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000545#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000546 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000547#else
548 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
549#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000551 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552 Py_DECREF(v);
553 }
554
555 return NULL;
556}
557
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000558#ifdef __VMS
559/* Function to send in segments */
560static int
561sendsegmented(int sock_fd, char *buf, int len, int flags)
562{
563 int n = 0;
564 int remaining = len;
565
566 while (remaining > 0) {
567 unsigned int segment;
568
569 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
570 n = send(sock_fd, buf, segment, flags);
571 if (n < 0) {
572 return n;
573 }
574 remaining -= segment;
575 buf += segment;
576 } /* end while */
577
578 return len;
579}
580#endif
581
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000582/* Function to perform the setting of socket blocking mode
583 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584static int
585internal_setblocking(PySocketSockObject *s, int block)
586{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000587#ifndef MS_WINDOWS
588 int delay_flag;
589#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000590
591 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000592#ifndef MS_WINDOWS
593#if defined(PYOS_OS2) && !defined(PYCC_GCC)
594 block = !block;
595 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000596#elif defined(__VMS)
597 block = !block;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000598 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
599#else /* !PYOS_OS2 && !__VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
601 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000602 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000603 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000604 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000605 fcntl(s->sock_fd, F_SETFL, delay_flag);
606#endif /* !PYOS_OS2 */
607#else /* MS_WINDOWS */
608 block = !block;
609 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
610#endif /* MS_WINDOWS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000611 Py_END_ALLOW_THREADS
612
613 /* Since these don't return anything */
614 return 1;
615}
616
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000617/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000618 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000619 This does not raise an exception; we'll let our caller do that
620 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000621 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000622static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000623internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624{
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000625 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000626
Guido van Rossumad654902002-07-19 12:44:59 +0000627 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000628 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000629 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630
Guido van Rossumad654902002-07-19 12:44:59 +0000631 /* Guard against closed socket */
632 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000633 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000634
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000635 /* Prefer poll, if available, since you can poll() any fd
636 * which can't be done with select(). */
637#ifdef HAVE_POLL
638 {
639 struct pollfd pollfd;
640 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000641
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000642 pollfd.fd = s->sock_fd;
643 pollfd.events = writing ? POLLOUT : POLLIN;
644
645 /* s->sock_timeout is in seconds, timeout in ms */
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000646 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000647 n = poll(&pollfd, 1, timeout);
648 }
649#else
650 {
651 /* Construct the arguments to select */
652 fd_set fds;
653 struct timeval tv;
654 tv.tv_sec = (int)s->sock_timeout;
655 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
656 FD_ZERO(&fds);
657 FD_SET(s->sock_fd, &fds);
658
659 /* See if the socket is ready */
660 if (writing)
661 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
662 else
663 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
664 }
665#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000666
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000667 if (n < 0)
668 return -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000669 if (n == 0)
670 return 1;
671 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000672}
673
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000674/* Initialize a new socket object. */
675
Tim Petersa12b4cf2002-07-18 22:38:44 +0000676static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000677
Mark Hammond62b1ab12002-07-23 06:31:15 +0000678PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000679init_sockobject(PySocketSockObject *s,
680 SOCKET_T fd, int family, int type, int proto)
681{
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000682 s->sock_fd = fd;
683 s->sock_family = family;
684 s->sock_type = type;
685 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000686 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000687
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000688 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000689
690 if (defaulttimeout >= 0.0)
691 internal_setblocking(s, 0);
692
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000693}
694
695
Guido van Rossum30a685f1991-06-27 15:51:29 +0000696/* Create a new socket object.
697 This just creates the object and initializes it.
698 If the creation fails, return NULL and set an exception (implicit
699 in NEWOBJ()). */
700
Guido van Rossum73624e91994-10-10 17:59:00 +0000701static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000702new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703{
Guido van Rossum73624e91994-10-10 17:59:00 +0000704 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000705 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000706 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000707 if (s != NULL)
708 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000709 return s;
710}
711
Guido van Rossum30a685f1991-06-27 15:51:29 +0000712
Guido van Rossum48a680c2001-03-02 06:34:14 +0000713/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000714 thread to be in gethostbyname or getaddrinfo */
715#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
716PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000717#endif
718
719
Guido van Rossum30a685f1991-06-27 15:51:29 +0000720/* Convert a string specifying a host name or one of a few symbolic
721 names to a numeric IP address. This usually calls gethostbyname()
722 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000723 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000724 an error occurred; then an exception is raised. */
725
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000726static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000727setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000728{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000729 struct addrinfo hints, *res;
730 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000731 int d1, d2, d3, d4;
732 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000733
Guido van Rossuma376cc51996-12-05 23:43:35 +0000734 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000735 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000736 int siz;
737 memset(&hints, 0, sizeof(hints));
738 hints.ai_family = af;
739 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
740 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000741 Py_BEGIN_ALLOW_THREADS
742 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000743 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000744 Py_END_ALLOW_THREADS
745 /* We assume that those thread-unsafe getaddrinfo() versions
746 *are* safe regarding their return value, ie. that a
747 subsequent call to getaddrinfo() does not destroy the
748 outcome of the first call. */
749 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000750 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000751 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000752 return -1;
753 }
754 switch (res->ai_family) {
755 case AF_INET:
756 siz = 4;
757 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000758#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000759 case AF_INET6:
760 siz = 16;
761 break;
762#endif
763 default:
764 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000765 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000766 "unsupported address family");
767 return -1;
768 }
769 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000770 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000771 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000772 "wildcard resolved to multiple address");
773 return -1;
774 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000775 if (res->ai_addrlen < addr_ret_size)
776 addr_ret_size = res->ai_addrlen;
777 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000778 freeaddrinfo(res);
779 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000781 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000782 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000783 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000784 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000785 "address family mismatched");
786 return -1;
787 }
788 sin = (struct sockaddr_in *)addr_ret;
789 memset((void *) sin, '\0', sizeof(*sin));
790 sin->sin_family = AF_INET;
791#ifdef HAVE_SOCKADDR_SA_LEN
792 sin->sin_len = sizeof(*sin);
793#endif
794 sin->sin_addr.s_addr = INADDR_BROADCAST;
795 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000797 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
798 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
799 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
800 struct sockaddr_in *sin;
801 sin = (struct sockaddr_in *)addr_ret;
802 sin->sin_addr.s_addr = htonl(
803 ((long) d1 << 24) | ((long) d2 << 16) |
804 ((long) d3 << 8) | ((long) d4 << 0));
805 sin->sin_family = AF_INET;
806#ifdef HAVE_SOCKADDR_SA_LEN
807 sin->sin_len = sizeof(*sin);
808#endif
809 return 4;
810 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000811 memset(&hints, 0, sizeof(hints));
812 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000813 Py_BEGIN_ALLOW_THREADS
814 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000815 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000816#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000817 if (error == EAI_NONAME && af == AF_UNSPEC) {
818 /* On Tru64 V5.1, numeric-to-addr conversion fails
819 if no address family is given. Assume IPv4 for now.*/
820 hints.ai_family = AF_INET;
821 error = getaddrinfo(name, NULL, &hints, &res);
822 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000823#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000824 Py_END_ALLOW_THREADS
825 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000826 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000827 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000828 return -1;
829 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000830 if (res->ai_addrlen < addr_ret_size)
831 addr_ret_size = res->ai_addrlen;
832 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000833 freeaddrinfo(res);
834 switch (addr_ret->sa_family) {
835 case AF_INET:
836 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000837#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000838 case AF_INET6:
839 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000840#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000841 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000842 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000843 return -1;
844 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000845}
846
Guido van Rossum30a685f1991-06-27 15:51:29 +0000847
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848/* Create a string object representing an IP address.
849 This is always a string of the form 'dd.dd.dd.dd' (with variable
850 size numbers). */
851
Guido van Rossum73624e91994-10-10 17:59:00 +0000852static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000853makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000854{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000855 char buf[NI_MAXHOST];
856 int error;
857
858 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
859 NI_NUMERICHOST);
860 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000861 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000862 return NULL;
863 }
Guido van Rossum32c4ac02007-08-15 03:56:40 +0000864 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000865}
866
867
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000868#ifdef USE_BLUETOOTH
869/* Convert a string representation of a Bluetooth address into a numeric
870 address. Returns the length (6), or raises an exception and returns -1 if
871 an error occurred. */
872
873static int
874setbdaddr(char *name, bdaddr_t *bdaddr)
875{
876 unsigned int b0, b1, b2, b3, b4, b5;
877 char ch;
878 int n;
879
880 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
881 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
882 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
883 bdaddr->b[0] = b0;
884 bdaddr->b[1] = b1;
885 bdaddr->b[2] = b2;
886 bdaddr->b[3] = b3;
887 bdaddr->b[4] = b4;
888 bdaddr->b[5] = b5;
889 return 6;
890 } else {
891 PyErr_SetString(socket_error, "bad bluetooth address");
892 return -1;
893 }
894}
895
896/* Create a string representation of the Bluetooth address. This is always a
897 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
898 value (zero padded if necessary). */
899
900static PyObject *
901makebdaddr(bdaddr_t *bdaddr)
902{
903 char buf[(6 * 2) + 5 + 1];
904
905 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
906 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
907 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
Guido van Rossum32c4ac02007-08-15 03:56:40 +0000908 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000909}
910#endif
911
912
Guido van Rossum30a685f1991-06-27 15:51:29 +0000913/* Create an object representing the given socket address,
914 suitable for passing it back to bind(), connect() etc.
915 The family field of the sockaddr structure is inspected
916 to determine what kind of address it really is. */
917
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000918/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000919static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000920makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000921{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000922 if (addrlen == 0) {
923 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000924 Py_INCREF(Py_None);
925 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000926 }
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928 switch (addr->sa_family) {
929
930 case AF_INET:
931 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000932 struct sockaddr_in *a;
933 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000934 PyObject *ret = NULL;
935 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000936 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000937 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
938 Py_DECREF(addrobj);
939 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000940 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000941 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000942
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000943#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000944 case AF_UNIX:
945 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000947#ifdef linux
948 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
949 addrlen -= (sizeof(*a) - sizeof(a->sun_path));
Guido van Rossum32c4ac02007-08-15 03:56:40 +0000950 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000951 }
952 else
953#endif /* linux */
954 {
955 /* regular NULL-terminated string */
Guido van Rossum32c4ac02007-08-15 03:56:40 +0000956 return PyUnicode_FromString(a->sun_path);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000957 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000958 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000959#endif /* AF_UNIX */
960
Martin v. Löwis11017b12006-01-14 18:12:57 +0000961#if defined(AF_NETLINK)
962 case AF_NETLINK:
963 {
964 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
Martin v. Löwisd0560052006-01-15 07:49:20 +0000965 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +0000966 }
967#endif /* AF_NETLINK */
968
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000969#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000970 case AF_INET6:
971 {
972 struct sockaddr_in6 *a;
973 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
974 PyObject *ret = NULL;
975 if (addrobj) {
976 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000977 ret = Py_BuildValue("Oiii",
978 addrobj,
979 ntohs(a->sin6_port),
980 a->sin6_flowinfo,
981 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000982 Py_DECREF(addrobj);
983 }
984 return ret;
985 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000986#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000987
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000988#ifdef USE_BLUETOOTH
989 case AF_BLUETOOTH:
990 switch (proto) {
991
992 case BTPROTO_L2CAP:
993 {
994 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
995 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
996 PyObject *ret = NULL;
997 if (addrobj) {
998 ret = Py_BuildValue("Oi",
999 addrobj,
1000 _BT_L2_MEMB(a, psm));
1001 Py_DECREF(addrobj);
1002 }
1003 return ret;
1004 }
1005
1006 case BTPROTO_RFCOMM:
1007 {
1008 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1009 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1010 PyObject *ret = NULL;
1011 if (addrobj) {
1012 ret = Py_BuildValue("Oi",
1013 addrobj,
1014 _BT_RC_MEMB(a, channel));
1015 Py_DECREF(addrobj);
1016 }
1017 return ret;
1018 }
1019
Thomas Wouterscf297e42007-02-23 15:07:44 +00001020 case BTPROTO_HCI:
1021 {
1022 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
1023 PyObject *ret = NULL;
1024 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1025 return ret;
1026 }
1027
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001028#if !defined(__FreeBSD__)
1029 case BTPROTO_SCO:
1030 {
1031 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1032 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1033 }
1034#endif
1035
1036 }
1037#endif
1038
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001039#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001040 case AF_PACKET:
1041 {
1042 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1043 char *ifname = "";
1044 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001045 /* need to look up interface name give index */
1046 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001047 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001048 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001049 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001050 }
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001051 return Py_BuildValue("shbhy#",
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001052 ifname,
1053 ntohs(a->sll_protocol),
1054 a->sll_pkttype,
1055 a->sll_hatype,
1056 a->sll_addr,
1057 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001058 }
1059#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001060
Guido van Rossum30a685f1991-06-27 15:51:29 +00001061 /* More cases here... */
1062
1063 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001064 /* If we don't know the address family, don't raise an
Guido van Rossum9ce8e382007-08-09 21:06:37 +00001065 exception -- return it as an (int, bytes) tuple. */
1066 return Py_BuildValue("iy#",
Guido van Rossumaa948df1997-05-07 17:41:48 +00001067 addr->sa_family,
1068 addr->sa_data,
1069 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001070
Guido van Rossum30a685f1991-06-27 15:51:29 +00001071 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001072}
1073
Guido van Rossum30a685f1991-06-27 15:51:29 +00001074
1075/* Parse a socket address argument according to the socket object's
1076 address family. Return 1 if the address was in the proper format,
1077 0 of not. The address is returned through addr_ret, its length
1078 through len_ret. */
1079
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001080static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001081getsockaddrarg(PySocketSockObject *s, PyObject *args,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001082 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001083{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001084 switch (s->sock_family) {
1085
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001086#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001087 case AF_UNIX:
1088 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001089 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001090 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001091 int len;
Guido van Rossume22905a2007-08-27 23:09:25 +00001092 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001093 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001094
1095 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001096#ifdef linux
1097 if (len > 0 && path[0] == 0) {
1098 /* Linux abstract namespace extension */
1099 if (len > sizeof addr->sun_path) {
1100 PyErr_SetString(socket_error,
1101 "AF_UNIX path too long");
1102 return 0;
1103 }
1104 }
1105 else
1106#endif /* linux */
1107 {
1108 /* regular NULL-terminated string */
1109 if (len >= sizeof addr->sun_path) {
1110 PyErr_SetString(socket_error,
1111 "AF_UNIX path too long");
1112 return 0;
1113 }
1114 addr->sun_path[len] = 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001115 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001116 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001117 memcpy(addr->sun_path, path, len);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001118#if defined(PYOS_OS2)
1119 *len_ret = sizeof(*addr);
1120#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001121 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001122#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001123 return 1;
1124 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001125#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001126
Martin v. Löwis11017b12006-01-14 18:12:57 +00001127#if defined(AF_NETLINK)
1128 case AF_NETLINK:
1129 {
1130 struct sockaddr_nl* addr;
1131 int pid, groups;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001132 addr = (struct sockaddr_nl *)addr_ret;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001133 if (!PyTuple_Check(args)) {
1134 PyErr_Format(
1135 PyExc_TypeError,
1136 "getsockaddrarg: "
1137 "AF_NETLINK address must be tuple, not %.500s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001138 Py_Type(args)->tp_name);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001139 return 0;
1140 }
1141 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1142 return 0;
1143 addr->nl_family = AF_NETLINK;
1144 addr->nl_pid = pid;
1145 addr->nl_groups = groups;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001146 *len_ret = sizeof(*addr);
1147 return 1;
1148 }
1149#endif
1150
Guido van Rossum30a685f1991-06-27 15:51:29 +00001151 case AF_INET:
1152 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001153 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001154 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001155 int port, result;
Guido van Rossume4dad902000-12-01 13:13:11 +00001156 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001157 PyErr_Format(
1158 PyExc_TypeError,
1159 "getsockaddrarg: "
1160 "AF_INET address must be tuple, not %.500s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001161 Py_Type(args)->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001162 return 0;
1163 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00001164 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
Martin v. Löwis2548c732003-04-18 10:39:54 +00001165 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001166 return 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001167 addr=(struct sockaddr_in*)addr_ret;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001168 result = setipaddr(host, (struct sockaddr *)addr,
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001169 sizeof(*addr), AF_INET);
1170 PyMem_Free(host);
1171 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001172 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001173 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001174 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001175 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001176 return 1;
1177 }
1178
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001179#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001180 case AF_INET6:
1181 {
1182 struct sockaddr_in6* addr;
1183 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001184 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001185 flowinfo = scope_id = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001186 if (!PyTuple_Check(args)) {
1187 PyErr_Format(
1188 PyExc_TypeError,
1189 "getsockaddrarg: "
1190 "AF_INET6 address must be tuple, not %.500s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001191 Py_Type(args)->tp_name);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001192 return 0;
1193 }
1194 if (!PyArg_ParseTuple(args, "eti|ii",
Martin v. Löwis2548c732003-04-18 10:39:54 +00001195 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001196 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001197 return 0;
1198 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001199 addr = (struct sockaddr_in6*)addr_ret;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001200 result = setipaddr(host, (struct sockaddr *)addr,
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001201 sizeof(*addr), AF_INET6);
1202 PyMem_Free(host);
1203 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001204 return 0;
1205 addr->sin6_family = s->sock_family;
1206 addr->sin6_port = htons((short)port);
1207 addr->sin6_flowinfo = flowinfo;
1208 addr->sin6_scope_id = scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001209 *len_ret = sizeof *addr;
1210 return 1;
1211 }
1212#endif
1213
Hye-Shik Chang81268602004-02-02 06:05:24 +00001214#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001215 case AF_BLUETOOTH:
1216 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001217 switch (s->sock_proto) {
1218 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001219 {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001220 struct sockaddr_l2 *addr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001221 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001222
Thomas Wouters89f507f2006-12-13 04:49:30 +00001223 addr = (struct sockaddr_l2 *)addr_ret;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001224 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1225 if (!PyArg_ParseTuple(args, "si", &straddr,
1226 &_BT_L2_MEMB(addr, psm))) {
1227 PyErr_SetString(socket_error, "getsockaddrarg: "
1228 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001229 return 0;
1230 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001231 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1232 return 0;
1233
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001234 *len_ret = sizeof *addr;
1235 return 1;
1236 }
1237 case BTPROTO_RFCOMM:
1238 {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001239 struct sockaddr_rc *addr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001240 char *straddr;
1241
Thomas Wouters89f507f2006-12-13 04:49:30 +00001242 addr = (struct sockaddr_rc *)addr_ret;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001243 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1244 if (!PyArg_ParseTuple(args, "si", &straddr,
1245 &_BT_RC_MEMB(addr, channel))) {
1246 PyErr_SetString(socket_error, "getsockaddrarg: "
1247 "wrong format");
1248 return 0;
1249 }
1250 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1251 return 0;
1252
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001253 *len_ret = sizeof *addr;
1254 return 1;
1255 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001256 case BTPROTO_HCI:
1257 {
1258 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
1259 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1260 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
1261 PyErr_SetString(socket_error, "getsockaddrarg: "
1262 "wrong format");
1263 return 0;
1264 }
1265 *len_ret = sizeof *addr;
1266 return 1;
1267 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001268#if !defined(__FreeBSD__)
1269 case BTPROTO_SCO:
1270 {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001271 struct sockaddr_sco *addr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001272 char *straddr;
1273
Thomas Wouters89f507f2006-12-13 04:49:30 +00001274 addr = (struct sockaddr_sco *)addr_ret;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001275 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001276 if (!PyBytes_Check(args)) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001277 PyErr_SetString(socket_error, "getsockaddrarg: "
1278 "wrong format");
1279 return 0;
1280 }
Guido van Rossum32c4ac02007-08-15 03:56:40 +00001281 straddr = PyBytes_AS_STRING(args);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001282 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1283 return 0;
1284
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001285 *len_ret = sizeof *addr;
1286 return 1;
1287 }
1288#endif
1289 default:
1290 PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");
1291 return 0;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001292 }
1293 }
1294#endif
1295
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001296#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001297 case AF_PACKET:
1298 {
1299 struct sockaddr_ll* addr;
1300 struct ifreq ifr;
1301 char *interfaceName;
1302 int protoNumber;
1303 int hatype = 0;
1304 int pkttype = 0;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001305 char *haddr = NULL;
1306 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001307
Thomas Wouters477c8d52006-05-27 19:21:47 +00001308 if (!PyTuple_Check(args)) {
1309 PyErr_Format(
1310 PyExc_TypeError,
1311 "getsockaddrarg: "
1312 "AF_PACKET address must be tuple, not %.500s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001313 Py_Type(args)->tp_name);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001314 return 0;
1315 }
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001316 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1317 &protoNumber, &pkttype, &hatype,
1318 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001319 return 0;
1320 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1321 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001322 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001323 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001324 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001325 }
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001326 if (halen > 8) {
1327 PyErr_SetString(PyExc_ValueError,
1328 "Hardware address must be 8 bytes or less");
1329 return 0;
1330 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00001331 addr = (struct sockaddr_ll*)addr_ret;
1332 addr->sll_family = AF_PACKET;
1333 addr->sll_protocol = htons((short)protoNumber);
1334 addr->sll_ifindex = ifr.ifr_ifindex;
1335 addr->sll_pkttype = pkttype;
1336 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001337 if (halen != 0) {
1338 memcpy(&addr->sll_addr, haddr, halen);
1339 }
1340 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001341 *len_ret = sizeof *addr;
1342 return 1;
1343 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001344#endif
1345
Guido van Rossum30a685f1991-06-27 15:51:29 +00001346 /* More cases here... */
1347
1348 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001349 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001350 return 0;
1351
1352 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001353}
1354
Guido van Rossum30a685f1991-06-27 15:51:29 +00001355
Guido van Rossum48a680c2001-03-02 06:34:14 +00001356/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001357 Return 1 if the family is known, 0 otherwise. The length is returned
1358 through len_ret. */
1359
1360static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001361getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001362{
1363 switch (s->sock_family) {
1364
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001365#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001366 case AF_UNIX:
1367 {
1368 *len_ret = sizeof (struct sockaddr_un);
1369 return 1;
1370 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001371#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001372#if defined(AF_NETLINK)
1373 case AF_NETLINK:
1374 {
1375 *len_ret = sizeof (struct sockaddr_nl);
1376 return 1;
1377 }
1378#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001379
1380 case AF_INET:
1381 {
1382 *len_ret = sizeof (struct sockaddr_in);
1383 return 1;
1384 }
1385
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001386#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001387 case AF_INET6:
1388 {
1389 *len_ret = sizeof (struct sockaddr_in6);
1390 return 1;
1391 }
1392#endif
1393
Hye-Shik Chang81268602004-02-02 06:05:24 +00001394#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001395 case AF_BLUETOOTH:
1396 {
1397 switch(s->sock_proto)
1398 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001399
1400 case BTPROTO_L2CAP:
1401 *len_ret = sizeof (struct sockaddr_l2);
1402 return 1;
1403 case BTPROTO_RFCOMM:
1404 *len_ret = sizeof (struct sockaddr_rc);
1405 return 1;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001406 case BTPROTO_HCI:
1407 *len_ret = sizeof (struct sockaddr_hci);
1408 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001409#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001410 case BTPROTO_SCO:
1411 *len_ret = sizeof (struct sockaddr_sco);
1412 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001413#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001414 default:
1415 PyErr_SetString(socket_error, "getsockaddrlen: "
1416 "unknown BT protocol");
1417 return 0;
1418
Martin v. Löwis12af0482004-01-31 12:34:17 +00001419 }
1420 }
1421#endif
1422
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001423#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001424 case AF_PACKET:
1425 {
1426 *len_ret = sizeof (struct sockaddr_ll);
1427 return 1;
1428 }
1429#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001430
Guido van Rossum710e1df1992-06-12 10:39:36 +00001431 /* More cases here... */
1432
1433 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001434 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001435 return 0;
1436
1437 }
1438}
1439
1440
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001441/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001442
Guido van Rossum73624e91994-10-10 17:59:00 +00001443static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001444sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001445{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001446 sock_addr_t addrbuf;
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001447 SOCKET_T newfd = INVALID_SOCKET;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001448 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001449 PyObject *sock = NULL;
1450 PyObject *addr = NULL;
1451 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001452 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001453
Guido van Rossum710e1df1992-06-12 10:39:36 +00001454 if (!getsockaddrlen(s, &addrlen))
1455 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001456 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001457
Neal Norwitz082b2df2006-02-07 07:04:46 +00001458 if (!IS_SELECTABLE(s))
1459 return select_error();
1460
Guido van Rossum73624e91994-10-10 17:59:00 +00001461 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001462 timeout = internal_select(s, 0);
1463 if (!timeout)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001464 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001465 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001466
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001467 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001468 PyErr_SetString(socket_timeout, "timed out");
1469 return NULL;
1470 }
1471
Fred Drakea04eaad2000-06-30 02:46:07 +00001472 if (newfd == INVALID_SOCKET)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001473 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001474
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001475 sock = PyLong_FromSocket_t(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001476 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001477 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001478 goto finally;
1479 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001480
Thomas Wouters89f507f2006-12-13 04:49:30 +00001481 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001482 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001483 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001484 goto finally;
1485
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001486 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001487
Guido van Rossum67f7a382002-06-06 21:08:16 +00001488finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001489 Py_XDECREF(sock);
1490 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001491 return res;
1492}
1493
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001494PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001495"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001496\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001497Wait for an incoming connection. Return a new socket file descriptor\n\
1498representing the connection, and the address of the client.\n\
1499For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001500
Guido van Rossum11ba0942002-06-13 15:07:44 +00001501/* s.setblocking(flag) method. Argument:
1502 False -- non-blocking mode; same as settimeout(0)
1503 True -- blocking mode; same as settimeout(None)
1504*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001505
Guido van Rossum73624e91994-10-10 17:59:00 +00001506static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001507sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001508{
1509 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001510
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001511 block = PyInt_AsLong(arg);
1512 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001513 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001514
Guido van Rossum11ba0942002-06-13 15:07:44 +00001515 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001516 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001517
Guido van Rossum73624e91994-10-10 17:59:00 +00001518 Py_INCREF(Py_None);
1519 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001520}
Guido van Rossume4485b01994-09-07 14:32:49 +00001521
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001522PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001523"setblocking(flag)\n\
1524\n\
1525Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001526setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001527setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001528
Guido van Rossum11ba0942002-06-13 15:07:44 +00001529/* s.settimeout(timeout) method. Argument:
1530 None -- no timeout, blocking mode; same as setblocking(True)
1531 0.0 -- non-blocking mode; same as setblocking(False)
1532 > 0 -- timeout mode; operations time out after timeout seconds
1533 < 0 -- illegal; raises an exception
1534*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001535static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001536sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001537{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001538 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001539
1540 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001541 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001542 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001543 timeout = PyFloat_AsDouble(arg);
1544 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001545 if (!PyErr_Occurred())
1546 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001547 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001548 return NULL;
1549 }
1550 }
1551
Guido van Rossum11ba0942002-06-13 15:07:44 +00001552 s->sock_timeout = timeout;
1553 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001554
1555 Py_INCREF(Py_None);
1556 return Py_None;
1557}
1558
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001559PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001560"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001561\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001562Set a timeout on socket operations. 'timeout' can be a float,\n\
1563giving in seconds, or None. Setting a timeout of None disables\n\
1564the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001565Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001566
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001567/* s.gettimeout() method.
1568 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001569static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001570sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001571{
1572 if (s->sock_timeout < 0.0) {
1573 Py_INCREF(Py_None);
1574 return Py_None;
1575 }
1576 else
1577 return PyFloat_FromDouble(s->sock_timeout);
1578}
1579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001580PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001581"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001582\n\
1583Returns the timeout in floating seconds associated with socket \n\
1584operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001585operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001586
Guido van Rossumaee08791992-09-08 09:05:33 +00001587/* s.setsockopt() method.
1588 With an integer third argument, sets an integer option.
1589 With a string third argument, sets an option from a buffer;
1590 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001591
Guido van Rossum73624e91994-10-10 17:59:00 +00001592static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001593sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001594{
1595 int level;
1596 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001597 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001598 char *buf;
1599 int buflen;
1600 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001601
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001602 if (PyArg_ParseTuple(args, "iii:setsockopt",
1603 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001604 buf = (char *) &flag;
1605 buflen = sizeof flag;
1606 }
1607 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001608 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001609 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1610 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001611 return NULL;
1612 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001613 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001614 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001615 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001616 Py_INCREF(Py_None);
1617 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001618}
1619
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001620PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001621"setsockopt(level, option, value)\n\
1622\n\
1623Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001624The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001625
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001626
Guido van Rossumaee08791992-09-08 09:05:33 +00001627/* s.getsockopt() method.
1628 With two arguments, retrieves an integer option.
1629 With a third integer argument, retrieves a string buffer of that size;
1630 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001631
Guido van Rossum73624e91994-10-10 17:59:00 +00001632static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001633sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001634{
1635 int level;
1636 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001637 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001638 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001639 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001640
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001641 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1642 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001643 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001644
Guido van Rossumbe32c891996-06-20 16:25:29 +00001645 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001646 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001647 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001648 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001649 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001650 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001651 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001652 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001653 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001654#ifdef __VMS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001655 /* socklen_t is unsigned so no negative test is needed,
1656 test buflen == 0 is previously done */
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001657 if (buflen > 1024) {
1658#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001659 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001660#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001661 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001662 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001663 return NULL;
1664 }
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001665 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001666 if (buf == NULL)
1667 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001668 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001669 (void *)PyBytes_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001670 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001671 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001672 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001673 }
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001674 if (PyBytes_Resize(buf, buflen) < 0) {
1675 Py_DECREF(buf);
1676 return NULL;
1677 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001678 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001679}
1680
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001681PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001682"getsockopt(level, option[, buffersize]) -> value\n\
1683\n\
1684Get a socket option. See the Unix manual for level and option.\n\
1685If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001686string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001687
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001688
Fred Drake728819a2000-07-01 03:40:12 +00001689/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001690
Guido van Rossum73624e91994-10-10 17:59:00 +00001691static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001692sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001693{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001694 sock_addr_t addrbuf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001695 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001696 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001697
Thomas Wouters89f507f2006-12-13 04:49:30 +00001698 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001699 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001700 Py_BEGIN_ALLOW_THREADS
Thomas Wouters89f507f2006-12-13 04:49:30 +00001701 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001702 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001703 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001704 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001705 Py_INCREF(Py_None);
1706 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001707}
1708
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001709PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001710"bind(address)\n\
1711\n\
1712Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001713pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001714sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001715
Guido van Rossum30a685f1991-06-27 15:51:29 +00001716
1717/* s.close() method.
1718 Set the file descriptor to -1 so operations tried subsequently
1719 will surely fail. */
1720
Guido van Rossum73624e91994-10-10 17:59:00 +00001721static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001722sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001723{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001724 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001725
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001726 if ((fd = s->sock_fd) != -1) {
1727 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001728 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001729 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001730 Py_END_ALLOW_THREADS
1731 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001732 Py_INCREF(Py_None);
1733 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001734}
1735
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001736PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001737"close()\n\
1738\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001739Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001740
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001741static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001742internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1743 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001744{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001745 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001746
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001747 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001748 res = connect(s->sock_fd, addr, addrlen);
1749
1750#ifdef MS_WINDOWS
1751
1752 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001753 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1754 IS_SELECTABLE(s)) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001755 /* This is a mess. Best solution: trust select */
1756 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001757 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001758 struct timeval tv;
1759 tv.tv_sec = (int)s->sock_timeout;
1760 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1761 FD_ZERO(&fds);
1762 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001763 FD_ZERO(&fds_exc);
1764 FD_SET(s->sock_fd, &fds_exc);
1765 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001766 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001767 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001768 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001769 } else if (res > 0) {
1770 if (FD_ISSET(s->sock_fd, &fds))
Sean Reifscheider54cf12b2007-09-17 17:55:36 +00001771 /* The socket is in the writable set - this
Mark Hammonda57ec932004-08-03 05:06:26 +00001772 means connected */
1773 res = 0;
1774 else {
1775 /* As per MS docs, we need to call getsockopt()
1776 to get the underlying error */
1777 int res_size = sizeof res;
1778 /* It must be in the exception set */
1779 assert(FD_ISSET(s->sock_fd, &fds_exc));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001780 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
Mark Hammonda57ec932004-08-03 05:06:26 +00001781 (char *)&res, &res_size))
1782 /* getsockopt also clears WSAGetLastError,
1783 so reset it back. */
1784 WSASetLastError(res);
1785 else
1786 res = WSAGetLastError();
1787 }
1788 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001789 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001790 }
1791 }
1792
1793 if (res < 0)
1794 res = WSAGetLastError();
1795
1796#else
1797
1798 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001799 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001800 timeout = internal_select(s, 1);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001801 if (timeout == 0) {
1802 res = connect(s->sock_fd, addr, addrlen);
1803 if (res < 0 && errno == EISCONN)
1804 res = 0;
1805 }
1806 else if (timeout == -1)
1807 res = errno; /* had error */
1808 else
1809 res = EWOULDBLOCK; /* timed out */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001810 }
1811 }
1812
1813 if (res < 0)
1814 res = errno;
1815
1816#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001817 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001818
1819 return res;
1820}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001821
Fred Drake728819a2000-07-01 03:40:12 +00001822/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001823
Guido van Rossum73624e91994-10-10 17:59:00 +00001824static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001825sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001826{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001827 sock_addr_t addrbuf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001828 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001829 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001830 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001831
Thomas Wouters89f507f2006-12-13 04:49:30 +00001832 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001833 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001834
Guido van Rossum73624e91994-10-10 17:59:00 +00001835 Py_BEGIN_ALLOW_THREADS
Thomas Wouters89f507f2006-12-13 04:49:30 +00001836 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001837 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001838
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001839 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001840 PyErr_SetString(socket_timeout, "timed out");
1841 return NULL;
1842 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001843 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001844 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001845 Py_INCREF(Py_None);
1846 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001847}
1848
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001849PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001850"connect(address)\n\
1851\n\
1852Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001853is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001854
Guido van Rossum30a685f1991-06-27 15:51:29 +00001855
Fred Drake728819a2000-07-01 03:40:12 +00001856/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001857
1858static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001859sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001860{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001861 sock_addr_t addrbuf;
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001862 int addrlen;
1863 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001864 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001865
Thomas Wouters89f507f2006-12-13 04:49:30 +00001866 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001867 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001868
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001869 Py_BEGIN_ALLOW_THREADS
Thomas Wouters89f507f2006-12-13 04:49:30 +00001870 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001871 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001872
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001873 /* Signals are not errors (though they may raise exceptions). Adapted
1874 from PyErr_SetFromErrnoWithFilenameObject(). */
1875#ifdef EINTR
1876 if (res == EINTR && PyErr_CheckSignals())
1877 return NULL;
1878#endif
1879
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001880 return PyInt_FromLong((long) res);
1881}
1882
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001883PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001884"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001885\n\
1886This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001887instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001888
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001889
Guido van Rossumed233a51992-06-23 09:07:03 +00001890/* s.fileno() method */
1891
Guido van Rossum73624e91994-10-10 17:59:00 +00001892static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001893sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001894{
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001895 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00001896}
1897
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001898PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001899"fileno() -> integer\n\
1900\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001901Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001902
Guido van Rossumed233a51992-06-23 09:07:03 +00001903
Guido van Rossumc89705d1992-11-26 08:54:07 +00001904/* s.getsockname() method */
1905
Guido van Rossum73624e91994-10-10 17:59:00 +00001906static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001907sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001908{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001909 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001910 int res;
1911 socklen_t addrlen;
1912
Guido van Rossumc89705d1992-11-26 08:54:07 +00001913 if (!getsockaddrlen(s, &addrlen))
1914 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001915 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001916 Py_BEGIN_ALLOW_THREADS
Thomas Wouters89f507f2006-12-13 04:49:30 +00001917 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001918 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001919 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001920 return s->errorhandler();
Thomas Wouters89f507f2006-12-13 04:49:30 +00001921 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001922 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001923}
1924
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001925PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001926"getsockname() -> address info\n\
1927\n\
1928Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001929info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001930
Guido van Rossumc89705d1992-11-26 08:54:07 +00001931
Guido van Rossumb6775db1994-08-01 11:34:53 +00001932#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001933/* s.getpeername() method */
1934
Guido van Rossum73624e91994-10-10 17:59:00 +00001935static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001936sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001937{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001938 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001939 int res;
1940 socklen_t addrlen;
1941
Guido van Rossumc89705d1992-11-26 08:54:07 +00001942 if (!getsockaddrlen(s, &addrlen))
1943 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001944 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001945 Py_BEGIN_ALLOW_THREADS
Thomas Wouters89f507f2006-12-13 04:49:30 +00001946 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001947 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001948 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001949 return s->errorhandler();
Thomas Wouters89f507f2006-12-13 04:49:30 +00001950 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001951 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001952}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001954PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001955"getpeername() -> address info\n\
1956\n\
1957Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001958info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001959
Guido van Rossumb6775db1994-08-01 11:34:53 +00001960#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001961
1962
Guido van Rossum30a685f1991-06-27 15:51:29 +00001963/* s.listen(n) method */
1964
Guido van Rossum73624e91994-10-10 17:59:00 +00001965static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001966sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001967{
1968 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001969 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001970
1971 backlog = PyInt_AsLong(arg);
1972 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001973 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001974 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001975 if (backlog < 1)
1976 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001977 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001978 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001979 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001980 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001981 Py_INCREF(Py_None);
1982 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001983}
1984
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001985PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001986"listen(backlog)\n\
1987\n\
1988Enable a server to accept connections. The backlog argument must be at\n\
1989least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001990will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001991
1992
Thomas Wouters477c8d52006-05-27 19:21:47 +00001993/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001994 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001995 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00001996 * the buffer, do it in the caller. This function returns the number of bytes
1997 * succesfully read. If there was an error, it returns -1. Note that it is
1998 * also possible that we return a number of bytes smaller than the request
1999 * bytes.
2000 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002001static ssize_t
Thomas Wouters477c8d52006-05-27 19:21:47 +00002002sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)
2003{
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002004 ssize_t outlen = -1;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002005 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002006#ifdef __VMS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002007 int remaining;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002008 char *read_buf;
2009#endif
2010
2011 if (!IS_SELECTABLE(s)) {
2012 select_error();
2013 return -1;
2014 }
Guido van Rossumc2de7c02007-08-03 22:27:51 +00002015 if (len == 0) {
2016 /* If 0 bytes were requested, do nothing. */
2017 return 0;
2018 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002019
2020#ifndef __VMS
2021 Py_BEGIN_ALLOW_THREADS
2022 timeout = internal_select(s, 0);
2023 if (!timeout)
2024 outlen = recv(s->sock_fd, cbuf, len, flags);
2025 Py_END_ALLOW_THREADS
2026
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002027 if (timeout == 1) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002028 PyErr_SetString(socket_timeout, "timed out");
2029 return -1;
2030 }
2031 if (outlen < 0) {
2032 /* Note: the call to errorhandler() ALWAYS indirectly returned
2033 NULL, so ignore its return value */
2034 s->errorhandler();
2035 return -1;
2036 }
2037#else
2038 read_buf = cbuf;
2039 remaining = len;
2040 while (remaining != 0) {
2041 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002042 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002043
2044 segment = remaining /SEGMENT_SIZE;
2045 if (segment != 0) {
2046 segment = SEGMENT_SIZE;
2047 }
2048 else {
2049 segment = remaining;
2050 }
2051
2052 Py_BEGIN_ALLOW_THREADS
2053 timeout = internal_select(s, 0);
2054 if (!timeout)
2055 nread = recv(s->sock_fd, read_buf, segment, flags);
2056 Py_END_ALLOW_THREADS
2057
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002058 if (timeout == 1) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002059 PyErr_SetString(socket_timeout, "timed out");
2060 return -1;
2061 }
2062 if (nread < 0) {
2063 s->errorhandler();
2064 return -1;
2065 }
2066 if (nread != remaining) {
2067 read_buf += nread;
2068 break;
2069 }
2070
2071 remaining -= segment;
2072 read_buf += segment;
2073 }
2074 outlen = read_buf - cbuf;
2075#endif /* !__VMS */
2076
2077 return outlen;
2078}
2079
Guido van Rossum48a680c2001-03-02 06:34:14 +00002080
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002081/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002082
Guido van Rossum73624e91994-10-10 17:59:00 +00002083static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002084sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002085{
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002086 int recvlen, flags = 0;
2087 ssize_t outlen;
Guido van Rossum73624e91994-10-10 17:59:00 +00002088 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002089
Thomas Wouters477c8d52006-05-27 19:21:47 +00002090 if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002091 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002092
Thomas Wouters477c8d52006-05-27 19:21:47 +00002093 if (recvlen < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002094 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002095 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002096 return NULL;
2097 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002098
Thomas Wouters477c8d52006-05-27 19:21:47 +00002099 /* Allocate a new string. */
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002100 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002101 if (buf == NULL)
2102 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002103
Thomas Wouters477c8d52006-05-27 19:21:47 +00002104 /* Call the guts */
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002105 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002106 if (outlen < 0) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002107 /* An error occurred, release the string and return an
Thomas Wouters477c8d52006-05-27 19:21:47 +00002108 error. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002109 Py_DECREF(buf);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002110 return NULL;
2111 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002112 if (outlen != recvlen) {
2113 /* We did not read as many bytes as we anticipated, resize the
Kurt B. Kaisere4050372007-08-22 21:38:31 +00002114 string if possible and be successful. */
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002115 if (PyBytes_Resize(buf, outlen) < 0)
Kurt B. Kaisere4050372007-08-22 21:38:31 +00002116 /* Oopsy, not so successful after all. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002117 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002118 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002119
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002120 return buf;
2121}
2122
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002123PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002124"recv(buffersize[, flags]) -> data\n\
2125\n\
2126Receive up to buffersize bytes from the socket. For the optional flags\n\
2127argument, see the Unix manual. When no data is available, block until\n\
2128at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002129the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002130
Guido van Rossum30a685f1991-06-27 15:51:29 +00002131
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002132/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002133
Thomas Wouters477c8d52006-05-27 19:21:47 +00002134static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002135sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002136{
2137 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2138
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002139 int recvlen = 0, flags = 0;
2140 ssize_t readlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002141 char *buf;
2142 int buflen;
2143
2144 /* Get the buffer's memory */
Guido van Rossumd8faa362007-04-27 19:54:29 +00002145 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w#|ii:recv_into", kwlist,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002146 &buf, &buflen, &recvlen, &flags))
2147 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002148
2149 if (recvlen < 0) {
2150 PyErr_SetString(PyExc_ValueError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002151 "negative buffersize in recv_into");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002152 return NULL;
2153 }
2154 if (recvlen == 0) {
2155 /* If nbytes was not specified, use the buffer's length */
2156 recvlen = buflen;
2157 }
2158
2159 /* Check if the buffer is large enough */
2160 if (buflen < recvlen) {
2161 PyErr_SetString(PyExc_ValueError,
2162 "buffer too small for requested bytes");
2163 return NULL;
2164 }
2165
2166 /* Call the guts */
2167 readlen = sock_recv_guts(s, buf, recvlen, flags);
2168 if (readlen < 0) {
2169 /* Return an error. */
2170 return NULL;
2171 }
2172
2173 /* Return the number of bytes read. Note that we do not do anything
2174 special here in the case that readlen < recvlen. */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002175 return PyInt_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002176}
2177
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002178PyDoc_STRVAR(recv_into_doc,
2179"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002180\n\
2181A version of recv() that stores its data into a buffer rather than creating \n\
2182a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2183is not specified (or 0), receive up to the size available in the given buffer.\n\
2184\n\
2185See recv() for documentation about the flags.");
2186
2187
2188/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002189 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters477c8d52006-05-27 19:21:47 +00002190 * char buffer. If you have any inc/def ref to do to the objects that contain
2191 * the buffer, do it in the caller. This function returns the number of bytes
2192 * succesfully read. If there was an error, it returns -1. Note that it is
2193 * also possible that we return a number of bytes smaller than the request
2194 * bytes.
2195 *
2196 * 'addr' is a return value for the address object. Note that you must decref
2197 * it yourself.
2198 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002199static ssize_t
Thomas Wouters477c8d52006-05-27 19:21:47 +00002200sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
2201 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002202{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002203 sock_addr_t addrbuf;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002204 int timeout;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002205 ssize_t n = -1;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002206 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002207
Thomas Wouters477c8d52006-05-27 19:21:47 +00002208 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002209
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002210 if (!getsockaddrlen(s, &addrlen))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002211 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002212
Thomas Wouters477c8d52006-05-27 19:21:47 +00002213 if (!IS_SELECTABLE(s)) {
2214 select_error();
2215 return -1;
2216 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002217
Guido van Rossum73624e91994-10-10 17:59:00 +00002218 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002219 memset(&addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002220 timeout = internal_select(s, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002221 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002222#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002223#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002224 n = recvfrom(s->sock_fd, cbuf, len, flags,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002225 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002226#else
Thomas Wouters477c8d52006-05-27 19:21:47 +00002227 n = recvfrom(s->sock_fd, cbuf, len, flags,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002228 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002229#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002230#else
Thomas Wouters477c8d52006-05-27 19:21:47 +00002231 n = recvfrom(s->sock_fd, cbuf, len, flags,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002232 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002233#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002234 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002235 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002236
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002237 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002238 PyErr_SetString(socket_timeout, "timed out");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002239 return -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002240 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002241 if (n < 0) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002242 s->errorhandler();
2243 return -1;
Guido van Rossum7c53b771995-09-13 18:39:47 +00002244 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002245
Thomas Wouters89f507f2006-12-13 04:49:30 +00002246 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
Thomas Wouters477c8d52006-05-27 19:21:47 +00002247 addrlen, s->sock_proto)))
2248 return -1;
2249
2250 return n;
2251}
2252
2253/* s.recvfrom(nbytes [,flags]) method */
2254
2255static PyObject *
2256sock_recvfrom(PySocketSockObject *s, PyObject *args)
2257{
2258 PyObject *buf = NULL;
2259 PyObject *addr = NULL;
2260 PyObject *ret = NULL;
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002261 int recvlen, flags = 0;
2262 ssize_t outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002263
2264 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002265 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002266
Guido van Rossumd8faa362007-04-27 19:54:29 +00002267 if (recvlen < 0) {
2268 PyErr_SetString(PyExc_ValueError,
2269 "negative buffersize in recvfrom");
2270 return NULL;
2271 }
2272
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002273 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002274 if (buf == NULL)
2275 return NULL;
2276
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002277 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
Thomas Wouters477c8d52006-05-27 19:21:47 +00002278 recvlen, flags, &addr);
2279 if (outlen < 0) {
Barry Warsaw752300b1997-01-03 17:18:10 +00002280 goto finally;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002281 }
2282
2283 if (outlen != recvlen) {
2284 /* We did not read as many bytes as we anticipated, resize the
2285 string if possible and be succesful. */
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002286 if (PyBytes_Resize(buf, outlen) < 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002287 /* Oopsy, not so succesful after all. */
2288 goto finally;
2289 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002290
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002291 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002292
2293finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002294 Py_XDECREF(buf);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002295 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002296 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002297}
2298
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002299PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002300"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2301\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002302Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002303
Thomas Wouters477c8d52006-05-27 19:21:47 +00002304
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002305/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002306
2307static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002308sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002309{
2310 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
2311
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002312 int recvlen = 0, flags = 0;
2313 ssize_t readlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002314 char *buf;
2315 int buflen;
2316
2317 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002318
Guido van Rossumd8faa362007-04-27 19:54:29 +00002319 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w#|ii:recvfrom_into",
2320 kwlist, &buf, &buflen,
2321 &recvlen, &flags))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002322 return NULL;
2323 assert(buf != 0 && buflen > 0);
2324
2325 if (recvlen < 0) {
2326 PyErr_SetString(PyExc_ValueError,
Guido van Rossumd8faa362007-04-27 19:54:29 +00002327 "negative buffersize in recvfrom_into");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002328 return NULL;
2329 }
2330 if (recvlen == 0) {
2331 /* If nbytes was not specified, use the buffer's length */
2332 recvlen = buflen;
2333 }
2334
2335 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2336 if (readlen < 0) {
2337 /* Return an error */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002338 Py_XDECREF(addr);
2339 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002340 }
2341
2342 /* Return the number of bytes read and the address. Note that we do
2343 not do anything special here in the case that readlen < recvlen. */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002344 return Py_BuildValue("lN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002345}
2346
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002347PyDoc_STRVAR(recvfrom_into_doc,
2348"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002349\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002350Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002351
2352
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002353/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002354
Guido van Rossum73624e91994-10-10 17:59:00 +00002355static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002356sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002357{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002358 char *buf;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002359 int len, n = -1, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002360
Guido van Rossum43713e52000-02-29 13:59:29 +00002361 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002362 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002363
Neal Norwitz082b2df2006-02-07 07:04:46 +00002364 if (!IS_SELECTABLE(s))
2365 return select_error();
2366
Guido van Rossum73624e91994-10-10 17:59:00 +00002367 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002368 timeout = internal_select(s, 1);
2369 if (!timeout)
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002370#ifdef __VMS
2371 n = sendsegmented(s->sock_fd, buf, len, flags);
2372#else
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002373 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002374#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002375 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002376
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002377 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002378 PyErr_SetString(socket_timeout, "timed out");
2379 return NULL;
2380 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002381 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002382 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002383 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002384}
2385
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002386PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002387"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002388\n\
2389Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002390argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002391sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002392
2393
2394/* s.sendall(data [,flags]) method */
2395
2396static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002397sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002398{
2399 char *buf;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002400 int len, n = -1, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002401
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002402 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2403 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002404
Neal Norwitz082b2df2006-02-07 07:04:46 +00002405 if (!IS_SELECTABLE(s))
2406 return select_error();
2407
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002408 Py_BEGIN_ALLOW_THREADS
2409 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002410 timeout = internal_select(s, 1);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002411 n = -1;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002412 if (timeout)
2413 break;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002414#ifdef __VMS
2415 n = sendsegmented(s->sock_fd, buf, len, flags);
2416#else
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002417 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002418#endif
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002419 if (n < 0)
2420 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002421 buf += n;
2422 len -= n;
2423 } while (len > 0);
2424 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002425
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002426 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002427 PyErr_SetString(socket_timeout, "timed out");
2428 return NULL;
2429 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002430 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002431 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002432
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002433 Py_INCREF(Py_None);
2434 return Py_None;
2435}
2436
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002437PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002438"sendall(data[, flags])\n\
2439\n\
2440Send a data string to the socket. For the optional flags\n\
2441argument, see the Unix manual. This calls send() repeatedly\n\
2442until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002443to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002444
Guido van Rossum30a685f1991-06-27 15:51:29 +00002445
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002446/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002447
Guido van Rossum73624e91994-10-10 17:59:00 +00002448static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002449sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002450{
Guido van Rossum73624e91994-10-10 17:59:00 +00002451 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002452 char *buf;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002453 sock_addr_t addrbuf;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002454 int addrlen, len, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002455
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002456 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002457 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002458 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002459 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2460 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002461 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002462 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002463
Neal Norwitz082b2df2006-02-07 07:04:46 +00002464 if (!IS_SELECTABLE(s))
2465 return select_error();
2466
Thomas Wouters89f507f2006-12-13 04:49:30 +00002467 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2468 return NULL;
2469
Guido van Rossum73624e91994-10-10 17:59:00 +00002470 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002471 timeout = internal_select(s, 1);
2472 if (!timeout)
Thomas Wouters89f507f2006-12-13 04:49:30 +00002473 n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002474 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002475
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002476 if (timeout == 1) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002477 PyErr_SetString(socket_timeout, "timed out");
2478 return NULL;
2479 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002480 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002481 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002482 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002483}
2484
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002485PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002486"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002487\n\
2488Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002489For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002490
Guido van Rossum30a685f1991-06-27 15:51:29 +00002491
2492/* s.shutdown(how) method */
2493
Guido van Rossum73624e91994-10-10 17:59:00 +00002494static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002495sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002496{
2497 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002498 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002499
2500 how = PyInt_AsLong(arg);
2501 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002502 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002503 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002504 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002505 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002506 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002507 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002508 Py_INCREF(Py_None);
2509 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002510}
2511
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002512PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002513"shutdown(flag)\n\
2514\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002515Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2516of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002517
Guido van Rossum30a685f1991-06-27 15:51:29 +00002518
2519/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002520
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002521static PyMethodDef sock_methods[] = {
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002522 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002523 accept_doc},
2524 {"bind", (PyCFunction)sock_bind, METH_O,
2525 bind_doc},
2526 {"close", (PyCFunction)sock_close, METH_NOARGS,
2527 close_doc},
2528 {"connect", (PyCFunction)sock_connect, METH_O,
2529 connect_doc},
2530 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
2531 connect_ex_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +00002532 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
2533 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002534#ifdef HAVE_GETPEERNAME
Thomas Wouters477c8d52006-05-27 19:21:47 +00002535 {"getpeername", (PyCFunction)sock_getpeername,
2536 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002537#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00002538 {"getsockname", (PyCFunction)sock_getsockname,
2539 METH_NOARGS, getsockname_doc},
2540 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
2541 getsockopt_doc},
2542 {"listen", (PyCFunction)sock_listen, METH_O,
2543 listen_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +00002544 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
2545 recv_doc},
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002546 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
2547 recv_into_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +00002548 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
2549 recvfrom_doc},
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002550 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
2551 recvfrom_into_doc},
Thomas Wouters477c8d52006-05-27 19:21:47 +00002552 {"send", (PyCFunction)sock_send, METH_VARARGS,
2553 send_doc},
2554 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
2555 sendall_doc},
2556 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
2557 sendto_doc},
2558 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
2559 setblocking_doc},
2560 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
2561 settimeout_doc},
2562 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
2563 gettimeout_doc},
2564 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
2565 setsockopt_doc},
2566 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
2567 shutdown_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002568 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002569};
2570
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002571/* SockObject members */
2572static PyMemberDef sock_memberlist[] = {
2573 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
2574 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
2575 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
2576 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
2577 {0},
2578};
Guido van Rossum30a685f1991-06-27 15:51:29 +00002579
Guido van Rossum73624e91994-10-10 17:59:00 +00002580/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002581 First close the file description. */
2582
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002583static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002584sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002585{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002586 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002587 (void) SOCKETCLOSE(s->sock_fd);
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002588 Py_Type(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002589}
2590
Guido van Rossum30a685f1991-06-27 15:51:29 +00002591
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002592static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002593sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002594{
Fred Drakea04eaad2000-06-30 02:46:07 +00002595#if SIZEOF_SOCKET_T > SIZEOF_LONG
2596 if (s->sock_fd > LONG_MAX) {
2597 /* this can occur on Win64, and actually there is a special
2598 ugly printf formatter for decimal pointer length integer
2599 printing, only bother if necessary*/
2600 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002601 "no printf formatter to display "
2602 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002603 return NULL;
2604 }
2605#endif
Walter Dörwalda7eb93e2007-06-05 13:41:53 +00002606 return PyUnicode_FromFormat(
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002607 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002608 (long)s->sock_fd, s->sock_family,
2609 s->sock_type,
2610 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002611}
2612
2613
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002614/* Create a new, uninitialized socket object. */
2615
2616static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002617sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002618{
2619 PyObject *new;
2620
2621 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002622 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002623 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002624 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002625 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002626 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002627 return new;
2628}
2629
2630
2631/* Initialize a new socket object. */
2632
2633/*ARGSUSED*/
2634static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002635sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002636{
2637 PySocketSockObject *s = (PySocketSockObject *)self;
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002638 PyObject *fdobj = NULL;
2639 SOCKET_T fd = INVALID_SOCKET;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002640 int family = AF_INET, type = SOCK_STREAM, proto = 0;
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002641 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002642
2643 if (!PyArg_ParseTupleAndKeywords(args, kwds,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002644 "|iiiO:socket", keywords,
2645 &family, &type, &proto, &fdobj))
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002646 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002647
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002648 if (fdobj != NULL && fdobj != Py_None) {
2649 fd = PyLong_AsSocket_t(fdobj);
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002650 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
2651 return -1;
2652 if (fd == INVALID_SOCKET) {
2653 PyErr_SetString(PyExc_ValueError,
2654 "can't use invalid socket value");
2655 return -1;
2656 }
2657 }
2658 else {
2659 Py_BEGIN_ALLOW_THREADS
2660 fd = socket(family, type, proto);
2661 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002662
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002663 if (fd == INVALID_SOCKET) {
2664 set_error();
2665 return -1;
2666 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002667 }
2668 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002669
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002670 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002671
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002672}
2673
2674
Guido van Rossumb6775db1994-08-01 11:34:53 +00002675/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002676
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002677static PyTypeObject sock_type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002678 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002679 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002680 sizeof(PySocketSockObject), /* tp_basicsize */
2681 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002682 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002683 0, /* tp_print */
2684 0, /* tp_getattr */
2685 0, /* tp_setattr */
2686 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002687 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002688 0, /* tp_as_number */
2689 0, /* tp_as_sequence */
2690 0, /* tp_as_mapping */
2691 0, /* tp_hash */
2692 0, /* tp_call */
2693 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002694 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002695 0, /* tp_setattro */
2696 0, /* tp_as_buffer */
2697 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002698 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002699 0, /* tp_traverse */
2700 0, /* tp_clear */
2701 0, /* tp_richcompare */
2702 0, /* tp_weaklistoffset */
2703 0, /* tp_iter */
2704 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002705 sock_methods, /* tp_methods */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002706 sock_memberlist, /* tp_members */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002707 0, /* tp_getset */
2708 0, /* tp_base */
2709 0, /* tp_dict */
2710 0, /* tp_descr_get */
2711 0, /* tp_descr_set */
2712 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002713 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002714 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002715 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002716 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002717};
2718
Guido van Rossum30a685f1991-06-27 15:51:29 +00002719
Guido van Rossum81194471991-07-27 21:42:02 +00002720/* Python interface to gethostname(). */
2721
2722/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002723static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002724socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00002725{
2726 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002727 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00002728 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002729 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002730 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002731 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002732 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002733 buf[sizeof buf - 1] = '\0';
Guido van Rossum32c4ac02007-08-15 03:56:40 +00002734 return PyUnicode_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002735}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002737PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002738"gethostname() -> string\n\
2739\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002740Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002741
Guido van Rossumff4949e1992-08-05 19:58:53 +00002742
Guido van Rossum30a685f1991-06-27 15:51:29 +00002743/* Python interface to gethostbyname(name). */
2744
2745/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002746static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002747socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002748{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002749 char *name;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002750 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002751
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002752 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002753 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002754 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002755 return NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002756 return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002757}
2758
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002759PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002760"gethostbyname(host) -> address\n\
2761\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002762Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002763
2764
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002765/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2766
2767static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002768gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002769{
2770 char **pch;
2771 PyObject *rtn_tuple = (PyObject *)NULL;
2772 PyObject *name_list = (PyObject *)NULL;
2773 PyObject *addr_list = (PyObject *)NULL;
2774 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002775
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002776 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002777 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002778 set_herror(h_errno);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002779 return NULL;
2780 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002781
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002782 if (h->h_addrtype != af) {
2783#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002784 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002785 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002786 (char *)strerror(EAFNOSUPPORT));
2787#else
2788 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002789 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002790 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002791#endif
2792 return NULL;
2793 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002794
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002795 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002796
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002797 case AF_INET:
2798 if (alen < sizeof(struct sockaddr_in))
2799 return NULL;
2800 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002801
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002802#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002803 case AF_INET6:
2804 if (alen < sizeof(struct sockaddr_in6))
2805 return NULL;
2806 break;
2807#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002808
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002809 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002810
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002811 if ((name_list = PyList_New(0)) == NULL)
2812 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002813
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002814 if ((addr_list = PyList_New(0)) == NULL)
2815 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002816
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002817 /* SF #1511317: h_aliases can be NULL */
2818 if (h->h_aliases) {
2819 for (pch = h->h_aliases; *pch != NULL; pch++) {
2820 int status;
Guido van Rossum32c4ac02007-08-15 03:56:40 +00002821 tmp = PyUnicode_FromString(*pch);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002822 if (tmp == NULL)
2823 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002824
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002825 status = PyList_Append(name_list, tmp);
2826 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002827
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002828 if (status)
2829 goto err;
2830 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002831 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002832
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002833 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2834 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002835
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002836 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002837
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002838 case AF_INET:
2839 {
2840 struct sockaddr_in sin;
2841 memset(&sin, 0, sizeof(sin));
2842 sin.sin_family = af;
2843#ifdef HAVE_SOCKADDR_SA_LEN
2844 sin.sin_len = sizeof(sin);
2845#endif
2846 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2847 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002848
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002849 if (pch == h->h_addr_list && alen >= sizeof(sin))
2850 memcpy((char *) addr, &sin, sizeof(sin));
2851 break;
2852 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002853
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002854#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002855 case AF_INET6:
2856 {
2857 struct sockaddr_in6 sin6;
2858 memset(&sin6, 0, sizeof(sin6));
2859 sin6.sin6_family = af;
2860#ifdef HAVE_SOCKADDR_SA_LEN
2861 sin6.sin6_len = sizeof(sin6);
2862#endif
2863 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2864 tmp = makeipaddr((struct sockaddr *)&sin6,
2865 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002866
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002867 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2868 memcpy((char *) addr, &sin6, sizeof(sin6));
2869 break;
2870 }
2871#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002872
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002873 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002874 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002875 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002876 return NULL;
2877 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002878
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002879 if (tmp == NULL)
2880 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002881
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002882 status = PyList_Append(addr_list, tmp);
2883 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002884
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002885 if (status)
2886 goto err;
2887 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002888
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002889 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002890
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002891 err:
2892 Py_XDECREF(name_list);
2893 Py_XDECREF(addr_list);
2894 return rtn_tuple;
2895}
2896
2897
2898/* Python interface to gethostbyname_ex(name). */
2899
2900/*ARGSUSED*/
2901static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002902socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002903{
2904 char *name;
2905 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002906#ifdef ENABLE_IPV6
2907 struct sockaddr_storage addr;
2908#else
2909 struct sockaddr_in addr;
2910#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002911 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002912 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002913#ifdef HAVE_GETHOSTBYNAME_R
2914 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002915#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2916 struct hostent_data data;
2917#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002918 char buf[16384];
2919 int buf_len = (sizeof buf) - 1;
2920 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002921#endif
2922#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002923 int result;
2924#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002925#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002926
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002927 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002928 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002929 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002930 return NULL;
2931 Py_BEGIN_ALLOW_THREADS
2932#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002933#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002934 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2935 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002936#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002937 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002938#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002939 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002940 result = gethostbyname_r(name, &hp_allocated, &data);
2941 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002942#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002943#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002944#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002945 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002946#endif
2947 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002948#endif /* HAVE_GETHOSTBYNAME_R */
2949 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002950 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002951 addr.ss_family.
2952 Therefore, we cast the sockaddr_storage into sockaddr to
2953 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002954 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002955 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002956 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002957#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002958 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002959#endif
2960 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002961}
2962
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002963PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002964"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2965\n\
2966Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002967for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002968
2969
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002970/* Python interface to gethostbyaddr(IP). */
2971
2972/*ARGSUSED*/
2973static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002974socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002975{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002976#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002977 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002978#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002979 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002980#endif
2981 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002982 char *ip_num;
2983 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002984 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002985#ifdef HAVE_GETHOSTBYNAME_R
2986 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002987#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2988 struct hostent_data data;
2989#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002990 char buf[16384];
2991 int buf_len = (sizeof buf) - 1;
2992 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002993#endif
2994#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002995 int result;
2996#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002997#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002998 char *ap;
2999 int al;
3000 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003001
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003002 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003003 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003004 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00003005 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003006 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003007 af = sa->sa_family;
3008 ap = NULL;
3009 al = 0;
3010 switch (af) {
3011 case AF_INET:
3012 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
3013 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
3014 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003015#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003016 case AF_INET6:
3017 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
3018 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
3019 break;
3020#endif
3021 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003022 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003023 return NULL;
3024 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003025 Py_BEGIN_ALLOW_THREADS
3026#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003027#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003028 result = gethostbyaddr_r(ap, al, af,
3029 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003030 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003031#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003032 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003033 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003034#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00003035 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003036 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00003037 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003038#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003039#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003040#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003041 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003042#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003043 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003044#endif /* HAVE_GETHOSTBYNAME_R */
3045 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003046 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003047#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003048 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003049#endif
3050 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003051}
3052
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003053PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003054"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3055\n\
3056Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003057for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003058
Guido van Rossum30a685f1991-06-27 15:51:29 +00003059
3060/* Python interface to getservbyname(name).
3061 This only returns the port number, since the other info is already
3062 known or not useful (like the list of aliases). */
3063
3064/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003065static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003066socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003067{
Barry Warsaw11b91a02004-06-28 00:50:43 +00003068 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003069 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003070 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00003071 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00003072 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00003073 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003074 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00003075 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003076 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00003077 return NULL;
3078 }
Guido van Rossum73624e91994-10-10 17:59:00 +00003079 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003080}
3081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003082PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003083"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003084\n\
3085Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003086The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3087otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003088
Guido van Rossum30a685f1991-06-27 15:51:29 +00003089
Barry Warsaw11b91a02004-06-28 00:50:43 +00003090/* Python interface to getservbyport(port).
3091 This only returns the service name, since the other info is already
3092 known or not useful (like the list of aliases). */
3093
3094/*ARGSUSED*/
3095static PyObject *
3096socket_getservbyport(PyObject *self, PyObject *args)
3097{
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003098 unsigned short port;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003099 char *proto=NULL;
3100 struct servent *sp;
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003101 if (!PyArg_ParseTuple(args, "H|s:getservbyport", &port, &proto))
Barry Warsaw11b91a02004-06-28 00:50:43 +00003102 return NULL;
3103 Py_BEGIN_ALLOW_THREADS
3104 sp = getservbyport(htons(port), proto);
3105 Py_END_ALLOW_THREADS
3106 if (sp == NULL) {
3107 PyErr_SetString(socket_error, "port/proto not found");
3108 return NULL;
3109 }
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003110 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00003111}
3112
3113PyDoc_STRVAR(getservbyport_doc,
3114"getservbyport(port[, protocolname]) -> string\n\
3115\n\
3116Return the service name from a port number and protocol name.\n\
3117The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3118otherwise any protocol will match.");
3119
Guido van Rossum3901d851996-12-19 16:35:04 +00003120/* Python interface to getprotobyname(name).
3121 This only returns the protocol number, since the other info is
3122 already known or not useful (like the list of aliases). */
3123
3124/*ARGSUSED*/
3125static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003126socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003127{
3128 char *name;
3129 struct protoent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003130 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00003131 return NULL;
3132 Py_BEGIN_ALLOW_THREADS
3133 sp = getprotobyname(name);
3134 Py_END_ALLOW_THREADS
3135 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003136 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00003137 return NULL;
3138 }
3139 return PyInt_FromLong((long) sp->p_proto);
3140}
3141
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003142PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003143"getprotobyname(name) -> integer\n\
3144\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003145Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003146
Guido van Rossum3901d851996-12-19 16:35:04 +00003147
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003148#ifndef NO_DUP
3149/* dup() function for socket fds */
3150
3151static PyObject *
3152socket_dup(PyObject *self, PyObject *fdobj)
3153{
3154 SOCKET_T fd, newfd;
3155 PyObject *newfdobj;
3156
3157
3158 fd = PyLong_AsSocket_t(fdobj);
3159 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3160 return NULL;
3161
3162 newfd = dup_socket(fd);
3163 if (newfd == INVALID_SOCKET)
3164 return set_error();
3165
3166 newfdobj = PyLong_FromSocket_t(newfd);
3167 if (newfdobj == NULL)
3168 SOCKETCLOSE(newfd);
3169 return newfdobj;
3170}
3171
3172PyDoc_STRVAR(dup_doc,
3173"dup(integer) -> integer\n\
3174\n\
3175Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
3176sockets; on some platforms os.dup() won't work for socket file descriptors.");
3177#endif
3178
3179
Dave Cole331708b2004-08-09 04:51:41 +00003180#ifdef HAVE_SOCKETPAIR
3181/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003182 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003183 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003184
3185/*ARGSUSED*/
3186static PyObject *
3187socket_socketpair(PyObject *self, PyObject *args)
3188{
3189 PySocketSockObject *s0 = NULL, *s1 = NULL;
3190 SOCKET_T sv[2];
3191 int family, type = SOCK_STREAM, proto = 0;
3192 PyObject *res = NULL;
3193
3194#if defined(AF_UNIX)
3195 family = AF_UNIX;
3196#else
3197 family = AF_INET;
3198#endif
3199 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3200 &family, &type, &proto))
3201 return NULL;
3202 /* Create a pair of socket fds */
3203 if (socketpair(family, type, proto, sv) < 0)
3204 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003205 s0 = new_sockobject(sv[0], family, type, proto);
3206 if (s0 == NULL)
3207 goto finally;
3208 s1 = new_sockobject(sv[1], family, type, proto);
3209 if (s1 == NULL)
3210 goto finally;
3211 res = PyTuple_Pack(2, s0, s1);
3212
3213finally:
3214 if (res == NULL) {
3215 if (s0 == NULL)
3216 SOCKETCLOSE(sv[0]);
3217 if (s1 == NULL)
3218 SOCKETCLOSE(sv[1]);
3219 }
3220 Py_XDECREF(s0);
3221 Py_XDECREF(s1);
3222 return res;
3223}
3224
3225PyDoc_STRVAR(socketpair_doc,
3226"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3227\n\
3228Create a pair of socket objects from the sockets returned by the platform\n\
3229socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003230The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003231AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003232
3233#endif /* HAVE_SOCKETPAIR */
3234
3235
Guido van Rossum006bf911996-06-12 04:04:55 +00003236static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003237socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003238{
3239 int x1, x2;
3240
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003241 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003242 return NULL;
3243 }
Guido van Rossum018919a2007-01-15 00:07:32 +00003244 if (x1 < 0) {
3245 PyErr_SetString(PyExc_OverflowError,
3246 "can't convert negative number to unsigned long");
3247 return NULL;
3248 }
3249 x2 = (unsigned int)ntohs((unsigned short)x1);
Guido van Rossum006bf911996-06-12 04:04:55 +00003250 return PyInt_FromLong(x2);
3251}
3252
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003253PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003254"ntohs(integer) -> integer\n\
3255\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003256Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003257
3258
Guido van Rossum006bf911996-06-12 04:04:55 +00003259static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003260socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003261{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003262 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003263
Guido van Rossumddefaf32007-01-14 03:31:43 +00003264 if (PyLong_Check(arg)) {
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003265 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003266 if (x == (unsigned long) -1 && PyErr_Occurred())
3267 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003268#if SIZEOF_LONG > 4
3269 {
3270 unsigned long y;
3271 /* only want the trailing 32 bits */
3272 y = x & 0xFFFFFFFFUL;
3273 if (y ^ x)
3274 return PyErr_Format(PyExc_OverflowError,
3275 "long int larger than 32 bits");
3276 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003277 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003278#endif
3279 }
3280 else
Tim Peters58141872002-08-06 22:25:02 +00003281 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003282 "expected int/long, %s found",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003283 Py_Type(arg)->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003284 if (x == (unsigned long) -1 && PyErr_Occurred())
3285 return NULL;
Guido van Rossum018919a2007-01-15 00:07:32 +00003286 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003287}
3288
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003289PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003290"ntohl(integer) -> integer\n\
3291\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003292Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003293
3294
Guido van Rossum006bf911996-06-12 04:04:55 +00003295static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003296socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003297{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003298 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003299
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003300 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003301 return NULL;
3302 }
Guido van Rossum018919a2007-01-15 00:07:32 +00003303 if (x1 < 0) {
3304 PyErr_SetString(PyExc_OverflowError,
3305 "can't convert negative number to unsigned long");
3306 return NULL;
3307 }
3308 x2 = (unsigned int)htons((unsigned short)x1);
Guido van Rossum006bf911996-06-12 04:04:55 +00003309 return PyInt_FromLong(x2);
3310}
3311
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003312PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003313"htons(integer) -> integer\n\
3314\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003315Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003316
3317
Guido van Rossum006bf911996-06-12 04:04:55 +00003318static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003319socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003320{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003321 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003322
Guido van Rossumddefaf32007-01-14 03:31:43 +00003323 if (PyLong_Check(arg)) {
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003324 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003325 if (x == (unsigned long) -1 && PyErr_Occurred())
3326 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003327#if SIZEOF_LONG > 4
3328 {
3329 unsigned long y;
3330 /* only want the trailing 32 bits */
3331 y = x & 0xFFFFFFFFUL;
3332 if (y ^ x)
3333 return PyErr_Format(PyExc_OverflowError,
3334 "long int larger than 32 bits");
3335 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003336 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003337#endif
3338 }
3339 else
Tim Peters58141872002-08-06 22:25:02 +00003340 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003341 "expected int/long, %s found",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003342 Py_Type(arg)->tp_name);
Guido van Rossum018919a2007-01-15 00:07:32 +00003343 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003344}
3345
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003346PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003347"htonl(integer) -> integer\n\
3348\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003349Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003350
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003351/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003352
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003353PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003354"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003355\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003356Convert 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 +00003357binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003358
3359static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003360socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003361{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003362#ifndef INADDR_NONE
3363#define INADDR_NONE (-1)
3364#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003365#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003366 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003367#endif
3368
3369#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Tim Peters1df9fdd2003-02-13 03:13:40 +00003370 /* Have to use inet_addr() instead */
3371 unsigned long packed_addr;
3372#endif
3373 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003374
Tim Peters1df9fdd2003-02-13 03:13:40 +00003375 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003376 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003377
Tim Peters1df9fdd2003-02-13 03:13:40 +00003378
3379#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00003380
3381#ifdef USE_INET_ATON_WEAKLINK
3382 if (inet_aton != NULL) {
3383#endif
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003384 if (inet_aton(ip_addr, &buf))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003385 return PyBytes_FromStringAndSize((char *)(&buf),
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003386 sizeof(buf));
3387
3388 PyErr_SetString(socket_error,
3389 "illegal IP address string passed to inet_aton");
3390 return NULL;
3391
Thomas Wouters477c8d52006-05-27 19:21:47 +00003392#ifdef USE_INET_ATON_WEAKLINK
3393 } else {
3394#endif
3395
3396#endif
3397
3398#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
3399
Georg Brandld2e3ba72005-08-26 08:34:00 +00003400 /* special-case this address as inet_addr might return INADDR_NONE
3401 * for this */
3402 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3403 packed_addr = 0xFFFFFFFF;
3404 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00003405
Georg Brandld2e3ba72005-08-26 08:34:00 +00003406 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003407
Georg Brandld2e3ba72005-08-26 08:34:00 +00003408 if (packed_addr == INADDR_NONE) { /* invalid address */
3409 PyErr_SetString(socket_error,
3410 "illegal IP address string passed to inet_aton");
3411 return NULL;
3412 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003413 }
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003414 return PyBytes_FromStringAndSize((char *) &packed_addr,
3415 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00003416
3417#ifdef USE_INET_ATON_WEAKLINK
3418 }
3419#endif
3420
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003421#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003422}
3423
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003424PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003425"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003426\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003427Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003428
3429static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003430socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003431{
3432 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003433 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003434 struct in_addr packed_addr;
3435
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003436 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003437 return NULL;
3438 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003439
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003440 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003441 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003442 "packed IP wrong length for inet_ntoa");
3443 return NULL;
3444 }
3445
3446 memcpy(&packed_addr, packed_str, addr_len);
3447
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003448 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003449}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003450
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003451#ifdef HAVE_INET_PTON
3452
3453PyDoc_STRVAR(inet_pton_doc,
3454"inet_pton(af, ip) -> packed IP address string\n\
3455\n\
3456Convert an IP address from string format to a packed string suitable\n\
3457for use with low-level network functions.");
3458
3459static PyObject *
3460socket_inet_pton(PyObject *self, PyObject *args)
3461{
3462 int af;
3463 char* ip;
3464 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003465#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003466 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003467#else
3468 char packed[sizeof(struct in_addr)];
3469#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003470 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3471 return NULL;
3472 }
3473
Martin v. Löwis04697e82004-06-02 12:35:29 +00003474#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003475 if(af == AF_INET6) {
3476 PyErr_SetString(socket_error,
3477 "can't use AF_INET6, IPv6 is disabled");
3478 return NULL;
3479 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003480#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00003481
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003482 retval = inet_pton(af, ip, packed);
3483 if (retval < 0) {
3484 PyErr_SetFromErrno(socket_error);
3485 return NULL;
3486 } else if (retval == 0) {
3487 PyErr_SetString(socket_error,
3488 "illegal IP address string passed to inet_pton");
3489 return NULL;
3490 } else if (af == AF_INET) {
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003491 return PyBytes_FromStringAndSize(packed,
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003492 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003493#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003494 } else if (af == AF_INET6) {
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003495 return PyBytes_FromStringAndSize(packed,
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003496 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003497#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003498 } else {
3499 PyErr_SetString(socket_error, "unknown address family");
3500 return NULL;
3501 }
3502}
Thomas Wouters477c8d52006-05-27 19:21:47 +00003503
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003504PyDoc_STRVAR(inet_ntop_doc,
3505"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3506\n\
3507Convert a packed IP address of the given family to string format.");
3508
3509static PyObject *
3510socket_inet_ntop(PyObject *self, PyObject *args)
3511{
3512 int af;
3513 char* packed;
3514 int len;
3515 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003516#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003517 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003518#else
3519 char ip[INET_ADDRSTRLEN + 1];
3520#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00003521
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003522 /* Guarantee NUL-termination for PyUnicode_FromString() below */
Jeremy Hylton80961f32004-11-07 14:24:25 +00003523 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003524
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003525 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003526 return NULL;
3527 }
3528
3529 if (af == AF_INET) {
3530 if (len != sizeof(struct in_addr)) {
3531 PyErr_SetString(PyExc_ValueError,
3532 "invalid length of packed IP address string");
3533 return NULL;
3534 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003535#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003536 } else if (af == AF_INET6) {
3537 if (len != sizeof(struct in6_addr)) {
3538 PyErr_SetString(PyExc_ValueError,
3539 "invalid length of packed IP address string");
3540 return NULL;
3541 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003542#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003543 } else {
3544 PyErr_Format(PyExc_ValueError,
3545 "unknown address family %d", af);
3546 return NULL;
3547 }
3548
3549 retval = inet_ntop(af, packed, ip, sizeof(ip));
3550 if (!retval) {
3551 PyErr_SetFromErrno(socket_error);
3552 return NULL;
3553 } else {
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003554 return PyUnicode_FromString(retval);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003555 }
3556
3557 /* NOTREACHED */
3558 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3559 return NULL;
3560}
3561
3562#endif /* HAVE_INET_PTON */
3563
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003564/* Python interface to getaddrinfo(host, port). */
3565
3566/*ARGSUSED*/
3567static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003568socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003569{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003570 struct addrinfo hints, *res;
3571 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003572 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003573 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003574 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003575 char *hptr, *pptr;
3576 int family, socktype, protocol, flags;
3577 int error;
3578 PyObject *all = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003579 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003580
3581 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003582 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003583 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3584 &hobj, &pobj, &family, &socktype,
3585 &protocol, &flags)) {
3586 return NULL;
3587 }
3588 if (hobj == Py_None) {
3589 hptr = NULL;
3590 } else if (PyUnicode_Check(hobj)) {
3591 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3592 if (!idna)
3593 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +00003594 assert(PyString_Check(idna));
3595 hptr = PyString_AS_STRING(idna);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003596 } else if (PyString_Check(hobj)) {
3597 hptr = PyString_AsString(hobj);
3598 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00003599 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis2548c732003-04-18 10:39:54 +00003600 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003601 return NULL;
3602 }
Guido van Rossumddefaf32007-01-14 03:31:43 +00003603 if (PyInt_CheckExact(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003604 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003605 pptr = pbuf;
Guido van Rossum32c4ac02007-08-15 03:56:40 +00003606 } else if (PyUnicode_Check(pobj)) {
3607 pptr = PyUnicode_AsString(pobj);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003608 } else if (PyString_Check(pobj)) {
3609 pptr = PyString_AsString(pobj);
3610 } else if (pobj == Py_None) {
3611 pptr = (char *)NULL;
3612 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003613 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003614 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003615 }
3616 memset(&hints, 0, sizeof(hints));
3617 hints.ai_family = family;
3618 hints.ai_socktype = socktype;
3619 hints.ai_protocol = protocol;
3620 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003621 Py_BEGIN_ALLOW_THREADS
3622 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003623 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003624 Py_END_ALLOW_THREADS
3625 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003626 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003627 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003628 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003629 }
3630
3631 if ((all = PyList_New(0)) == NULL)
3632 goto err;
3633 for (res = res0; res; res = res->ai_next) {
Guido van Rossum9ce8e382007-08-09 21:06:37 +00003634 PyObject *single;
Guido van Rossum716aac02001-10-12 18:59:27 +00003635 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003636 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003637 if (addr == NULL)
3638 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003639 single = Py_BuildValue("iiisO", res->ai_family,
3640 res->ai_socktype, res->ai_protocol,
3641 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003642 addr);
3643 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003644 if (single == NULL)
3645 goto err;
3646
3647 if (PyList_Append(all, single))
3648 goto err;
3649 Py_XDECREF(single);
3650 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003651 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003652 if (res0)
3653 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003654 return all;
3655 err:
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003656 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003657 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003658 if (res0)
3659 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003660 return (PyObject *)NULL;
3661}
3662
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003663PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003664"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3665 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003666\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003667Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003668
3669/* Python interface to getnameinfo(sa, flags). */
3670
3671/*ARGSUSED*/
3672static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003673socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003674{
3675 PyObject *sa = (PyObject *)NULL;
3676 int flags;
3677 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003678 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003679 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3680 struct addrinfo hints, *res = NULL;
3681 int error;
3682 PyObject *ret = (PyObject *)NULL;
3683
3684 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003685 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003686 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003687 if (!PyArg_ParseTuple(sa, "si|ii",
3688 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003689 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003690 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003691 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003692 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003693 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003694 Py_BEGIN_ALLOW_THREADS
3695 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003696 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003697 Py_END_ALLOW_THREADS
3698 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003699 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003700 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003701 goto fail;
3702 }
3703 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003704 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003705 "sockaddr resolved to multiple addresses");
3706 goto fail;
3707 }
3708 switch (res->ai_family) {
3709 case AF_INET:
3710 {
3711 char *t1;
3712 int t2;
3713 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003714 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003715 "IPv4 sockaddr must be 2 tuple");
3716 goto fail;
3717 }
3718 break;
3719 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003720#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003721 case AF_INET6:
3722 {
3723 struct sockaddr_in6 *sin6;
3724 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3725 sin6->sin6_flowinfo = flowinfo;
3726 sin6->sin6_scope_id = scope_id;
3727 break;
3728 }
3729#endif
3730 }
3731 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3732 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3733 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003734 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003735 goto fail;
3736 }
3737 ret = Py_BuildValue("ss", hbuf, pbuf);
3738
3739fail:
3740 if (res)
3741 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003742 return ret;
3743}
3744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003745PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003746"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003747\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003748Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003749
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003750
3751/* Python API to getting and setting the default timeout value. */
3752
3753static PyObject *
3754socket_getdefaulttimeout(PyObject *self)
3755{
3756 if (defaulttimeout < 0.0) {
3757 Py_INCREF(Py_None);
3758 return Py_None;
3759 }
3760 else
3761 return PyFloat_FromDouble(defaulttimeout);
3762}
3763
3764PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003765"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003766\n\
3767Returns the default timeout in floating seconds for new socket objects.\n\
3768A value of None indicates that new socket objects have no timeout.\n\
3769When the socket module is first imported, the default is None.");
3770
3771static PyObject *
3772socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3773{
3774 double timeout;
3775
3776 if (arg == Py_None)
3777 timeout = -1.0;
3778 else {
3779 timeout = PyFloat_AsDouble(arg);
3780 if (timeout < 0.0) {
3781 if (!PyErr_Occurred())
3782 PyErr_SetString(PyExc_ValueError,
3783 "Timeout value out of range");
3784 return NULL;
3785 }
3786 }
3787
3788 defaulttimeout = timeout;
3789
3790 Py_INCREF(Py_None);
3791 return Py_None;
3792}
3793
3794PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003795"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003796\n\
3797Set the default timeout in floating seconds for new socket objects.\n\
3798A value of None indicates that new socket objects have no timeout.\n\
3799When the socket module is first imported, the default is None.");
3800
3801
Guido van Rossum30a685f1991-06-27 15:51:29 +00003802/* List of functions exported by this module. */
3803
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003804static PyMethodDef socket_methods[] = {
3805 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003806 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003807 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003808 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003809 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003810 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003811 {"gethostname", socket_gethostname,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003812 METH_NOARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003813 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003814 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003815 {"getservbyport", socket_getservbyport,
3816 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003817 {"getprotobyname", socket_getprotobyname,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00003818 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00003819#ifndef NO_DUP
3820 {"dup", socket_dup,
3821 METH_O, dup_doc},
3822#endif
Dave Cole331708b2004-08-09 04:51:41 +00003823#ifdef HAVE_SOCKETPAIR
3824 {"socketpair", socket_socketpair,
3825 METH_VARARGS, socketpair_doc},
3826#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003827 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003828 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003829 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003830 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003831 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003832 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003833 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003834 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003835 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003836 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003837 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003838 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003839#ifdef HAVE_INET_PTON
3840 {"inet_pton", socket_inet_pton,
3841 METH_VARARGS, inet_pton_doc},
3842 {"inet_ntop", socket_inet_ntop,
3843 METH_VARARGS, inet_ntop_doc},
3844#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003845 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003846 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003847 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003848 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003849 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003850 METH_NOARGS, getdefaulttimeout_doc},
3851 {"setdefaulttimeout", socket_setdefaulttimeout,
3852 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003853 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003854};
3855
Guido van Rossum30a685f1991-06-27 15:51:29 +00003856
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003857#ifdef MS_WINDOWS
3858#define OS_INIT_DEFINED
3859
3860/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003861
3862static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003863os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003864{
3865 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003866}
3867
3868static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003869os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003870{
3871 WSADATA WSAData;
3872 int ret;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003873 ret = WSAStartup(0x0101, &WSAData);
3874 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003875 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003876 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003877 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003878 case WSASYSNOTREADY:
3879 PyErr_SetString(PyExc_ImportError,
3880 "WSAStartup failed: network not ready");
3881 break;
3882 case WSAVERNOTSUPPORTED:
3883 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003884 PyErr_SetString(
3885 PyExc_ImportError,
3886 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003887 break;
3888 default:
Walter Dörwald0bbd8ab2007-06-05 13:49:43 +00003889 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003890 break;
3891 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003892 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003893}
3894
Guido van Rossum8d665e61996-06-26 18:22:49 +00003895#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003896
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003897
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003898#ifdef PYOS_OS2
3899#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003900
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003901/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003902
3903static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003904os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003905{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003906#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003907 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003908
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003909 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003910 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003911 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003912
Walter Dörwald0bbd8ab2007-06-05 13:49:43 +00003913 PyErr_Format(PyExc_ImportError, "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003914
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003915 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003916#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003917 /* No need to initialise sockets with GCC/EMX */
3918 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003919#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003920}
3921
3922#endif /* PYOS_OS2 */
3923
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003924
3925#ifndef OS_INIT_DEFINED
3926static int
3927os_init(void)
3928{
3929 return 1; /* Success */
3930}
3931#endif
3932
3933
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003934/* C API table - always add new things to the end for binary
3935 compatibility. */
3936static
3937PySocketModule_APIObject PySocketModuleAPI =
3938{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003939 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003940 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003941};
3942
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003943
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003944/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003945
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003946 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003947 "socket.py" which implements some additional functionality.
3948 The import of "_socket" may fail with an ImportError exception if
3949 os-specific initialization fails. On Windows, this does WINSOCK
3950 initialization. When WINSOCK is initialized succesfully, a call to
3951 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003952*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003954PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003955"Implementation module for socket operations.\n\
3956\n\
3957See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003958
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003959PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003960init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003961{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003962 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003963
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003964 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003965 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003966
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00003967 Py_Type(&sock_type) = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003968 m = Py_InitModule3(PySocket_MODULE_NAME,
3969 socket_methods,
3970 socket_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00003971 if (m == NULL)
3972 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003973
Gregory P. Smithc111d9f2007-09-09 23:55:55 +00003974 socket_error = PyErr_NewException("socket.error",
3975 PyExc_IOError, NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003976 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003977 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003978 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003979 Py_INCREF(socket_error);
3980 PyModule_AddObject(m, "error", socket_error);
3981 socket_herror = PyErr_NewException("socket.herror",
3982 socket_error, NULL);
3983 if (socket_herror == NULL)
3984 return;
3985 Py_INCREF(socket_herror);
3986 PyModule_AddObject(m, "herror", socket_herror);
3987 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003988 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003989 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003990 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003991 Py_INCREF(socket_gaierror);
3992 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003993 socket_timeout = PyErr_NewException("socket.timeout",
3994 socket_error, NULL);
3995 if (socket_timeout == NULL)
3996 return;
3997 Py_INCREF(socket_timeout);
3998 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003999 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00004000 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004001 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004002 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004003 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00004004 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004005 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004006 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00004007
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004008#ifdef ENABLE_IPV6
4009 has_ipv6 = Py_True;
4010#else
4011 has_ipv6 = Py_False;
4012#endif
4013 Py_INCREF(has_ipv6);
4014 PyModule_AddObject(m, "has_ipv6", has_ipv6);
4015
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004016 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00004017 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00004018 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
4019 ) != 0)
4020 return;
4021
Guido van Rossum09be4091999-08-09 14:40:40 +00004022 /* Address families (we only support AF_INET and AF_UNIX) */
4023#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00004024 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004025#endif
Fred Drake4baedc12002-04-01 14:53:37 +00004026 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004027#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004028 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004029#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004030#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00004031 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004032#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004033#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004034 /* Amateur Radio AX.25 */
4035 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004036#endif
4037#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004038 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004039#endif
4040#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00004041 /* Appletalk DDP */
4042 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004043#endif
4044#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004045 /* Amateur radio NetROM */
4046 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004047#endif
4048#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00004049 /* Multiprotocol bridge */
4050 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004051#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004052#ifdef AF_ATMPVC
4053 /* ATM PVCs */
4054 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
4055#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004056#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00004057 /* Reserved for Werner's ATM */
4058 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004059#endif
4060#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00004061 /* Reserved for X.25 project */
4062 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004063#endif
4064#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004065 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004066#endif
4067#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004068 /* Amateur Radio X.25 PLP */
4069 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004070#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004071#ifdef AF_DECnet
4072 /* Reserved for DECnet project */
4073 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
4074#endif
4075#ifdef AF_NETBEUI
4076 /* Reserved for 802.2LLC project */
4077 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
4078#endif
4079#ifdef AF_SECURITY
4080 /* Security callback pseudo AF */
4081 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
4082#endif
4083#ifdef AF_KEY
4084 /* PF_KEY key management API */
4085 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
4086#endif
4087#ifdef AF_NETLINK
4088 /* */
4089 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
Martin v. Löwis11017b12006-01-14 18:12:57 +00004090 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004091#ifdef NETLINK_SKIP
Martin v. Löwis11017b12006-01-14 18:12:57 +00004092 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004093#endif
4094#ifdef NETLINK_W1
4095 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
4096#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004097 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4098 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004099#ifdef NETLINK_TCPDIAG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004100 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004101#endif
4102#ifdef NETLINK_NFLOG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004103 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004104#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004105#ifdef NETLINK_XFRM
Martin v. Löwis11017b12006-01-14 18:12:57 +00004106 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004107#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004108#ifdef NETLINK_ARPD
Martin v. Löwis11017b12006-01-14 18:12:57 +00004109 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004110#endif
4111#ifdef NETLINK_ROUTE6
Martin v. Löwis11017b12006-01-14 18:12:57 +00004112 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004113#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004114 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004115#ifdef NETLINK_DNRTMSG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004116 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004117#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004118#ifdef NETLINK_TAPBASE
Martin v. Löwis11017b12006-01-14 18:12:57 +00004119 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004120#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004121#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004122#ifdef AF_ROUTE
4123 /* Alias to emulate 4.4BSD */
4124 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
4125#endif
4126#ifdef AF_ASH
4127 /* Ash */
4128 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
4129#endif
4130#ifdef AF_ECONET
4131 /* Acorn Econet */
4132 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
4133#endif
4134#ifdef AF_ATMSVC
4135 /* ATM SVCs */
4136 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
4137#endif
4138#ifdef AF_SNA
4139 /* Linux SNA Project (nutters!) */
4140 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
4141#endif
4142#ifdef AF_IRDA
4143 /* IRDA sockets */
4144 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
4145#endif
4146#ifdef AF_PPPOX
4147 /* PPPoX sockets */
4148 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
4149#endif
4150#ifdef AF_WANPIPE
4151 /* Wanpipe API Sockets */
4152 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
4153#endif
4154#ifdef AF_LLC
4155 /* Linux LLC */
4156 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
4157#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004158
Hye-Shik Chang81268602004-02-02 06:05:24 +00004159#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00004160 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4161 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004162 PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);
4163 PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004164 PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004165#if !defined(__FreeBSD__)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004166 PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);
4167 PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);
Martin v. Löwis12af0482004-01-31 12:34:17 +00004168 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004169#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004170 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004171 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
4172 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00004173#endif
4174
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00004175#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00004176 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
4177 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
4178 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
4179 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
4180 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
4181 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
4182 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4183 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4184 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004185#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004186
4187 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00004188 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4189 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004190/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004191 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4192 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004193#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004194 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004195#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004196
4197#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004198 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004199#endif
4200#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004201 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004202#endif
4203#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004204 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004205#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004206#ifdef SO_EXCLUSIVEADDRUSE
4207 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4208#endif
4209
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004210#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004211 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004212#endif
4213#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004214 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004215#endif
4216#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004217 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004218#endif
4219#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004220 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004221#endif
4222#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004223 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004224#endif
4225#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004226 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004227#endif
4228#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004229 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004230#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004231#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004232 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004233#endif
4234#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004235 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004236#endif
4237#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004238 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004239#endif
4240#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004241 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004242#endif
4243#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004244 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004245#endif
4246#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004247 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004248#endif
4249#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004250 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004251#endif
4252#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004253 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004254#endif
4255
4256 /* Maximum number of connections for "listen" */
4257#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004258 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004259#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004260 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004261#endif
4262
4263 /* Flags for send, recv */
4264#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004265 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004266#endif
4267#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004268 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004269#endif
4270#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004271 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004272#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004273#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004274 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004275#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004276#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004277 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004278#endif
4279#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004280 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004281#endif
4282#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004283 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004284#endif
4285#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004286 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004287#endif
4288#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004289 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004290#endif
4291#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004292 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004293#endif
4294
4295 /* Protocol level and numbers, usable for [gs]etsockopt */
4296#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004297 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004298#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004299#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004300 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004301#else
Fred Drake4baedc12002-04-01 14:53:37 +00004302 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004303#endif
4304#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004305 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004306#endif
4307#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004308 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004309#endif
4310#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004311 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004312#endif
4313#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004314 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004315#endif
4316#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004317 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004318#endif
4319#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004320 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004321#else
Fred Drake4baedc12002-04-01 14:53:37 +00004322 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004323#endif
4324#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004325 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004326#else
Fred Drake4baedc12002-04-01 14:53:37 +00004327 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004328#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004329#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004330 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004331#else
Fred Drake4baedc12002-04-01 14:53:37 +00004332 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004333#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004334#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004335 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004336#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004337#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004338 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004339#else
Fred Drake4baedc12002-04-01 14:53:37 +00004340 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004341#endif
4342#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004343 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004344#endif
4345#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004346 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004347#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004348#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004349 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004350#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004351#ifdef IPPROTO_IPV6
4352 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4353#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004354#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004355 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004356#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004357#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004358 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004359#else
Fred Drake4baedc12002-04-01 14:53:37 +00004360 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004361#endif
4362#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004363 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004364#endif
4365#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004366 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004367#endif
4368#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004369 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004370#else
Fred Drake4baedc12002-04-01 14:53:37 +00004371 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004372#endif
4373#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004374 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004375#endif
4376#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004377 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004378#endif
4379#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004380 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004381#endif
4382#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004383 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004384#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004385#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004386 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004387#endif
4388#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004389 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004390#endif
4391#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004392 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004393#endif
4394#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004395 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004396#endif
4397#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004398 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004399#endif
4400#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004401 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004402#endif
4403#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004404 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004405#endif
4406#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004407 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004408#endif
4409#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004410 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004411#endif
4412#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004413 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004414#endif
4415#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004416 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004417#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004418#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004419 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004420#endif
4421#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004422 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004423#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004424#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004425 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004426#endif
4427#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004428 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004429#endif
4430#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004431 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004432#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004433#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004434 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004435#endif
4436/**/
4437#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004438 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004439#else
Fred Drake4baedc12002-04-01 14:53:37 +00004440 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004441#endif
4442#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004443 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004444#endif
4445
4446 /* Some port configuration */
4447#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004448 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004449#else
Fred Drake4baedc12002-04-01 14:53:37 +00004450 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004451#endif
4452#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004453 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004454#else
Fred Drake4baedc12002-04-01 14:53:37 +00004455 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004456#endif
4457
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004458 /* Some reserved IP v.4 addresses */
4459#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004460 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004461#else
Fred Drake4baedc12002-04-01 14:53:37 +00004462 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004463#endif
4464#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004465 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004466#else
Fred Drake4baedc12002-04-01 14:53:37 +00004467 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004468#endif
4469#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004470 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004471#else
Fred Drake4baedc12002-04-01 14:53:37 +00004472 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004473#endif
4474#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004475 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004476#else
Fred Drake4baedc12002-04-01 14:53:37 +00004477 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004478#endif
4479#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004480 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4481 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004482#else
Fred Drake4baedc12002-04-01 14:53:37 +00004483 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004484#endif
4485#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004486 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4487 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004488#else
Fred Drake4baedc12002-04-01 14:53:37 +00004489 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004490#endif
4491#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004492 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004493#else
Fred Drake4baedc12002-04-01 14:53:37 +00004494 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004495#endif
4496
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004497 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004498#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004499 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004500#endif
4501#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004502 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004503#endif
4504#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004505 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004506#endif
4507#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004508 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004509#endif
4510#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004511 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004512#endif
4513#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004514 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004515#endif
4516#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004517 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004518#endif
4519#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004520 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004521#endif
4522#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004523 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004524#endif
4525#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004526 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004527#endif
4528#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004529 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004530#endif
4531#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004532 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004533#endif
4534#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004535 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004536#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004537#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004538 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4539 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004540#endif
4541#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004542 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4543 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004544#endif
4545#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004546 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004547#endif
4548
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004549 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4550#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004551 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004552#endif
4553#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004554 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004555#endif
4556#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004557 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004558#endif
4559#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004560 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004561#endif
4562#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004563 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004564#endif
4565#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004566 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004567#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004568 /* Additional IPV6 socket options, defined in RFC 3493 */
4569#ifdef IPV6_V6ONLY
4570 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4571#endif
4572 /* Advanced IPV6 socket options, from RFC 3542 */
4573#ifdef IPV6_CHECKSUM
4574 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4575#endif
4576#ifdef IPV6_DONTFRAG
4577 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4578#endif
4579#ifdef IPV6_DSTOPTS
4580 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4581#endif
4582#ifdef IPV6_HOPLIMIT
4583 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4584#endif
4585#ifdef IPV6_HOPOPTS
4586 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4587#endif
4588#ifdef IPV6_NEXTHOP
4589 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4590#endif
4591#ifdef IPV6_PATHMTU
4592 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4593#endif
4594#ifdef IPV6_PKTINFO
4595 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4596#endif
4597#ifdef IPV6_RECVDSTOPTS
4598 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4599#endif
4600#ifdef IPV6_RECVHOPLIMIT
4601 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4602#endif
4603#ifdef IPV6_RECVHOPOPTS
4604 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4605#endif
4606#ifdef IPV6_RECVPKTINFO
4607 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4608#endif
4609#ifdef IPV6_RECVRTHDR
4610 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4611#endif
4612#ifdef IPV6_RECVTCLASS
4613 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4614#endif
4615#ifdef IPV6_RTHDR
4616 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4617#endif
4618#ifdef IPV6_RTHDRDSTOPTS
4619 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4620#endif
4621#ifdef IPV6_RTHDR_TYPE_0
4622 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4623#endif
4624#ifdef IPV6_RECVPATHMTU
4625 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4626#endif
4627#ifdef IPV6_TCLASS
4628 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4629#endif
4630#ifdef IPV6_USE_MIN_MTU
4631 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4632#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004633
Guido van Rossum09be4091999-08-09 14:40:40 +00004634 /* TCP options */
4635#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004636 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004637#endif
4638#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004639 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004640#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004641#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004642 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004643#endif
4644#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004645 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004646#endif
4647#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004648 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004649#endif
4650#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004651 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004652#endif
4653#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004654 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004655#endif
4656#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004657 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004658#endif
4659#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004660 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004661#endif
4662#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004663 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004664#endif
4665#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004666 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004667#endif
4668#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004669 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004670#endif
4671
Guido van Rossum09be4091999-08-09 14:40:40 +00004672
4673 /* IPX options */
4674#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004675 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004676#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004677
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004678 /* get{addr,name}info parameters */
4679#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004680 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004681#endif
4682#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004683 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004684#endif
4685#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004686 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004687#endif
4688#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004689 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004690#endif
4691#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004692 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004693#endif
4694#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004695 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004696#endif
4697#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004698 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004699#endif
4700#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004701 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004702#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004703#ifdef EAI_OVERFLOW
4704 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4705#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004706#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004707 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004708#endif
4709#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004710 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004711#endif
4712#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004713 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004714#endif
4715#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004716 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004717#endif
4718#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004719 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004720#endif
4721#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004722 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004723#endif
4724#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004725 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004726#endif
4727#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004728 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004729#endif
4730#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004731 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004732#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004733#ifdef AI_NUMERICSERV
4734 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4735#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004736#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004737 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004738#endif
4739#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004740 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004741#endif
4742#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004743 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004744#endif
4745#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004746 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004747#endif
4748#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004749 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004750#endif
4751#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004752 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004753#endif
4754#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004755 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004756#endif
4757#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004758 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004759#endif
4760#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004761 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004762#endif
4763#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004764 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004765#endif
4766#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004767 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004768#endif
4769#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004770 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004771#endif
4772#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004773 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004774#endif
4775
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004776 /* shutdown() parameters */
4777#ifdef SHUT_RD
4778 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4779#elif defined(SD_RECEIVE)
4780 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4781#else
4782 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4783#endif
4784#ifdef SHUT_WR
4785 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4786#elif defined(SD_SEND)
4787 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4788#else
4789 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4790#endif
4791#ifdef SHUT_RDWR
4792 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4793#elif defined(SD_BOTH)
4794 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4795#else
4796 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4797#endif
4798
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004799 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004800#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4801 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004802#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004803}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004804
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004805
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004806#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00004807#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004808
4809/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004810/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004811
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004812int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004813inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004814{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004815 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004816 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004817 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004818 if (packed_addr == INADDR_NONE)
4819 return 0;
4820 memcpy(dst, &packed_addr, 4);
4821 return 1;
4822 }
4823 /* Should set errno to EAFNOSUPPORT */
4824 return -1;
4825}
4826
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004827const char *
4828inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004829{
4830 if (af == AF_INET) {
4831 struct in_addr packed_addr;
4832 if (size < 16)
4833 /* Should set errno to ENOSPC. */
4834 return NULL;
4835 memcpy(&packed_addr, src, sizeof(packed_addr));
4836 return strncpy(dst, inet_ntoa(packed_addr), size);
4837 }
4838 /* Should set errno to EAFNOSUPPORT */
4839 return NULL;
4840}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004841
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004842#endif
Christian Heimesb6150692007-11-15 23:37:07 +00004843#endif