blob: c9dd4a3a395490b3bb7f2857d9a2412085bc2bf1 [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 Rossum83a072d2002-09-03 19:10:18 +000022- socket.fromfd(fd, family, type[, proto]) --> new socket object (created
23 from an existing file descriptor)
Guido van Rossum30a685f1991-06-27 15:51:29 +000024- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000025- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000026- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000027- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000028- socket.getservbyname(servicename[, protocolname]) --> port number
29- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum83a072d2002-09-03 19:10:18 +000030- socket.socket([family[, type [, proto]]]) --> new socket object
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
37 --> List of (family, socktype, proto, canonname, sockaddr)
38- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000045- an Internet socket address is a pair (hostname, port)
46 where hostname can be anything recognized by gethostbyname()
47 (including the dd.dd.dd.dd notation) and port is in host byte order
48- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000049- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000050- an AF_PACKET socket address is a tuple containing a string
51 specifying the ethernet interface and an integer specifying
52 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000053 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000054 specify packet-type and ha-type/addr.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000055
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000056Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000058- names starting with sock_ are socket object methods
59- names starting with socket_ are module-level functions
60- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000061
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062*/
63
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000064#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000065#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000066
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000067#undef MAX
68#define MAX(x, y) ((x) < (y) ? (y) : (x))
69
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000070/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000071PyDoc_STRVAR(sock_doc,
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000072"socket([family[, type[, proto]]]) -> socket object\n\
73\n\
74Open a socket of the given type. The family argument specifies the\n\
75address family; it defaults to AF_INET. The type argument specifies\n\
76whether this is a stream (SOCK_STREAM, this is the default)\n\
77or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
78specifying the default protocol. Keyword arguments are accepted.\n\
79\n\
80A socket object represents one endpoint of a network connection.\n\
81\n\
82Methods of socket objects (keyword arguments not allowed):\n\
83\n\
84accept() -- accept a connection, returning new socket and client address\n\
85bind(addr) -- bind the socket to a local address\n\
86close() -- close the socket\n\
87connect(addr) -- connect the socket to a remote address\n\
88connect_ex(addr) -- connect, return an error code instead of an exception\n\
89dup() -- return a new socket object identical to the current one [*]\n\
90fileno() -- return underlying file descriptor\n\
91getpeername() -- return remote address [*]\n\
92getsockname() -- return local address\n\
93getsockopt(level, optname[, buflen]) -- get socket options\n\
94gettimeout() -- return timeout or None\n\
95listen(n) -- start listening for incoming connections\n\
96makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\
97recv(buflen[, flags]) -- receive data\n\
98recvfrom(buflen[, flags]) -- receive data and sender's address\n\
99sendall(data[, flags]) -- send all data\n\
100send(data[, flags]) -- send data, may not send all of it\n\
101sendto(data[, flags], addr) -- send data to a given address\n\
102setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
103setsockopt(level, optname, value) -- set socket options\n\
104settimeout(None | float) -- set or clear the timeout\n\
105shutdown(how) -- shut down traffic in one or both directions\n\
106\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000107 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000108
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000109/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000110 I hope some day someone can clean this up please... */
111
Guido van Rossum9376b741999-09-15 22:01:40 +0000112/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
113 script doesn't get this right, so we hardcode some platform checks below.
114 On the other hand, not all Linux versions agree, so there the settings
115 computed by the configure script are needed! */
116
117#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000118# undef HAVE_GETHOSTBYNAME_R_3_ARG
119# undef HAVE_GETHOSTBYNAME_R_5_ARG
120# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000121#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000122
Guido van Rossum7a122991999-04-13 04:07:32 +0000123#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000124# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000125#endif
126
Guido van Rossume7de2061999-03-24 17:24:33 +0000127#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000128# if defined(_AIX) || defined(__osf__)
129# define HAVE_GETHOSTBYNAME_R_3_ARG
130# elif defined(__sun) || defined(__sgi)
131# define HAVE_GETHOSTBYNAME_R_5_ARG
132# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000133/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000134# else
135# undef HAVE_GETHOSTBYNAME_R
136# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000137#endif
138
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000139#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
140 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000141# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000142#endif
143
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000144/* To use __FreeBSD_version */
145#ifdef HAVE_SYS_PARAM_H
146#include <sys/param.h>
147#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000148/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000149 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000150#if defined(WITH_THREAD) && (defined(__APPLE__) || \
151 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Just van Rossum16e426b2003-05-09 08:12:00 +0000152 defined(__OpenBSD__) || defined(__NetBSD__) || !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000153#define USE_GETADDRINFO_LOCK
154#endif
155
156#ifdef USE_GETADDRINFO_LOCK
157#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
158#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
159#else
160#define ACQUIRE_GETADDRINFO_LOCK
161#define RELEASE_GETADDRINFO_LOCK
162#endif
163
164#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000165# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000166#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000167
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000168#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000169# include <types.h>
170# include <io.h>
171# include <sys/ioctl.h>
172# include <utils.h>
173# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000174#endif
175
Martin v. Löwis9e437302002-12-06 12:57:26 +0000176#if defined(__VMS)
177#if ! defined(_SOCKADDR_LEN)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000178# ifdef getaddrinfo
179# undef getaddrinfo
180# endif
181# include "TCPIP_IOCTL_ROUTINE"
182#else
183# include <ioctl.h>
184#endif
Martin v. Löwis9e437302002-12-06 12:57:26 +0000185#endif
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000186
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000187#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000188# define INCL_DOS
189# define INCL_DOSERRORS
190# define INCL_NOPMAPI
191# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000192#endif
193
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000194#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000195/* make sure that the reentrant (gethostbyaddr_r etc)
196 functions are declared correctly if compiling with
197 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000198
199/* XXX Using _SGIAPI is the wrong thing,
200 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000201#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000202#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000203
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000204#undef _XOPEN_SOURCE
205#include <sys/socket.h>
206#include <sys/types.h>
207#include <netinet/in.h>
208#ifdef _SS_ALIGNSIZE
209#define HAVE_GETADDRINFO 1
210#define HAVE_GETNAMEINFO 1
211#endif
212
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000213#define HAVE_INET_PTON
214#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000215#endif
216
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000217/* Irix 6.5 fails to define this variable at all. This is needed
218 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000219 are just busted. Same thing for Solaris. */
220#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000221#define INET_ADDRSTRLEN 16
222#endif
223
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000224/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000225#include <sys/types.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000227/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000228#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000229#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230
231/* Addressing includes */
232
Guido van Rossum6f489d91996-06-28 20:15:15 +0000233#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234
235/* Non-MS WINDOWS includes */
236# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000237
Guido van Rossum9376b741999-09-15 22:01:40 +0000238/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239# ifdef __BEOS__
240# include <net/netdb.h>
241# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
242# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000243typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000244# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000245# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000246# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000247
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000248# ifndef RISCOS
249# include <fcntl.h>
250# else
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000251# include <sys/ioctl.h>
252# include <socklib.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000253# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000254int h_errno; /* not used */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000255# define INET_ADDRSTRLEN 16
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000256# endif
257
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000258#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000259
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000260/* MS_WINDOWS includes */
261# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000262
Jeremy Hylton22308652001-02-02 03:23:09 +0000263#endif
264
Skip Montanaro7befb992004-02-10 16:50:21 +0000265#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000266
267#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000269#endif
270
Neal Norwitz39d22e52002-11-02 19:55:21 +0000271#ifndef O_NONBLOCK
272# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000273#endif
274
Trent Micka708d6e2004-09-07 17:48:26 +0000275/* include Python's addrinfo.h unless it causes trouble */
276#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
277 /* Do not include addinfo.h on some newer IRIX versions.
278 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
279 * for example, but not by 6.5.10.
280 */
281#elif defined(_MSC_VER) && _MSC_VER>1200
282 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
283 * EAI_* constants are defined in (the already included) ws2tcpip.h.
284 */
285#else
286# include "addrinfo.h"
287#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000288
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000289#ifndef HAVE_INET_PTON
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000290int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000291const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000292#endif
293
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000294#ifdef __APPLE__
295/* On OS X, getaddrinfo returns no error indication of lookup
296 failure, so we must use the emulation instead of the libinfo
297 implementation. Unfortunately, performing an autoconf test
298 for this bug would require DNS access for the machine performing
299 the configuration, which is not acceptable. Therefore, we
300 determine the bug just by checking for __APPLE__. If this bug
301 gets ever fixed, perhaps checking for sys/version.h would be
302 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000303#ifndef HAVE_GETNAMEINFO
304/* This bug seems to be fixed in Jaguar. Ths easiest way I could
305 Find to check for Jaguar is that it has getnameinfo(), which
306 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000307#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000308#endif
Jack Jansen84262fb2002-07-02 14:40:42 +0000309#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000310
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000311/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000312#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000313/* avoid clashes with the C library definition of the symbol. */
314#define getaddrinfo fake_getaddrinfo
315#define gai_strerror fake_gai_strerror
316#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000317#include "getaddrinfo.c"
318#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000319#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000320#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000321#include "getnameinfo.c"
322#endif
323
Guido van Rossumbcc20741998-08-04 22:53:56 +0000324#if defined(MS_WINDOWS) || defined(__BEOS__)
325/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000326/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000327#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000328#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000329#endif
330
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000331#ifdef MS_WIN32
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000332#define EAFNOSUPPORT WSAEAFNOSUPPORT
333#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000334#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000335
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000336#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000337#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000338#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000339#endif
340
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000341#ifndef SOCKETCLOSE
342#define SOCKETCLOSE close
343#endif
344
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000345#ifdef __VMS
346/* TCP/IP Services for VMS uses a maximum send/revc buffer length of 65535 */
347#define SEGMENT_SIZE 65535
348#endif
349
Hye-Shik Chang81268602004-02-02 06:05:24 +0000350#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
351#define USE_BLUETOOTH 1
352#if defined(__FreeBSD__)
353#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
354#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
355#define sockaddr_l2 sockaddr_l2cap
356#define sockaddr_rc sockaddr_rfcomm
357#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
358#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
359#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
360#else
Anthony Baxter5d7c0672004-02-16 05:35:28 +0000361#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000362#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
363#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
364#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
365#endif
366#endif
367
Martin v. Löwise9416172003-05-03 10:12:45 +0000368/*
369 * Constants for getnameinfo()
370 */
371#if !defined(NI_MAXHOST)
372#define NI_MAXHOST 1025
373#endif
374#if !defined(NI_MAXSERV)
375#define NI_MAXSERV 32
376#endif
377
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000378/* XXX There's a problem here: *static* functions are not supposed to have
379 a Py prefix (or use CapitalizedWords). Later... */
380
Guido van Rossum30a685f1991-06-27 15:51:29 +0000381/* Global variable holding the exception type for errors detected
382 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000383static PyObject *socket_error;
384static PyObject *socket_herror;
385static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000386static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000387
Guido van Rossum48a680c2001-03-02 06:34:14 +0000388#ifdef RISCOS
389/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
390static int taskwindow;
391#endif
392
Tim Peters643a7fc2002-02-17 04:13:21 +0000393/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000394 The sock_type variable contains pointers to various functions,
395 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000396 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000397static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000398
Neal Norwitz082b2df2006-02-07 07:04:46 +0000399/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000400#ifdef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
401/* Platform can select file descriptors beyond FD_SETSIZE */
402#define IS_SELECTABLE(s) 1
403#else
404/* POSIX says selecting file descriptors beyond FD_SETSIZE
405 has undefined behaviour. */
Neal Norwitz082b2df2006-02-07 07:04:46 +0000406#define IS_SELECTABLE(s) ((s)->sock_fd < FD_SETSIZE)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000407#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000408
409static PyObject*
410select_error(void)
411{
412 PyErr_SetString(socket_error, "unable to select on socket");
413 return NULL;
414}
415
Guido van Rossum30a685f1991-06-27 15:51:29 +0000416/* Convenience function to raise an error according to errno
417 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000418
Guido van Rossum73624e91994-10-10 17:59:00 +0000419static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000420set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000421{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000422#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000423 int err_no = WSAGetLastError();
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000424 static struct {
425 int no;
426 const char *msg;
427 } *msgp, msgs[] = {
428 {WSAEINTR, "Interrupted system call"},
429 {WSAEBADF, "Bad file descriptor"},
430 {WSAEACCES, "Permission denied"},
431 {WSAEFAULT, "Bad address"},
432 {WSAEINVAL, "Invalid argument"},
433 {WSAEMFILE, "Too many open files"},
434 {WSAEWOULDBLOCK,
435 "The socket operation could not complete "
436 "without blocking"},
437 {WSAEINPROGRESS, "Operation now in progress"},
438 {WSAEALREADY, "Operation already in progress"},
439 {WSAENOTSOCK, "Socket operation on non-socket"},
440 {WSAEDESTADDRREQ, "Destination address required"},
441 {WSAEMSGSIZE, "Message too long"},
442 {WSAEPROTOTYPE, "Protocol wrong type for socket"},
443 {WSAENOPROTOOPT, "Protocol not available"},
444 {WSAEPROTONOSUPPORT, "Protocol not supported"},
445 {WSAESOCKTNOSUPPORT, "Socket type not supported"},
446 {WSAEOPNOTSUPP, "Operation not supported"},
447 {WSAEPFNOSUPPORT, "Protocol family not supported"},
448 {WSAEAFNOSUPPORT, "Address family not supported"},
449 {WSAEADDRINUSE, "Address already in use"},
450 {WSAEADDRNOTAVAIL, "Can't assign requested address"},
451 {WSAENETDOWN, "Network is down"},
452 {WSAENETUNREACH, "Network is unreachable"},
453 {WSAENETRESET, "Network dropped connection on reset"},
454 {WSAECONNABORTED, "Software caused connection abort"},
455 {WSAECONNRESET, "Connection reset by peer"},
456 {WSAENOBUFS, "No buffer space available"},
457 {WSAEISCONN, "Socket is already connected"},
458 {WSAENOTCONN, "Socket is not connected"},
459 {WSAESHUTDOWN, "Can't send after socket shutdown"},
460 {WSAETOOMANYREFS, "Too many references: can't splice"},
461 {WSAETIMEDOUT, "Operation timed out"},
462 {WSAECONNREFUSED, "Connection refused"},
463 {WSAELOOP, "Too many levels of symbolic links"},
464 {WSAENAMETOOLONG, "File name too long"},
465 {WSAEHOSTDOWN, "Host is down"},
466 {WSAEHOSTUNREACH, "No route to host"},
467 {WSAENOTEMPTY, "Directory not empty"},
468 {WSAEPROCLIM, "Too many processes"},
469 {WSAEUSERS, "Too many users"},
470 {WSAEDQUOT, "Disc quota exceeded"},
471 {WSAESTALE, "Stale NFS file handle"},
472 {WSAEREMOTE, "Too many levels of remote in path"},
473 {WSASYSNOTREADY, "Network subsystem is unvailable"},
474 {WSAVERNOTSUPPORTED, "WinSock version is not supported"},
475 {WSANOTINITIALISED,
476 "Successful WSAStartup() not yet performed"},
477 {WSAEDISCON, "Graceful shutdown in progress"},
478 /* Resolver errors */
479 {WSAHOST_NOT_FOUND, "No such host is known"},
480 {WSATRY_AGAIN, "Host not found, or server failed"},
481 {WSANO_RECOVERY, "Unexpected server error encountered"},
482 {WSANO_DATA, "Valid name without requested data"},
483 {WSANO_ADDRESS, "No address, look for MX record"},
484 {0, NULL}
485 };
Mark Hammond46a733d2000-07-24 01:45:11 +0000486 if (err_no) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000487 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000488 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000489
Mark Hammond46a733d2000-07-24 01:45:11 +0000490 for (msgp = msgs; msgp->msg; msgp++) {
491 if (err_no == msgp->no) {
492 msg = msgp->msg;
493 break;
494 }
495 }
496
497 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000498 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000499 PyErr_SetObject(socket_error, v);
Guido van Rossum73624e91994-10-10 17:59:00 +0000500 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000501 }
502 return NULL;
503 }
504 else
505#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000506
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000507#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000508 if (sock_errno() != NO_ERROR) {
509 APIRET rc;
510 ULONG msglen;
511 char outbuf[100];
512 int myerrorcode = sock_errno();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000513
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000514 /* Retrieve socket-related error message from MPTN.MSG file */
515 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
516 myerrorcode - SOCBASEERR + 26,
517 "mptn.msg",
518 &msglen);
519 if (rc == NO_ERROR) {
520 PyObject *v;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000521
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000522 /* OS/2 doesn't guarantee a terminator */
523 outbuf[msglen] = '\0';
524 if (strlen(outbuf) > 0) {
525 /* If non-empty msg, trim CRLF */
526 char *lastc = &outbuf[ strlen(outbuf)-1 ];
Neal Norwitz30b5c5d2005-12-19 06:05:18 +0000527 while (lastc > outbuf &&
528 isspace(Py_CHARMASK(*lastc))) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000529 /* Trim trailing whitespace (CRLF) */
530 *lastc-- = '\0';
531 }
532 }
533 v = Py_BuildValue("(is)", myerrorcode, outbuf);
534 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000535 PyErr_SetObject(socket_error, v);
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000536 Py_DECREF(v);
537 }
538 return NULL;
539 }
540 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000541#endif
542
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000543#if defined(RISCOS)
544 if (_inet_error.errnum != NULL) {
545 PyObject *v;
546 v = Py_BuildValue("(is)", errno, _inet_err());
547 if (v != NULL) {
548 PyErr_SetObject(socket_error, v);
549 Py_DECREF(v);
550 }
551 return NULL;
552 }
553#endif
554
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000555 return PyErr_SetFromErrno(socket_error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556}
557
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000560set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561{
562 PyObject *v;
563
564#ifdef HAVE_HSTRERROR
565 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
566#else
567 v = Py_BuildValue("(is)", h_error, "host not found");
568#endif
569 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000570 PyErr_SetObject(socket_herror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571 Py_DECREF(v);
572 }
573
574 return NULL;
575}
576
577
578static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000579set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580{
581 PyObject *v;
582
Martin v. Löwis272cb402002-03-01 08:31:07 +0000583#ifdef EAI_SYSTEM
584 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585 if (error == EAI_SYSTEM)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000586 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000587#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000588
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000589#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000590 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000591#else
592 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
593#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000594 if (v != NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000595 PyErr_SetObject(socket_gaierror, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000596 Py_DECREF(v);
597 }
598
599 return NULL;
600}
601
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000602/* Function to perform the setting of socket blocking mode
603 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000604static int
605internal_setblocking(PySocketSockObject *s, int block)
606{
607#ifndef RISCOS
608#ifndef MS_WINDOWS
609 int delay_flag;
610#endif
611#endif
612
613 Py_BEGIN_ALLOW_THREADS
614#ifdef __BEOS__
615 block = !block;
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000616 setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
617 (void *)(&block), sizeof(int));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618#else
619#ifndef RISCOS
620#ifndef MS_WINDOWS
621#if defined(PYOS_OS2) && !defined(PYCC_GCC)
622 block = !block;
623 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000624#elif defined(__VMS)
625 block = !block;
626 ioctl(s->sock_fd, FIONBIO, (char *)&block);
627#else /* !PYOS_OS2 && !_VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000628 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
629 if (block)
Neal Norwitz39d22e52002-11-02 19:55:21 +0000630 delay_flag &= (~O_NONBLOCK);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000631 else
Neal Norwitz39d22e52002-11-02 19:55:21 +0000632 delay_flag |= O_NONBLOCK;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000633 fcntl(s->sock_fd, F_SETFL, delay_flag);
634#endif /* !PYOS_OS2 */
635#else /* MS_WINDOWS */
636 block = !block;
637 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
638#endif /* MS_WINDOWS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000639#else /* RISCOS */
640 block = !block;
641 socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000642#endif /* RISCOS */
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000643#endif /* __BEOS__ */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644 Py_END_ALLOW_THREADS
645
646 /* Since these don't return anything */
647 return 1;
648}
649
Guido van Rossum11ba0942002-06-13 15:07:44 +0000650/* Do a select() on the socket, if necessary (sock_timeout > 0).
651 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000652 This does not raise an exception; we'll let our caller do that
653 after they've reacquired the interpreter lock.
654 Returns 1 on timeout, 0 otherwise. */
655static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000656internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000657{
658 fd_set fds;
659 struct timeval tv;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000660 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000661
Guido van Rossumad654902002-07-19 12:44:59 +0000662 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Guido van Rossum11ba0942002-06-13 15:07:44 +0000663 if (s->sock_timeout <= 0.0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000664 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000665
Guido van Rossumad654902002-07-19 12:44:59 +0000666 /* Guard against closed socket */
667 if (s->sock_fd < 0)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000668 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000669
Guido van Rossum67f7a382002-06-06 21:08:16 +0000670 /* Construct the arguments to select */
671 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000672 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000673 FD_ZERO(&fds);
674 FD_SET(s->sock_fd, &fds);
675
676 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000677 if (writing)
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000678 n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000679 else
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000680 n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
681 if (n == 0)
682 return 1;
683 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000684}
685
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000686/* Initialize a new socket object. */
687
Tim Petersa12b4cf2002-07-18 22:38:44 +0000688static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000689
Mark Hammond62b1ab12002-07-23 06:31:15 +0000690PyMODINIT_FUNC
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000691init_sockobject(PySocketSockObject *s,
692 SOCKET_T fd, int family, int type, int proto)
693{
694#ifdef RISCOS
695 int block = 1;
696#endif
697 s->sock_fd = fd;
698 s->sock_family = family;
699 s->sock_type = type;
700 s->sock_proto = proto;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000701 s->sock_timeout = defaulttimeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000702
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000703 s->errorhandler = &set_error;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000704
705 if (defaulttimeout >= 0.0)
706 internal_setblocking(s, 0);
707
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000708#ifdef RISCOS
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000709 if (taskwindow)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000710 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000711#endif
712}
713
714
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715/* Create a new socket object.
716 This just creates the object and initializes it.
717 If the creation fails, return NULL and set an exception (implicit
718 in NEWOBJ()). */
719
Guido van Rossum73624e91994-10-10 17:59:00 +0000720static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000721new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000722{
Guido van Rossum73624e91994-10-10 17:59:00 +0000723 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000724 s = (PySocketSockObject *)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000725 PyType_GenericNew(&sock_type, NULL, NULL);
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000726 if (s != NULL)
727 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000728 return s;
729}
730
Guido van Rossum30a685f1991-06-27 15:51:29 +0000731
Guido van Rossum48a680c2001-03-02 06:34:14 +0000732/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000733 thread to be in gethostbyname or getaddrinfo */
734#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
735PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000736#endif
737
738
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739/* Convert a string specifying a host name or one of a few symbolic
740 names to a numeric IP address. This usually calls gethostbyname()
741 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000742 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000743 an error occurred; then an exception is raised. */
744
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000745static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000746setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000747{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000748 struct addrinfo hints, *res;
749 int error;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000750 int d1, d2, d3, d4;
751 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000752
Guido van Rossuma376cc51996-12-05 23:43:35 +0000753 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000755 int siz;
756 memset(&hints, 0, sizeof(hints));
757 hints.ai_family = af;
758 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
759 hints.ai_flags = AI_PASSIVE;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000760 Py_BEGIN_ALLOW_THREADS
761 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000762 error = getaddrinfo(NULL, "0", &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +0000763 Py_END_ALLOW_THREADS
764 /* We assume that those thread-unsafe getaddrinfo() versions
765 *are* safe regarding their return value, ie. that a
766 subsequent call to getaddrinfo() does not destroy the
767 outcome of the first call. */
768 RELEASE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000769 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000770 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000771 return -1;
772 }
773 switch (res->ai_family) {
774 case AF_INET:
775 siz = 4;
776 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000777#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000778 case AF_INET6:
779 siz = 16;
780 break;
781#endif
782 default:
783 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000784 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000785 "unsupported address family");
786 return -1;
787 }
788 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000789 freeaddrinfo(res);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000790 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000791 "wildcard resolved to multiple address");
792 return -1;
793 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000794 if (res->ai_addrlen < addr_ret_size)
795 addr_ret_size = res->ai_addrlen;
796 memcpy(addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000797 freeaddrinfo(res);
798 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000799 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000800 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000801 struct sockaddr_in *sin;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +0000802 if (af != AF_INET && af != AF_UNSPEC) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000803 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000804 "address family mismatched");
805 return -1;
806 }
807 sin = (struct sockaddr_in *)addr_ret;
808 memset((void *) sin, '\0', sizeof(*sin));
809 sin->sin_family = AF_INET;
810#ifdef HAVE_SOCKADDR_SA_LEN
811 sin->sin_len = sizeof(*sin);
812#endif
813 sin->sin_addr.s_addr = INADDR_BROADCAST;
814 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000815 }
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000816 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
817 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
818 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
819 struct sockaddr_in *sin;
820 sin = (struct sockaddr_in *)addr_ret;
821 sin->sin_addr.s_addr = htonl(
822 ((long) d1 << 24) | ((long) d2 << 16) |
823 ((long) d3 << 8) | ((long) d4 << 0));
824 sin->sin_family = AF_INET;
825#ifdef HAVE_SOCKADDR_SA_LEN
826 sin->sin_len = sizeof(*sin);
827#endif
828 return 4;
829 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000830 memset(&hints, 0, sizeof(hints));
831 hints.ai_family = af;
Just van Rossum1040d2c2003-05-09 07:53:18 +0000832 Py_BEGIN_ALLOW_THREADS
833 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000834 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000835#if defined(__digital__) && defined(__unix__)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000836 if (error == EAI_NONAME && af == AF_UNSPEC) {
837 /* On Tru64 V5.1, numeric-to-addr conversion fails
838 if no address family is given. Assume IPv4 for now.*/
839 hints.ai_family = AF_INET;
840 error = getaddrinfo(name, NULL, &hints, &res);
841 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000842#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000843 Py_END_ALLOW_THREADS
844 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000845 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000846 set_gaierror(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847 return -1;
848 }
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000849 if (res->ai_addrlen < addr_ret_size)
850 addr_ret_size = res->ai_addrlen;
851 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000852 freeaddrinfo(res);
853 switch (addr_ret->sa_family) {
854 case AF_INET:
855 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000856#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000857 case AF_INET6:
858 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000859#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000860 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000861 PyErr_SetString(socket_error, "unknown address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000862 return -1;
863 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000864}
865
Guido van Rossum30a685f1991-06-27 15:51:29 +0000866
Guido van Rossum30a685f1991-06-27 15:51:29 +0000867/* Create a string object representing an IP address.
868 This is always a string of the form 'dd.dd.dd.dd' (with variable
869 size numbers). */
870
Guido van Rossum73624e91994-10-10 17:59:00 +0000871static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000872makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000873{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000874 char buf[NI_MAXHOST];
875 int error;
876
877 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
878 NI_NUMERICHOST);
879 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000880 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000881 return NULL;
882 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000883 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000884}
885
886
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000887#ifdef USE_BLUETOOTH
888/* Convert a string representation of a Bluetooth address into a numeric
889 address. Returns the length (6), or raises an exception and returns -1 if
890 an error occurred. */
891
892static int
893setbdaddr(char *name, bdaddr_t *bdaddr)
894{
895 unsigned int b0, b1, b2, b3, b4, b5;
896 char ch;
897 int n;
898
899 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
900 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
901 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
902 bdaddr->b[0] = b0;
903 bdaddr->b[1] = b1;
904 bdaddr->b[2] = b2;
905 bdaddr->b[3] = b3;
906 bdaddr->b[4] = b4;
907 bdaddr->b[5] = b5;
908 return 6;
909 } else {
910 PyErr_SetString(socket_error, "bad bluetooth address");
911 return -1;
912 }
913}
914
915/* Create a string representation of the Bluetooth address. This is always a
916 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
917 value (zero padded if necessary). */
918
919static PyObject *
920makebdaddr(bdaddr_t *bdaddr)
921{
922 char buf[(6 * 2) + 5 + 1];
923
924 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
925 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
926 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
927 return PyString_FromString(buf);
928}
929#endif
930
931
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932/* Create an object representing the given socket address,
933 suitable for passing it back to bind(), connect() etc.
934 The family field of the sockaddr structure is inspected
935 to determine what kind of address it really is. */
936
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000938static PyObject *
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000939makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000940{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000941 if (addrlen == 0) {
942 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 Py_INCREF(Py_None);
944 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000945 }
946
Guido van Rossumbcc20741998-08-04 22:53:56 +0000947#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000948 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000949 addr->sa_family = AF_INET;
950#endif
951
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952 switch (addr->sa_family) {
953
954 case AF_INET:
955 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000956 struct sockaddr_in *a;
957 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000958 PyObject *ret = NULL;
959 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000960 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000961 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
962 Py_DECREF(addrobj);
963 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000964 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000966
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +0000967#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968 case AF_UNIX:
969 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000971#ifdef linux
972 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
973 addrlen -= (sizeof(*a) - sizeof(a->sun_path));
974 return PyString_FromStringAndSize(a->sun_path,
975 addrlen);
976 }
977 else
978#endif /* linux */
979 {
980 /* regular NULL-terminated string */
981 return PyString_FromString(a->sun_path);
982 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000983 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000984#endif /* AF_UNIX */
985
Martin v. Löwis11017b12006-01-14 18:12:57 +0000986#if defined(AF_NETLINK)
987 case AF_NETLINK:
988 {
989 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
Martin v. Löwisd0560052006-01-15 07:49:20 +0000990 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +0000991 }
992#endif /* AF_NETLINK */
993
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000994#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000995 case AF_INET6:
996 {
997 struct sockaddr_in6 *a;
998 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
999 PyObject *ret = NULL;
1000 if (addrobj) {
1001 a = (struct sockaddr_in6 *)addr;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001002 ret = Py_BuildValue("Oiii",
1003 addrobj,
1004 ntohs(a->sin6_port),
1005 a->sin6_flowinfo,
1006 a->sin6_scope_id);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001007 Py_DECREF(addrobj);
1008 }
1009 return ret;
1010 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001011#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001012
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001013#ifdef USE_BLUETOOTH
1014 case AF_BLUETOOTH:
1015 switch (proto) {
1016
1017 case BTPROTO_L2CAP:
1018 {
1019 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1020 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1021 PyObject *ret = NULL;
1022 if (addrobj) {
1023 ret = Py_BuildValue("Oi",
1024 addrobj,
1025 _BT_L2_MEMB(a, psm));
1026 Py_DECREF(addrobj);
1027 }
1028 return ret;
1029 }
1030
1031 case BTPROTO_RFCOMM:
1032 {
1033 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1034 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1035 PyObject *ret = NULL;
1036 if (addrobj) {
1037 ret = Py_BuildValue("Oi",
1038 addrobj,
1039 _BT_RC_MEMB(a, channel));
1040 Py_DECREF(addrobj);
1041 }
1042 return ret;
1043 }
1044
1045#if !defined(__FreeBSD__)
1046 case BTPROTO_SCO:
1047 {
1048 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1049 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1050 }
1051#endif
1052
1053 }
1054#endif
1055
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001056#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001057 case AF_PACKET:
1058 {
1059 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1060 char *ifname = "";
1061 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001062 /* need to look up interface name give index */
1063 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +00001064 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001065 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +00001066 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +00001067 }
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001068 return Py_BuildValue("shbhs#",
1069 ifname,
1070 ntohs(a->sll_protocol),
1071 a->sll_pkttype,
1072 a->sll_hatype,
1073 a->sll_addr,
1074 a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +00001075 }
1076#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001077
Guido van Rossum30a685f1991-06-27 15:51:29 +00001078 /* More cases here... */
1079
1080 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +00001081 /* If we don't know the address family, don't raise an
1082 exception -- return it as a tuple. */
1083 return Py_BuildValue("is#",
1084 addr->sa_family,
1085 addr->sa_data,
1086 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001087
Guido van Rossum30a685f1991-06-27 15:51:29 +00001088 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001089}
1090
Guido van Rossum30a685f1991-06-27 15:51:29 +00001091
1092/* Parse a socket address argument according to the socket object's
1093 address family. Return 1 if the address was in the proper format,
1094 0 of not. The address is returned through addr_ret, its length
1095 through len_ret. */
1096
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001097static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001098getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001099 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001100{
Guido van Rossum30a685f1991-06-27 15:51:29 +00001101 switch (s->sock_family) {
1102
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001103#if defined(AF_UNIX)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001104 case AF_UNIX:
1105 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001106 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001107 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001108 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001109 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +00001110 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001111 return 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001112#ifdef linux
1113 if (len > 0 && path[0] == 0) {
1114 /* Linux abstract namespace extension */
1115 if (len > sizeof addr->sun_path) {
1116 PyErr_SetString(socket_error,
1117 "AF_UNIX path too long");
1118 return 0;
1119 }
1120 }
1121 else
1122#endif /* linux */
1123 {
1124 /* regular NULL-terminated string */
1125 if (len >= sizeof addr->sun_path) {
1126 PyErr_SetString(socket_error,
1127 "AF_UNIX path too long");
1128 return 0;
1129 }
1130 addr->sun_path[len] = 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001131 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001132 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001133 memcpy(addr->sun_path, path, len);
1134 *addr_ret = (struct sockaddr *) addr;
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001135#if defined(PYOS_OS2)
1136 *len_ret = sizeof(*addr);
1137#else
Guido van Rossum65af28a1996-06-11 18:36:33 +00001138 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Andrew MacIntyredaedf212004-04-11 12:03:57 +00001139#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001140 return 1;
1141 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001142#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001143
Martin v. Löwis11017b12006-01-14 18:12:57 +00001144#if defined(AF_NETLINK)
1145 case AF_NETLINK:
1146 {
1147 struct sockaddr_nl* addr;
1148 int pid, groups;
1149 addr = (struct sockaddr_nl *)&(s->sock_addr).nl;
1150 if (!PyTuple_Check(args)) {
1151 PyErr_Format(
1152 PyExc_TypeError,
1153 "getsockaddrarg: "
1154 "AF_NETLINK address must be tuple, not %.500s",
1155 args->ob_type->tp_name);
1156 return 0;
1157 }
1158 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1159 return 0;
1160 addr->nl_family = AF_NETLINK;
1161 addr->nl_pid = pid;
1162 addr->nl_groups = groups;
1163 *addr_ret = (struct sockaddr *) addr;
1164 *len_ret = sizeof(*addr);
1165 return 1;
1166 }
1167#endif
1168
Guido van Rossum30a685f1991-06-27 15:51:29 +00001169 case AF_INET:
1170 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001171 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001172 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001173 int port, result;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001174 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +00001175 if (!PyTuple_Check(args)) {
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001176 PyErr_Format(
1177 PyExc_TypeError,
1178 "getsockaddrarg: "
1179 "AF_INET address must be tuple, not %.500s",
1180 args->ob_type->tp_name);
Guido van Rossume4dad902000-12-01 13:13:11 +00001181 return 0;
1182 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00001183 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1184 "idna", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001185 return 0;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001186 result = setipaddr(host, (struct sockaddr *)addr,
1187 sizeof(*addr), AF_INET);
1188 PyMem_Free(host);
1189 if (result < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001190 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001191 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +00001192 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001193 *addr_ret = (struct sockaddr *) addr;
1194 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001195 return 1;
1196 }
1197
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001198#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001199 case AF_INET6:
1200 {
1201 struct sockaddr_in6* addr;
1202 char *host;
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001203 int port, flowinfo, scope_id, result;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001204 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
1205 flowinfo = scope_id = 0;
Martin v. Löwis2548c732003-04-18 10:39:54 +00001206 if (!PyArg_ParseTuple(args, "eti|ii",
1207 "idna", &host, &port, &flowinfo,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001208 &scope_id)) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001209 return 0;
1210 }
Martin v. Löwis5db099a2003-08-07 11:55:15 +00001211 result = setipaddr(host, (struct sockaddr *)addr,
1212 sizeof(*addr), AF_INET6);
1213 PyMem_Free(host);
1214 if (result < 0)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001215 return 0;
1216 addr->sin6_family = s->sock_family;
1217 addr->sin6_port = htons((short)port);
1218 addr->sin6_flowinfo = flowinfo;
1219 addr->sin6_scope_id = scope_id;
1220 *addr_ret = (struct sockaddr *) addr;
1221 *len_ret = sizeof *addr;
1222 return 1;
1223 }
1224#endif
1225
Hye-Shik Chang81268602004-02-02 06:05:24 +00001226#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001227 case AF_BLUETOOTH:
1228 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001229 switch (s->sock_proto) {
1230 case BTPROTO_L2CAP:
Martin v. Löwis12af0482004-01-31 12:34:17 +00001231 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001232 struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2);
1233 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001234
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001235 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1236 if (!PyArg_ParseTuple(args, "si", &straddr,
1237 &_BT_L2_MEMB(addr, psm))) {
1238 PyErr_SetString(socket_error, "getsockaddrarg: "
1239 "wrong format");
Martin v. Löwis12af0482004-01-31 12:34:17 +00001240 return 0;
1241 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001242 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1243 return 0;
1244
1245 *addr_ret = (struct sockaddr *) addr;
1246 *len_ret = sizeof *addr;
1247 return 1;
1248 }
1249 case BTPROTO_RFCOMM:
1250 {
1251 struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc);
1252 char *straddr;
1253
1254 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1255 if (!PyArg_ParseTuple(args, "si", &straddr,
1256 &_BT_RC_MEMB(addr, channel))) {
1257 PyErr_SetString(socket_error, "getsockaddrarg: "
1258 "wrong format");
1259 return 0;
1260 }
1261 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1262 return 0;
1263
1264 *addr_ret = (struct sockaddr *) addr;
1265 *len_ret = sizeof *addr;
1266 return 1;
1267 }
1268#if !defined(__FreeBSD__)
1269 case BTPROTO_SCO:
1270 {
1271 struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco);
1272 char *straddr;
1273
1274 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1275 straddr = PyString_AsString(args);
1276 if (straddr == NULL) {
1277 PyErr_SetString(socket_error, "getsockaddrarg: "
1278 "wrong format");
1279 return 0;
1280 }
1281 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1282 return 0;
1283
1284 *addr_ret = (struct sockaddr *) addr;
1285 *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
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001308 if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,
1309 &protoNumber, &pkttype, &hatype,
1310 &haddr, &halen))
Jeremy Hylton22308652001-02-02 03:23:09 +00001311 return 0;
1312 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1313 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001314 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001315 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +00001316 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001317 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001318 addr = &(s->sock_addr.ll);
1319 addr->sll_family = AF_PACKET;
1320 addr->sll_protocol = htons((short)protoNumber);
1321 addr->sll_ifindex = ifr.ifr_ifindex;
1322 addr->sll_pkttype = pkttype;
1323 addr->sll_hatype = hatype;
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +00001324 if (halen > 8) {
1325 PyErr_SetString(PyExc_ValueError,
1326 "Hardware address must be 8 bytes or less");
1327 return 0;
1328 }
1329 if (halen != 0) {
1330 memcpy(&addr->sll_addr, haddr, halen);
1331 }
1332 addr->sll_halen = halen;
Jeremy Hylton22308652001-02-02 03:23:09 +00001333 *addr_ret = (struct sockaddr *) addr;
1334 *len_ret = sizeof *addr;
1335 return 1;
1336 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001337#endif
1338
Guido van Rossum30a685f1991-06-27 15:51:29 +00001339 /* More cases here... */
1340
1341 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001342 PyErr_SetString(socket_error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001343 return 0;
1344
1345 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001346}
1347
Guido van Rossum30a685f1991-06-27 15:51:29 +00001348
Guido van Rossum48a680c2001-03-02 06:34:14 +00001349/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001350 Return 1 if the family is known, 0 otherwise. The length is returned
1351 through len_ret. */
1352
1353static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001354getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001355{
1356 switch (s->sock_family) {
1357
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001358#if defined(AF_UNIX)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001359 case AF_UNIX:
1360 {
1361 *len_ret = sizeof (struct sockaddr_un);
1362 return 1;
1363 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001364#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001365#if defined(AF_NETLINK)
1366 case AF_NETLINK:
1367 {
1368 *len_ret = sizeof (struct sockaddr_nl);
1369 return 1;
1370 }
1371#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001372
1373 case AF_INET:
1374 {
1375 *len_ret = sizeof (struct sockaddr_in);
1376 return 1;
1377 }
1378
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001379#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001380 case AF_INET6:
1381 {
1382 *len_ret = sizeof (struct sockaddr_in6);
1383 return 1;
1384 }
1385#endif
1386
Hye-Shik Chang81268602004-02-02 06:05:24 +00001387#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00001388 case AF_BLUETOOTH:
1389 {
1390 switch(s->sock_proto)
1391 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001392
1393 case BTPROTO_L2CAP:
1394 *len_ret = sizeof (struct sockaddr_l2);
1395 return 1;
1396 case BTPROTO_RFCOMM:
1397 *len_ret = sizeof (struct sockaddr_rc);
1398 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001399#if !defined(__FreeBSD__)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001400 case BTPROTO_SCO:
1401 *len_ret = sizeof (struct sockaddr_sco);
1402 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001403#endif
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001404 default:
1405 PyErr_SetString(socket_error, "getsockaddrlen: "
1406 "unknown BT protocol");
1407 return 0;
1408
Martin v. Löwis12af0482004-01-31 12:34:17 +00001409 }
1410 }
1411#endif
1412
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001413#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +00001414 case AF_PACKET:
1415 {
1416 *len_ret = sizeof (struct sockaddr_ll);
1417 return 1;
1418 }
1419#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001420
Guido van Rossum710e1df1992-06-12 10:39:36 +00001421 /* More cases here... */
1422
1423 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001424 PyErr_SetString(socket_error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +00001425 return 0;
1426
1427 }
1428}
1429
1430
Guido van Rossum30a685f1991-06-27 15:51:29 +00001431/* s.accept() method */
1432
Guido van Rossum73624e91994-10-10 17:59:00 +00001433static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001434sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001435{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001436 sock_addr_t addrbuf;
Fred Drakea04eaad2000-06-30 02:46:07 +00001437 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001438 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +00001439 PyObject *sock = NULL;
1440 PyObject *addr = NULL;
1441 PyObject *res = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001442 int timeout;
Barry Warsaw752300b1997-01-03 17:18:10 +00001443
Guido van Rossum710e1df1992-06-12 10:39:36 +00001444 if (!getsockaddrlen(s, &addrlen))
1445 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001446 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001447
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001448#ifdef MS_WINDOWS
1449 newfd = INVALID_SOCKET;
1450#else
1451 newfd = -1;
1452#endif
1453
Neal Norwitz082b2df2006-02-07 07:04:46 +00001454 if (!IS_SELECTABLE(s))
1455 return select_error();
1456
Guido van Rossum73624e91994-10-10 17:59:00 +00001457 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001458 timeout = internal_select(s, 0);
1459 if (!timeout)
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001460 newfd = accept(s->sock_fd, (struct sockaddr *) &addrbuf,
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001461 &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001462 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001463
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001464 if (timeout) {
1465 PyErr_SetString(socket_timeout, "timed out");
1466 return NULL;
1467 }
1468
Fred Drakea04eaad2000-06-30 02:46:07 +00001469#ifdef MS_WINDOWS
1470 if (newfd == INVALID_SOCKET)
1471#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001472 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001473#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001474 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001475
Guido van Rossum30a685f1991-06-27 15:51:29 +00001476 /* Create the new object with unspecified family,
1477 to avoid calls to bind() etc. on it. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001478 sock = (PyObject *) new_sockobject(newfd,
1479 s->sock_family,
1480 s->sock_type,
1481 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001482
Barry Warsaw752300b1997-01-03 17:18:10 +00001483 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001484 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001485 goto finally;
1486 }
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001487 addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001488 addrlen, s->sock_proto);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001489 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001490 goto finally;
1491
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001492 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001493
Guido van Rossum67f7a382002-06-06 21:08:16 +00001494finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001495 Py_XDECREF(sock);
1496 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001497 return res;
1498}
1499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001500PyDoc_STRVAR(accept_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001501"accept() -> (socket object, address info)\n\
1502\n\
1503Wait for an incoming connection. Return a new socket representing the\n\
1504connection, and the address of the client. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001505info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001506
Guido van Rossum11ba0942002-06-13 15:07:44 +00001507/* s.setblocking(flag) method. Argument:
1508 False -- non-blocking mode; same as settimeout(0)
1509 True -- blocking mode; same as settimeout(None)
1510*/
Guido van Rossume4485b01994-09-07 14:32:49 +00001511
Guido van Rossum73624e91994-10-10 17:59:00 +00001512static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001513sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001514{
1515 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001516
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001517 block = PyInt_AsLong(arg);
1518 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001519 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001520
Guido van Rossum11ba0942002-06-13 15:07:44 +00001521 s->sock_timeout = block ? -1.0 : 0.0;
Guido van Rossume8008f02002-06-07 03:36:20 +00001522 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001523
Guido van Rossum73624e91994-10-10 17:59:00 +00001524 Py_INCREF(Py_None);
1525 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001526}
Guido van Rossume4485b01994-09-07 14:32:49 +00001527
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001528PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001529"setblocking(flag)\n\
1530\n\
1531Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001532setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001533setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001534
Guido van Rossum11ba0942002-06-13 15:07:44 +00001535/* s.settimeout(timeout) method. Argument:
1536 None -- no timeout, blocking mode; same as setblocking(True)
1537 0.0 -- non-blocking mode; same as setblocking(False)
1538 > 0 -- timeout mode; operations time out after timeout seconds
1539 < 0 -- illegal; raises an exception
1540*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00001541static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001542sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001543{
Guido van Rossum11ba0942002-06-13 15:07:44 +00001544 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001545
1546 if (arg == Py_None)
Guido van Rossum11ba0942002-06-13 15:07:44 +00001547 timeout = -1.0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001548 else {
Guido van Rossum11ba0942002-06-13 15:07:44 +00001549 timeout = PyFloat_AsDouble(arg);
1550 if (timeout < 0.0) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00001551 if (!PyErr_Occurred())
1552 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00001553 "Timeout value out of range");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001554 return NULL;
1555 }
1556 }
1557
Guido van Rossum11ba0942002-06-13 15:07:44 +00001558 s->sock_timeout = timeout;
1559 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001560
1561 Py_INCREF(Py_None);
1562 return Py_None;
1563}
1564
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001565PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001566"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001567\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00001568Set a timeout on socket operations. 'timeout' can be a float,\n\
1569giving in seconds, or None. Setting a timeout of None disables\n\
1570the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001571Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00001572
Guido van Rossum3eede5a2002-06-07 02:08:35 +00001573/* s.gettimeout() method.
1574 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001575static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001576sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001577{
1578 if (s->sock_timeout < 0.0) {
1579 Py_INCREF(Py_None);
1580 return Py_None;
1581 }
1582 else
1583 return PyFloat_FromDouble(s->sock_timeout);
1584}
1585
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001586PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001587"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00001588\n\
1589Returns the timeout in floating seconds associated with socket \n\
1590operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001591operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00001592
Guido van Rossum48a680c2001-03-02 06:34:14 +00001593#ifdef RISCOS
1594/* s.sleeptaskw(1 | 0) method */
1595
1596static PyObject *
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001597sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)
Guido van Rossum48a680c2001-03-02 06:34:14 +00001598{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001599 int block;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00001600 block = PyInt_AsLong(arg);
1601 if (block == -1 && PyErr_Occurred())
Guido van Rossum67f7a382002-06-06 21:08:16 +00001602 return NULL;
1603 Py_BEGIN_ALLOW_THREADS
1604 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1605 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001606
Guido van Rossum67f7a382002-06-06 21:08:16 +00001607 Py_INCREF(Py_None);
1608 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001609}
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001610PyDoc_STRVAR(sleeptaskw_doc,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001611"sleeptaskw(flag)\n\
1612\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001613Allow sleeps in taskwindows.");
Guido van Rossum48a680c2001-03-02 06:34:14 +00001614#endif
1615
1616
Guido van Rossumaee08791992-09-08 09:05:33 +00001617/* s.setsockopt() method.
1618 With an integer third argument, sets an integer option.
1619 With a string third argument, sets an option from a buffer;
1620 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001621
Guido van Rossum73624e91994-10-10 17:59:00 +00001622static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001623sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001624{
1625 int level;
1626 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001627 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001628 char *buf;
1629 int buflen;
1630 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001631
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001632 if (PyArg_ParseTuple(args, "iii:setsockopt",
1633 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001634 buf = (char *) &flag;
1635 buflen = sizeof flag;
1636 }
1637 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001638 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001639 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1640 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001641 return NULL;
1642 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001643 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001644 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001645 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001646 Py_INCREF(Py_None);
1647 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001648}
1649
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001650PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001651"setsockopt(level, option, value)\n\
1652\n\
1653Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001654The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001655
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001656
Guido van Rossumaee08791992-09-08 09:05:33 +00001657/* s.getsockopt() method.
1658 With two arguments, retrieves an integer option.
1659 With a third integer argument, retrieves a string buffer of that size;
1660 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001661
Guido van Rossum73624e91994-10-10 17:59:00 +00001662static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001663sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001664{
1665 int level;
1666 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001667 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001668 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001669 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001670
Guido van Rossumbcc20741998-08-04 22:53:56 +00001671#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001672 /* We have incomplete socket support. */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001673 PyErr_SetString(socket_error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001674 return NULL;
1675#else
1676
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001677 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1678 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001679 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001680
Guido van Rossumbe32c891996-06-20 16:25:29 +00001681 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001682 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001683 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001684 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001685 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001686 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001687 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001688 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001689 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001690#ifdef __VMS
1691 if (buflen > 1024) {
1692#else
Guido van Rossumaee08791992-09-08 09:05:33 +00001693 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001694#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001695 PyErr_SetString(socket_error,
Barry Warsaw752300b1997-01-03 17:18:10 +00001696 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001697 return NULL;
1698 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001699 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001700 if (buf == NULL)
1701 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001702 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001703 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001704 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001705 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001706 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001707 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001708 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001709 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001710#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001711}
1712
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001713PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001714"getsockopt(level, option[, buffersize]) -> value\n\
1715\n\
1716Get a socket option. See the Unix manual for level and option.\n\
1717If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001718string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001719
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001720
Fred Drake728819a2000-07-01 03:40:12 +00001721/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001722
Guido van Rossum73624e91994-10-10 17:59:00 +00001723static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001724sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001725{
1726 struct sockaddr *addr;
1727 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001728 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001729
Fred Drake728819a2000-07-01 03:40:12 +00001730 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001731 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001732 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001733 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001734 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001735 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001736 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001737 Py_INCREF(Py_None);
1738 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001739}
1740
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001741PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001742"bind(address)\n\
1743\n\
1744Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001745pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001746sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001747
Guido van Rossum30a685f1991-06-27 15:51:29 +00001748
1749/* s.close() method.
1750 Set the file descriptor to -1 so operations tried subsequently
1751 will surely fail. */
1752
Guido van Rossum73624e91994-10-10 17:59:00 +00001753static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001754sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001755{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001756 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001757
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001758 if ((fd = s->sock_fd) != -1) {
1759 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001760 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001761 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001762 Py_END_ALLOW_THREADS
1763 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001764 Py_INCREF(Py_None);
1765 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001766}
1767
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001768PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001769"close()\n\
1770\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001771Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001772
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001773static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001774internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
1775 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001776{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001777 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001778
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001779 timeout = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001780 res = connect(s->sock_fd, addr, addrlen);
1781
1782#ifdef MS_WINDOWS
1783
1784 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001785 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
1786 IS_SELECTABLE(s)) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001787 /* This is a mess. Best solution: trust select */
1788 fd_set fds;
Mark Hammonda57ec932004-08-03 05:06:26 +00001789 fd_set fds_exc;
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001790 struct timeval tv;
1791 tv.tv_sec = (int)s->sock_timeout;
1792 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1793 FD_ZERO(&fds);
1794 FD_SET(s->sock_fd, &fds);
Mark Hammonda57ec932004-08-03 05:06:26 +00001795 FD_ZERO(&fds_exc);
1796 FD_SET(s->sock_fd, &fds_exc);
1797 res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001798 if (res == 0) {
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001799 res = WSAEWOULDBLOCK;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001800 timeout = 1;
Mark Hammonda57ec932004-08-03 05:06:26 +00001801 } else if (res > 0) {
1802 if (FD_ISSET(s->sock_fd, &fds))
1803 /* The socket is in the writeable set - this
1804 means connected */
1805 res = 0;
1806 else {
1807 /* As per MS docs, we need to call getsockopt()
1808 to get the underlying error */
1809 int res_size = sizeof res;
1810 /* It must be in the exception set */
1811 assert(FD_ISSET(s->sock_fd, &fds_exc));
1812 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
1813 (char *)&res, &res_size))
1814 /* getsockopt also clears WSAGetLastError,
1815 so reset it back. */
1816 WSASetLastError(res);
1817 else
1818 res = WSAGetLastError();
1819 }
1820 }
Guido van Rossumb76bdf82003-02-19 17:50:16 +00001821 /* else if (res < 0) an error occurred */
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001822 }
1823 }
1824
1825 if (res < 0)
1826 res = WSAGetLastError();
1827
1828#else
1829
1830 if (s->sock_timeout > 0.0) {
Neal Norwitz082b2df2006-02-07 07:04:46 +00001831 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001832 timeout = internal_select(s, 1);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001833 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum12e3c712002-08-08 20:39:30 +00001834 if (res < 0 && errno == EISCONN)
1835 res = 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001836 }
1837 }
1838
1839 if (res < 0)
1840 res = errno;
1841
1842#endif
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001843 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001844
1845 return res;
1846}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001847
Fred Drake728819a2000-07-01 03:40:12 +00001848/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001849
Guido van Rossum73624e91994-10-10 17:59:00 +00001850static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001851sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001852{
1853 struct sockaddr *addr;
1854 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001855 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001856 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001857
Fred Drake728819a2000-07-01 03:40:12 +00001858 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001859 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001860
Guido van Rossum73624e91994-10-10 17:59:00 +00001861 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001862 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossum11ba0942002-06-13 15:07:44 +00001863 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001864
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001865 if (timeout) {
1866 PyErr_SetString(socket_timeout, "timed out");
1867 return NULL;
1868 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00001869 if (res != 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001870 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001871 Py_INCREF(Py_None);
1872 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001873}
1874
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001875PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001876"connect(address)\n\
1877\n\
1878Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001879is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001880
Guido van Rossum30a685f1991-06-27 15:51:29 +00001881
Fred Drake728819a2000-07-01 03:40:12 +00001882/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001883
1884static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001885sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001886{
1887 struct sockaddr *addr;
1888 int addrlen;
1889 int res;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001890 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001891
Fred Drake728819a2000-07-01 03:40:12 +00001892 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001893 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001894
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001895 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00001896 res = internal_connect(s, addr, addrlen, &timeout);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001897 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001898
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001899 return PyInt_FromLong((long) res);
1900}
1901
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001902PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00001903"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001904\n\
1905This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001906instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001907
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001908
Guido van Rossumed233a51992-06-23 09:07:03 +00001909/* s.fileno() method */
1910
Guido van Rossum73624e91994-10-10 17:59:00 +00001911static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001912sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001913{
Fred Drakea04eaad2000-06-30 02:46:07 +00001914#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001915 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001916#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001917 return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001918#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001919}
1920
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001921PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001922"fileno() -> integer\n\
1923\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001924Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001925
Guido van Rossumed233a51992-06-23 09:07:03 +00001926
Guido van Rossumbe32c891996-06-20 16:25:29 +00001927#ifndef NO_DUP
1928/* s.dup() method */
1929
1930static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001931sock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001932{
Fred Drakea04eaad2000-06-30 02:46:07 +00001933 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001934 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001935
Guido van Rossumbe32c891996-06-20 16:25:29 +00001936 newfd = dup(s->sock_fd);
1937 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001938 return s->errorhandler();
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001939 sock = (PyObject *) new_sockobject(newfd,
1940 s->sock_family,
1941 s->sock_type,
1942 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001943 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001944 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001945 return sock;
1946}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001947
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001948PyDoc_STRVAR(dup_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001949"dup() -> socket object\n\
1950\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001951Return a new socket object connected to the same system resource.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001952
Guido van Rossumbe32c891996-06-20 16:25:29 +00001953#endif
1954
1955
Guido van Rossumc89705d1992-11-26 08:54:07 +00001956/* s.getsockname() method */
1957
Guido van Rossum73624e91994-10-10 17:59:00 +00001958static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001959sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001960{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001961 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001962 int res;
1963 socklen_t addrlen;
1964
Guido van Rossumc89705d1992-11-26 08:54:07 +00001965 if (!getsockaddrlen(s, &addrlen))
1966 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001967 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001968 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001969 res = getsockname(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001970 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001971 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001972 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001973 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001974 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001975}
1976
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001977PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00001978"getsockname() -> address info\n\
1979\n\
1980Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001981info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00001982
Guido van Rossumc89705d1992-11-26 08:54:07 +00001983
Guido van Rossumb6775db1994-08-01 11:34:53 +00001984#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001985/* s.getpeername() method */
1986
Guido van Rossum73624e91994-10-10 17:59:00 +00001987static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001988sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001989{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001990 sock_addr_t addrbuf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001991 int res;
1992 socklen_t addrlen;
1993
Guido van Rossumc89705d1992-11-26 08:54:07 +00001994 if (!getsockaddrlen(s, &addrlen))
1995 return NULL;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001996 memset(&addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001997 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00001998 res = getpeername(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001999 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00002000 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002001 return s->errorhandler();
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002002 return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002003 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002004}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002006PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002007"getpeername() -> address info\n\
2008\n\
2009Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002010info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002011
Guido van Rossumb6775db1994-08-01 11:34:53 +00002012#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002013
2014
Guido van Rossum30a685f1991-06-27 15:51:29 +00002015/* s.listen(n) method */
2016
Guido van Rossum73624e91994-10-10 17:59:00 +00002017static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002018sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002019{
2020 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002021 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002022
2023 backlog = PyInt_AsLong(arg);
2024 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002025 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002026 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00002027 if (backlog < 1)
2028 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002029 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00002030 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002031 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002032 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002033 Py_INCREF(Py_None);
2034 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002035}
2036
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002037PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002038"listen(backlog)\n\
2039\n\
2040Enable a server to accept connections. The backlog argument must be at\n\
2041least 1; it specifies the number of unaccepted connection that the system\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002042will allow before refusing new connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002043
2044
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002045#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00002046/* s.makefile(mode) method.
2047 Create a new open file object referring to a dupped version of
2048 the socket's file descriptor. (The dup() call is necessary so
2049 that the open file and socket objects may be closed independent
2050 of each other.)
2051 The mode argument specifies 'r' or 'w' passed to fdopen(). */
2052
Guido van Rossum73624e91994-10-10 17:59:00 +00002053static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002054sock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002055{
Tim Petersdbd9ba62000-07-09 03:09:57 +00002056 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00002057 char *mode = "r";
2058 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00002059#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00002060 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00002061#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00002062 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002063#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00002064 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00002065 PyObject *f;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002066#ifdef __VMS
2067 char *mode_r = "r";
2068 char *mode_w = "w";
2069#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00002070
Guido van Rossum43713e52000-02-29 13:59:29 +00002071 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002072 return NULL;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002073#ifdef __VMS
2074 if (strcmp(mode,"rb") == 0) {
2075 mode = mode_r;
2076 }
2077 else {
2078 if (strcmp(mode,"wb") == 0) {
2079 mode = mode_w;
2080 }
2081 }
2082#endif
Guido van Rossum8d665e61996-06-26 18:22:49 +00002083#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00002084 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
2085 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002086#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00002087 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00002088#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00002089 {
Guido van Rossum6b144911995-03-14 15:05:13 +00002090 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002091 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002092 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00002093 }
2094 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
2095 if (f != NULL)
2096 PyFile_SetBufSize(f, bufsize);
2097 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002098}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002099
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002100PyDoc_STRVAR(makefile_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002101"makefile([mode[, buffersize]]) -> file object\n\
2102\n\
2103Return a regular file object corresponding to the socket.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002104The mode and buffersize arguments are as for the built-in open() function.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002105
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002106#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002107
Guido van Rossum48a680c2001-03-02 06:34:14 +00002108
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002109/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002110
Guido van Rossum73624e91994-10-10 17:59:00 +00002111static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002112sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002113{
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002114 int len, n = 0, flags = 0, timeout;
Guido van Rossum73624e91994-10-10 17:59:00 +00002115 PyObject *buf;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002116#ifdef __VMS
2117 int read_length;
2118 char *read_buf;
2119#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002120
Guido van Rossum43713e52000-02-29 13:59:29 +00002121 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002122 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002123
2124 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002125 PyErr_SetString(PyExc_ValueError,
Guido van Rossum11ba0942002-06-13 15:07:44 +00002126 "negative buffersize in recv");
Martin v. Löwisfba64e12001-11-19 10:41:26 +00002127 return NULL;
2128 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002129
Guido van Rossum73624e91994-10-10 17:59:00 +00002130 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002131 if (buf == NULL)
2132 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002133
Neal Norwitz082b2df2006-02-07 07:04:46 +00002134 if (!IS_SELECTABLE(s))
2135 return select_error();
2136
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002137#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002138 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002139 timeout = internal_select(s, 0);
2140 if (!timeout)
2141 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002142 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002143
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002144 if (timeout) {
2145 Py_DECREF(buf);
2146 PyErr_SetString(socket_timeout, "timed out");
2147 return NULL;
2148 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002149 if (n < 0) {
2150 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002151 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002152 }
Tim Peters5de98422002-04-27 18:44:32 +00002153 if (n != len)
2154 _PyString_Resize(&buf, n);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002155#else
2156 read_buf = PyString_AsString(buf);
2157 read_length = len;
2158 while (read_length != 0) {
2159 unsigned int segment;
2160
2161 segment = read_length /SEGMENT_SIZE;
2162 if (segment != 0) {
2163 segment = SEGMENT_SIZE;
2164 }
2165 else {
2166 segment = read_length;
2167 }
2168
2169 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002170 timeout = internal_select(s, 0);
2171 if (!timeout)
2172 n = recv(s->sock_fd, read_buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002173 Py_END_ALLOW_THREADS
2174
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002175 if (timeout) {
2176 Py_DECREF(buf);
2177 PyErr_SetString(socket_timeout, "timed out");
2178 return NULL;
2179 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002180 if (n < 0) {
2181 Py_DECREF(buf);
2182 return s->errorhandler();
2183 }
2184 if (n != read_length) {
2185 read_buf += n;
2186 break;
2187 }
2188
2189 read_length -= segment;
2190 read_buf += segment;
2191 }
2192 if (_PyString_Resize(&buf, (read_buf - PyString_AsString(buf))) < 0)
2193 {
2194 return NULL;
2195 }
2196#endif /* !__VMS */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002197 return buf;
2198}
2199
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002200PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002201"recv(buffersize[, flags]) -> data\n\
2202\n\
2203Receive up to buffersize bytes from the socket. For the optional flags\n\
2204argument, see the Unix manual. When no data is available, block until\n\
2205at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002206the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002207
Guido van Rossum30a685f1991-06-27 15:51:29 +00002208
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002209/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002210
Guido van Rossum73624e91994-10-10 17:59:00 +00002211static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002212sock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002213{
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002214 sock_addr_t addrbuf;
Barry Warsaw752300b1997-01-03 17:18:10 +00002215 PyObject *buf = NULL;
2216 PyObject *addr = NULL;
2217 PyObject *ret = NULL;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002218 int len, n = 0, flags = 0, timeout;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002219 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002220
Guido van Rossum43713e52000-02-29 13:59:29 +00002221 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002222 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002223
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002224 if (!getsockaddrlen(s, &addrlen))
2225 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002226 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00002227 if (buf == NULL)
2228 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002229
Neal Norwitz082b2df2006-02-07 07:04:46 +00002230 if (!IS_SELECTABLE(s))
2231 return select_error();
2232
Guido van Rossum73624e91994-10-10 17:59:00 +00002233 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002234 memset(&addrbuf, 0, addrlen);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002235 timeout = internal_select(s, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002236 if (!timeout) {
Guido van Rossum8d665e61996-06-26 18:22:49 +00002237#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002238#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002239 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
2240 (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002241#else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002242 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
2243 (void *) &addrbuf, &addrlen);
Guido van Rossum32c575d1997-12-02 20:37:32 +00002244#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002245#else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002246 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
2247 (struct sockaddr *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002248#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002249 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002250 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002251
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002252 if (timeout) {
2253 Py_DECREF(buf);
2254 PyErr_SetString(socket_timeout, "timed out");
2255 return NULL;
2256 }
Guido van Rossum7c53b771995-09-13 18:39:47 +00002257 if (n < 0) {
2258 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002259 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00002260 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002261
Guido van Rossum53a9bf81996-06-11 18:35:24 +00002262 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002263 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002264
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002265 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf,
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002266 addrlen, s->sock_proto)))
Barry Warsaw752300b1997-01-03 17:18:10 +00002267 goto finally;
2268
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002269 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002270
2271finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00002272 Py_XDECREF(addr);
2273 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00002274 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002275}
2276
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002277PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002278"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2279\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002280Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002281
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002282/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002283
Guido van Rossum73624e91994-10-10 17:59:00 +00002284static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002285sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002286{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002287 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002288 int len, n = 0, flags = 0, timeout;
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002289#ifdef __VMS
2290 int send_length;
2291#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002292
Guido van Rossum43713e52000-02-29 13:59:29 +00002293 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002294 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002295
Neal Norwitz082b2df2006-02-07 07:04:46 +00002296 if (!IS_SELECTABLE(s))
2297 return select_error();
2298
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002299#ifndef __VMS
Guido van Rossum73624e91994-10-10 17:59:00 +00002300 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002301 timeout = internal_select(s, 1);
2302 if (!timeout)
2303 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00002304 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002305
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002306 if (timeout) {
2307 PyErr_SetString(socket_timeout, "timed out");
2308 return NULL;
2309 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00002310 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002311 return s->errorhandler();
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002312#else
2313 /* Divide packet into smaller segments for */
2314 /* TCP/IP Services for OpenVMS */
2315 send_length = len;
2316 while (send_length != 0) {
2317 unsigned int segment;
2318
2319 segment = send_length / SEGMENT_SIZE;
2320 if (segment != 0) {
2321 segment = SEGMENT_SIZE;
2322 }
2323 else {
2324 segment = send_length;
2325 }
2326 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002327 timeout = internal_select(s, 1);
2328 if (!timeout)
2329 n = send(s->sock_fd, buf, segment, flags);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002330 Py_END_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002331 if (timeout) {
2332 PyErr_SetString(socket_timeout, "timed out");
2333 return NULL;
2334 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002335 if (n < 0) {
2336 return s->errorhandler();
2337 }
2338 send_length -= segment;
2339 buf += segment;
2340 } /* end while */
2341#endif /* !__VMS */
Guido van Rossum73624e91994-10-10 17:59:00 +00002342 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00002343}
2344
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002345PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002346"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002347\n\
2348Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002349argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002350sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002351
2352
2353/* s.sendall(data [,flags]) method */
2354
2355static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002356sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002357{
2358 char *buf;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002359 int len, n = 0, flags = 0, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002360
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002361 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
2362 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 Rossum9f7a5392001-10-26 03:25:00 +00002367 Py_BEGIN_ALLOW_THREADS
2368 do {
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002369 timeout = internal_select(s, 1);
2370 if (timeout)
2371 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002372 n = send(s->sock_fd, buf, len, flags);
2373 if (n < 0)
2374 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002375 buf += n;
2376 len -= n;
2377 } while (len > 0);
2378 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002379
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002380 if (timeout) {
2381 PyErr_SetString(socket_timeout, "timed out");
2382 return NULL;
2383 }
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002384 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002385 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00002386
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002387 Py_INCREF(Py_None);
2388 return Py_None;
2389}
2390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002391PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002392"sendall(data[, flags])\n\
2393\n\
2394Send a data string to the socket. For the optional flags\n\
2395argument, see the Unix manual. This calls send() repeatedly\n\
2396until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002397to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002398
Guido van Rossum30a685f1991-06-27 15:51:29 +00002399
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002400/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002401
Guido van Rossum73624e91994-10-10 17:59:00 +00002402static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002403sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002404{
Guido van Rossum73624e91994-10-10 17:59:00 +00002405 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002406 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002407 struct sockaddr *addr;
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002408 int addrlen, len, n = 0, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002409
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002410 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002411 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002412 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002413 if (!PyArg_ParseTuple(args, "s#iO:sendto",
2414 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002415 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002416 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002417
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002418 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002419 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002420
Neal Norwitz082b2df2006-02-07 07:04:46 +00002421 if (!IS_SELECTABLE(s))
2422 return select_error();
2423
Guido van Rossum73624e91994-10-10 17:59:00 +00002424 Py_BEGIN_ALLOW_THREADS
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002425 timeout = internal_select(s, 1);
2426 if (!timeout)
2427 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00002428 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002429
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002430 if (timeout) {
2431 PyErr_SetString(socket_timeout, "timed out");
2432 return NULL;
2433 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002434 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002435 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002436 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002437}
2438
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002439PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002440"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002441\n\
2442Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002443For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002444
Guido van Rossum30a685f1991-06-27 15:51:29 +00002445
2446/* s.shutdown(how) method */
2447
Guido van Rossum73624e91994-10-10 17:59:00 +00002448static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002449sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002450{
2451 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002452 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002453
2454 how = PyInt_AsLong(arg);
2455 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002456 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002457 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002458 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00002459 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002460 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002461 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00002462 Py_INCREF(Py_None);
2463 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002464}
2465
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002466PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002467"shutdown(flag)\n\
2468\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00002469Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
2470of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002471
Guido van Rossum30a685f1991-06-27 15:51:29 +00002472
2473/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002474
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002475static PyMethodDef sock_methods[] = {
2476 {"accept", (PyCFunction)sock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002477 accept_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002478 {"bind", (PyCFunction)sock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002479 bind_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002480 {"close", (PyCFunction)sock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002481 close_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002482 {"connect", (PyCFunction)sock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002483 connect_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002484 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002485 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002486#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002487 {"dup", (PyCFunction)sock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002488 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00002489#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002490 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002491 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002492#ifdef HAVE_GETPEERNAME
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002493 {"getpeername", (PyCFunction)sock_getpeername,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002494 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00002495#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002496 {"getsockname", (PyCFunction)sock_getsockname,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002497 METH_NOARGS, getsockname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002498 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002499 getsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002500 {"listen", (PyCFunction)sock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002501 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002502#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002503 {"makefile", (PyCFunction)sock_makefile, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002504 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002505#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002506 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002507 recv_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002508 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002509 recvfrom_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002510 {"send", (PyCFunction)sock_send, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002511 send_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002512 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00002513 sendall_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002514 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002515 sendto_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002516 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002517 setblocking_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002518 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002519 settimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002520 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
Guido van Rossum67f7a382002-06-06 21:08:16 +00002521 gettimeout_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002522 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002523 setsockopt_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002524 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002525 shutdown_doc},
2526#ifdef RISCOS
Martin v. Löwisa94568a2003-05-10 07:36:56 +00002527 {"sleeptaskw", (PyCFunction)sock_sleeptaskw, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00002528 sleeptaskw_doc},
2529#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002530 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002531};
2532
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002533/* SockObject members */
2534static PyMemberDef sock_memberlist[] = {
2535 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
2536 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
2537 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
2538 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
2539 {0},
2540};
Guido van Rossum30a685f1991-06-27 15:51:29 +00002541
Guido van Rossum73624e91994-10-10 17:59:00 +00002542/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00002543 First close the file description. */
2544
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002545static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002546sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002547{
Guido van Rossumfa972c92000-04-10 12:45:45 +00002548 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00002549 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002550 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002551}
2552
Guido van Rossum30a685f1991-06-27 15:51:29 +00002553
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002554static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002555sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002556{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002557 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002558#if SIZEOF_SOCKET_T > SIZEOF_LONG
2559 if (s->sock_fd > LONG_MAX) {
2560 /* this can occur on Win64, and actually there is a special
2561 ugly printf formatter for decimal pointer length integer
2562 printing, only bother if necessary*/
2563 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002564 "no printf formatter to display "
2565 "the socket descriptor in decimal");
Fred Drakea04eaad2000-06-30 02:46:07 +00002566 return NULL;
2567 }
2568#endif
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002569 PyOS_snprintf(
2570 buf, sizeof(buf),
2571 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2572 (long)s->sock_fd, s->sock_family,
2573 s->sock_type,
2574 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002575 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002576}
2577
2578
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002579/* Create a new, uninitialized socket object. */
2580
2581static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002582sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002583{
2584 PyObject *new;
2585
2586 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002587 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002588 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002589 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002590 ((PySocketSockObject *)new)->errorhandler = &set_error;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002591 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002592 return new;
2593}
2594
2595
2596/* Initialize a new socket object. */
2597
2598/*ARGSUSED*/
2599static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002600sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002601{
2602 PySocketSockObject *s = (PySocketSockObject *)self;
2603 SOCKET_T fd;
2604 int family = AF_INET, type = SOCK_STREAM, proto = 0;
Martin v. Löwis02cbf4a2006-02-27 17:20:04 +00002605 static char *keywords[] = {"family", "type", "proto", 0};
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002606
2607 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2608 "|iii:socket", keywords,
2609 &family, &type, &proto))
2610 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002611
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002612 Py_BEGIN_ALLOW_THREADS
2613 fd = socket(family, type, proto);
2614 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002615
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002616#ifdef MS_WINDOWS
2617 if (fd == INVALID_SOCKET)
2618#else
2619 if (fd < 0)
2620#endif
2621 {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002622 set_error();
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002623 return -1;
2624 }
2625 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002626
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002627 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002628
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002629}
2630
2631
Guido van Rossumb6775db1994-08-01 11:34:53 +00002632/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002633
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002634static PyTypeObject sock_type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002635 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002636 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002637 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002638 sizeof(PySocketSockObject), /* tp_basicsize */
2639 0, /* tp_itemsize */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002640 (destructor)sock_dealloc, /* tp_dealloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002641 0, /* tp_print */
2642 0, /* tp_getattr */
2643 0, /* tp_setattr */
2644 0, /* tp_compare */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002645 (reprfunc)sock_repr, /* tp_repr */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002646 0, /* tp_as_number */
2647 0, /* tp_as_sequence */
2648 0, /* tp_as_mapping */
2649 0, /* tp_hash */
2650 0, /* tp_call */
2651 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002652 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002653 0, /* tp_setattro */
2654 0, /* tp_as_buffer */
2655 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002656 sock_doc, /* tp_doc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002657 0, /* tp_traverse */
2658 0, /* tp_clear */
2659 0, /* tp_richcompare */
2660 0, /* tp_weaklistoffset */
2661 0, /* tp_iter */
2662 0, /* tp_iternext */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002663 sock_methods, /* tp_methods */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002664 sock_memberlist, /* tp_members */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002665 0, /* tp_getset */
2666 0, /* tp_base */
2667 0, /* tp_dict */
2668 0, /* tp_descr_get */
2669 0, /* tp_descr_set */
2670 0, /* tp_dictoffset */
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00002671 sock_initobj, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002672 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002673 sock_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002674 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002675};
2676
Guido van Rossum30a685f1991-06-27 15:51:29 +00002677
Guido van Rossum81194471991-07-27 21:42:02 +00002678/* Python interface to gethostname(). */
2679
2680/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002681static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002682socket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002683{
2684 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002685 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002686 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002687 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002688 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002689 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002690 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002691 if (res < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002692 return set_error();
Guido van Rossum81194471991-07-27 21:42:02 +00002693 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002694 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002695}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002696
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002697PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002698"gethostname() -> string\n\
2699\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002700Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002701
Guido van Rossumff4949e1992-08-05 19:58:53 +00002702
Guido van Rossum30a685f1991-06-27 15:51:29 +00002703/* Python interface to gethostbyname(name). */
2704
2705/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002706static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002707socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002708{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002709 char *name;
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002710 sock_addr_t addrbuf;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002711
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002712 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002713 return NULL;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002714 if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002715 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002716 return makeipaddr((struct sockaddr *)&addrbuf,
2717 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002718}
2719
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002720PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002721"gethostbyname(host) -> address\n\
2722\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002723Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002724
2725
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002726/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2727
2728static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002729gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002730{
2731 char **pch;
2732 PyObject *rtn_tuple = (PyObject *)NULL;
2733 PyObject *name_list = (PyObject *)NULL;
2734 PyObject *addr_list = (PyObject *)NULL;
2735 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002736
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002737 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002738 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002739#ifndef RISCOS
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002740 set_herror(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002741#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002742 PyErr_SetString(socket_error, "host not found");
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002743#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002744 return NULL;
2745 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002746
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002747 if (h->h_addrtype != af) {
2748#ifdef HAVE_STRERROR
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002749 /* Let's get real error message to return */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002750 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002751 (char *)strerror(EAFNOSUPPORT));
2752#else
2753 PyErr_SetString(
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002754 socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002755 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002756#endif
2757 return NULL;
2758 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002759
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002760 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002761
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002762 case AF_INET:
2763 if (alen < sizeof(struct sockaddr_in))
2764 return NULL;
2765 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002766
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002767#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002768 case AF_INET6:
2769 if (alen < sizeof(struct sockaddr_in6))
2770 return NULL;
2771 break;
2772#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002773
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002774 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002775
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002776 if ((name_list = PyList_New(0)) == NULL)
2777 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002778
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002779 if ((addr_list = PyList_New(0)) == NULL)
2780 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002781
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002782 for (pch = h->h_aliases; *pch != NULL; pch++) {
2783 int status;
2784 tmp = PyString_FromString(*pch);
2785 if (tmp == NULL)
2786 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002787
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002788 status = PyList_Append(name_list, tmp);
2789 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002790
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002791 if (status)
2792 goto err;
2793 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002794
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002795 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2796 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002797
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002798 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002799
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002800 case AF_INET:
2801 {
2802 struct sockaddr_in sin;
2803 memset(&sin, 0, sizeof(sin));
2804 sin.sin_family = af;
2805#ifdef HAVE_SOCKADDR_SA_LEN
2806 sin.sin_len = sizeof(sin);
2807#endif
2808 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2809 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002810
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002811 if (pch == h->h_addr_list && alen >= sizeof(sin))
2812 memcpy((char *) addr, &sin, sizeof(sin));
2813 break;
2814 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002815
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002816#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002817 case AF_INET6:
2818 {
2819 struct sockaddr_in6 sin6;
2820 memset(&sin6, 0, sizeof(sin6));
2821 sin6.sin6_family = af;
2822#ifdef HAVE_SOCKADDR_SA_LEN
2823 sin6.sin6_len = sizeof(sin6);
2824#endif
2825 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2826 tmp = makeipaddr((struct sockaddr *)&sin6,
2827 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002828
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002829 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2830 memcpy((char *) addr, &sin6, sizeof(sin6));
2831 break;
2832 }
2833#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002834
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002835 default: /* can't happen */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002836 PyErr_SetString(socket_error,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002837 "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002838 return NULL;
2839 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002840
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002841 if (tmp == NULL)
2842 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002843
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002844 status = PyList_Append(addr_list, tmp);
2845 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002846
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002847 if (status)
2848 goto err;
2849 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002850
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002851 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002852
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002853 err:
2854 Py_XDECREF(name_list);
2855 Py_XDECREF(addr_list);
2856 return rtn_tuple;
2857}
2858
2859
2860/* Python interface to gethostbyname_ex(name). */
2861
2862/*ARGSUSED*/
2863static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002864socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002865{
2866 char *name;
2867 struct hostent *h;
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00002868#ifdef ENABLE_IPV6
2869 struct sockaddr_storage addr;
2870#else
2871 struct sockaddr_in addr;
2872#endif
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002873 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002874 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002875#ifdef HAVE_GETHOSTBYNAME_R
2876 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002877#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2878 struct hostent_data data;
2879#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002880 char buf[16384];
2881 int buf_len = (sizeof buf) - 1;
2882 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002883#endif
2884#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002885 int result;
2886#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002887#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002888
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002889 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002890 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002891 if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002892 return NULL;
2893 Py_BEGIN_ALLOW_THREADS
2894#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002895#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002896 result = gethostbyname_r(name, &hp_allocated, buf, buf_len,
2897 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002898#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002899 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002900#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002901 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002902 result = gethostbyname_r(name, &hp_allocated, &data);
2903 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002904#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002905#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002906#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002907 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002908#endif
2909 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002910#endif /* HAVE_GETHOSTBYNAME_R */
2911 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002912 /* Some C libraries would require addr.__ss_family instead of
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002913 addr.ss_family.
2914 Therefore, we cast the sockaddr_storage into sockaddr to
2915 access sa_family. */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002916 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002917 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002918 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002919#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00002920 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00002921#endif
2922 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002923}
2924
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002925PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002926"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2927\n\
2928Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002929for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002930
2931
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002932/* Python interface to gethostbyaddr(IP). */
2933
2934/*ARGSUSED*/
2935static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002936socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002937{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002938#ifdef ENABLE_IPV6
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002939 struct sockaddr_storage addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002940#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002941 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002942#endif
2943 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002944 char *ip_num;
2945 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002946 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002947#ifdef HAVE_GETHOSTBYNAME_R
2948 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002949#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2950 struct hostent_data data;
2951#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002952 char buf[16384];
2953 int buf_len = (sizeof buf) - 1;
2954 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002955#endif
2956#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002957 int result;
2958#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002959#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002960 char *ap;
2961 int al;
2962 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002963
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002964 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002965 return NULL;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00002966 af = AF_UNSPEC;
Martin v. Löwisddc6f472002-07-28 16:10:31 +00002967 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002968 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002969 af = sa->sa_family;
2970 ap = NULL;
2971 al = 0;
2972 switch (af) {
2973 case AF_INET:
2974 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2975 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2976 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002977#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002978 case AF_INET6:
2979 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2980 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2981 break;
2982#endif
2983 default:
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002984 PyErr_SetString(socket_error, "unsupported address family");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002985 return NULL;
2986 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002987 Py_BEGIN_ALLOW_THREADS
2988#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002989#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002990 result = gethostbyaddr_r(ap, al, af,
2991 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002992 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002993#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002994 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002995 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002996#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002997 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002998 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002999 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00003000#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003001#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003002#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003003 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003004#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003005 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003006#endif /* HAVE_GETHOSTBYNAME_R */
3007 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003008 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003009#ifdef USE_GETHOSTBYNAME_LOCK
Just van Rossum1040d2c2003-05-09 07:53:18 +00003010 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00003011#endif
3012 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003013}
3014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003015PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003016"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
3017\n\
3018Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003019for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003020
Guido van Rossum30a685f1991-06-27 15:51:29 +00003021
3022/* Python interface to getservbyname(name).
3023 This only returns the port number, since the other info is already
3024 known or not useful (like the list of aliases). */
3025
3026/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003027static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003028socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003029{
Barry Warsaw11b91a02004-06-28 00:50:43 +00003030 char *name, *proto=NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +00003031 struct servent *sp;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003032 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00003033 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00003034 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00003035 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003036 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00003037 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003038 PyErr_SetString(socket_error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00003039 return NULL;
3040 }
Guido van Rossum73624e91994-10-10 17:59:00 +00003041 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00003042}
3043
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003044PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00003045"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003046\n\
3047Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00003048The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3049otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003050
Guido van Rossum30a685f1991-06-27 15:51:29 +00003051
Barry Warsaw11b91a02004-06-28 00:50:43 +00003052/* Python interface to getservbyport(port).
3053 This only returns the service name, since the other info is already
3054 known or not useful (like the list of aliases). */
3055
3056/*ARGSUSED*/
3057static PyObject *
3058socket_getservbyport(PyObject *self, PyObject *args)
3059{
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003060 unsigned short port;
Barry Warsaw11b91a02004-06-28 00:50:43 +00003061 char *proto=NULL;
3062 struct servent *sp;
Raymond Hettinger87de0ca2004-09-28 02:19:40 +00003063 if (!PyArg_ParseTuple(args, "H|s:getservbyport", &port, &proto))
Barry Warsaw11b91a02004-06-28 00:50:43 +00003064 return NULL;
3065 Py_BEGIN_ALLOW_THREADS
3066 sp = getservbyport(htons(port), proto);
3067 Py_END_ALLOW_THREADS
3068 if (sp == NULL) {
3069 PyErr_SetString(socket_error, "port/proto not found");
3070 return NULL;
3071 }
3072 return PyString_FromString(sp->s_name);
3073}
3074
3075PyDoc_STRVAR(getservbyport_doc,
3076"getservbyport(port[, protocolname]) -> string\n\
3077\n\
3078Return the service name from a port number and protocol name.\n\
3079The optional protocol name, if given, should be 'tcp' or 'udp',\n\
3080otherwise any protocol will match.");
3081
Guido van Rossum3901d851996-12-19 16:35:04 +00003082/* Python interface to getprotobyname(name).
3083 This only returns the protocol number, since the other info is
3084 already known or not useful (like the list of aliases). */
3085
3086/*ARGSUSED*/
3087static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003088socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00003089{
3090 char *name;
3091 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00003092#ifdef __BEOS__
3093/* Not available in BeOS yet. - [cjh] */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003094 PyErr_SetString(socket_error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00003095 return NULL;
3096#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003097 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00003098 return NULL;
3099 Py_BEGIN_ALLOW_THREADS
3100 sp = getprotobyname(name);
3101 Py_END_ALLOW_THREADS
3102 if (sp == NULL) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003103 PyErr_SetString(socket_error, "protocol not found");
Guido van Rossum3901d851996-12-19 16:35:04 +00003104 return NULL;
3105 }
3106 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003107#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00003108}
3109
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003110PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003111"getprotobyname(name) -> integer\n\
3112\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003113Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003114
Guido van Rossum3901d851996-12-19 16:35:04 +00003115
Dave Cole331708b2004-08-09 04:51:41 +00003116#ifdef HAVE_SOCKETPAIR
3117/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00003118 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00003119 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00003120
3121/*ARGSUSED*/
3122static PyObject *
3123socket_socketpair(PyObject *self, PyObject *args)
3124{
3125 PySocketSockObject *s0 = NULL, *s1 = NULL;
3126 SOCKET_T sv[2];
3127 int family, type = SOCK_STREAM, proto = 0;
3128 PyObject *res = NULL;
3129
3130#if defined(AF_UNIX)
3131 family = AF_UNIX;
3132#else
3133 family = AF_INET;
3134#endif
3135 if (!PyArg_ParseTuple(args, "|iii:socketpair",
3136 &family, &type, &proto))
3137 return NULL;
3138 /* Create a pair of socket fds */
3139 if (socketpair(family, type, proto, sv) < 0)
3140 return set_error();
Dave Cole331708b2004-08-09 04:51:41 +00003141 s0 = new_sockobject(sv[0], family, type, proto);
3142 if (s0 == NULL)
3143 goto finally;
3144 s1 = new_sockobject(sv[1], family, type, proto);
3145 if (s1 == NULL)
3146 goto finally;
3147 res = PyTuple_Pack(2, s0, s1);
3148
3149finally:
3150 if (res == NULL) {
3151 if (s0 == NULL)
3152 SOCKETCLOSE(sv[0]);
3153 if (s1 == NULL)
3154 SOCKETCLOSE(sv[1]);
3155 }
3156 Py_XDECREF(s0);
3157 Py_XDECREF(s1);
3158 return res;
3159}
3160
3161PyDoc_STRVAR(socketpair_doc,
3162"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\
3163\n\
3164Create a pair of socket objects from the sockets returned by the platform\n\
3165socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00003166The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00003167AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00003168
3169#endif /* HAVE_SOCKETPAIR */
3170
3171
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003172#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003173/* Create a socket object from a numeric file description.
3174 Useful e.g. if stdin is a socket.
3175 Additional arguments as for socket(). */
3176
3177/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00003178static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003179socket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003180{
Guido van Rossum73624e91994-10-10 17:59:00 +00003181 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00003182 SOCKET_T fd;
3183 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003184 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
3185 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00003186 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00003187 /* Dup the fd so it and the socket can be closed independently */
3188 fd = dup(fd);
3189 if (fd < 0)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003190 return set_error();
3191 s = new_sockobject(fd, family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00003192 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003193}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003194
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003195PyDoc_STRVAR(fromfd_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003196"fromfd(fd, family, type[, proto]) -> socket object\n\
3197\n\
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003198Create a socket object from a duplicate of the given\n\
3199file descriptor.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003200The remaining arguments are the same as for socket().");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003201
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003202#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00003203
Guido van Rossum82a5c661998-07-07 20:45:43 +00003204
Guido van Rossum006bf911996-06-12 04:04:55 +00003205static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003206socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003207{
3208 int x1, x2;
3209
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003210 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003211 return NULL;
3212 }
3213 x2 = (int)ntohs((short)x1);
3214 return PyInt_FromLong(x2);
3215}
3216
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003217PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003218"ntohs(integer) -> integer\n\
3219\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003220Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003221
3222
Guido van Rossum006bf911996-06-12 04:04:55 +00003223static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003224socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003225{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003226 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003227
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003228 if (PyInt_Check(arg)) {
3229 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003230 if (x == (unsigned long) -1 && PyErr_Occurred())
3231 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003232 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003233 else if (PyLong_Check(arg)) {
3234 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003235 if (x == (unsigned long) -1 && PyErr_Occurred())
3236 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003237#if SIZEOF_LONG > 4
3238 {
3239 unsigned long y;
3240 /* only want the trailing 32 bits */
3241 y = x & 0xFFFFFFFFUL;
3242 if (y ^ x)
3243 return PyErr_Format(PyExc_OverflowError,
3244 "long int larger than 32 bits");
3245 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003246 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003247#endif
3248 }
3249 else
Tim Peters58141872002-08-06 22:25:02 +00003250 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003251 "expected int/long, %s found",
3252 arg->ob_type->tp_name);
3253 if (x == (unsigned long) -1 && PyErr_Occurred())
3254 return NULL;
3255 return PyInt_FromLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003256}
3257
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003258PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003259"ntohl(integer) -> integer\n\
3260\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003261Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003262
3263
Guido van Rossum006bf911996-06-12 04:04:55 +00003264static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003265socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00003266{
Hye-Shik Changa7b673f2003-12-17 09:40:23 +00003267 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00003268
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003269 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00003270 return NULL;
3271 }
3272 x2 = (int)htons((short)x1);
3273 return PyInt_FromLong(x2);
3274}
3275
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003276PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003277"htons(integer) -> integer\n\
3278\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003279Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003280
3281
Guido van Rossum006bf911996-06-12 04:04:55 +00003282static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003283socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00003284{
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003285 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00003286
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003287 if (PyInt_Check(arg)) {
3288 x = PyInt_AS_LONG(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003289 if (x == (unsigned long) -1 && PyErr_Occurred())
3290 return NULL;
Guido van Rossum006bf911996-06-12 04:04:55 +00003291 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003292 else if (PyLong_Check(arg)) {
3293 x = PyLong_AsUnsignedLong(arg);
Jeremy Hylton825e47b2002-07-25 16:37:51 +00003294 if (x == (unsigned long) -1 && PyErr_Occurred())
3295 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003296#if SIZEOF_LONG > 4
3297 {
3298 unsigned long y;
3299 /* only want the trailing 32 bits */
3300 y = x & 0xFFFFFFFFUL;
3301 if (y ^ x)
3302 return PyErr_Format(PyExc_OverflowError,
3303 "long int larger than 32 bits");
3304 x = y;
Tim Peters58141872002-08-06 22:25:02 +00003305 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003306#endif
3307 }
3308 else
Tim Peters58141872002-08-06 22:25:02 +00003309 return PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003310 "expected int/long, %s found",
3311 arg->ob_type->tp_name);
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003312 return PyInt_FromLong(htonl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00003313}
3314
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003315PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003316"htonl(integer) -> integer\n\
3317\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003318Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003319
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003320/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003321
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003322PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003323"inet_aton(string) -> packed 32-bit IP representation\n\
3324\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003325Convert 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 +00003326binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003327
3328static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003329socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003330{
Guido van Rossuma2e48551999-09-09 15:42:59 +00003331#ifndef INADDR_NONE
3332#define INADDR_NONE (-1)
3333#endif
Neal Norwitz88f115b2003-02-13 02:15:42 +00003334#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003335 struct in_addr buf;
Tim Peters1df9fdd2003-02-13 03:13:40 +00003336#else
3337 /* Have to use inet_addr() instead */
3338 unsigned long packed_addr;
3339#endif
3340 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003341
Tim Peters1df9fdd2003-02-13 03:13:40 +00003342 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003343 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003344
Tim Peters1df9fdd2003-02-13 03:13:40 +00003345
3346#ifdef HAVE_INET_ATON
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003347 if (inet_aton(ip_addr, &buf))
3348 return PyString_FromStringAndSize((char *)(&buf),
3349 sizeof(buf));
3350
3351 PyErr_SetString(socket_error,
3352 "illegal IP address string passed to inet_aton");
3353 return NULL;
3354
Tim Peters1df9fdd2003-02-13 03:13:40 +00003355#else /* ! HAVE_INET_ATON */
Georg Brandld2e3ba72005-08-26 08:34:00 +00003356 /* special-case this address as inet_addr might return INADDR_NONE
3357 * for this */
3358 if (strcmp(ip_addr, "255.255.255.255") == 0) {
3359 packed_addr = 0xFFFFFFFF;
3360 } else {
3361
3362 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003363
Georg Brandld2e3ba72005-08-26 08:34:00 +00003364 if (packed_addr == INADDR_NONE) { /* invalid address */
3365 PyErr_SetString(socket_error,
3366 "illegal IP address string passed to inet_aton");
3367 return NULL;
3368 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003369 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003370 return PyString_FromStringAndSize((char *) &packed_addr,
3371 sizeof(packed_addr));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00003372#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003373}
3374
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003375PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00003376"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003377\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003378Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003379
3380static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003381socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003382{
3383 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00003384 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003385 struct in_addr packed_addr;
3386
Guido van Rossum27fc3c02000-03-24 20:56:56 +00003387 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003388 return NULL;
3389 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00003390
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003391 if (addr_len != sizeof(packed_addr)) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003392 PyErr_SetString(socket_error,
Guido van Rossum5c9eb211999-08-20 18:21:51 +00003393 "packed IP wrong length for inet_ntoa");
3394 return NULL;
3395 }
3396
3397 memcpy(&packed_addr, packed_str, addr_len);
3398
3399 return PyString_FromString(inet_ntoa(packed_addr));
3400}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003401
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003402#ifdef HAVE_INET_PTON
3403
3404PyDoc_STRVAR(inet_pton_doc,
3405"inet_pton(af, ip) -> packed IP address string\n\
3406\n\
3407Convert an IP address from string format to a packed string suitable\n\
3408for use with low-level network functions.");
3409
3410static PyObject *
3411socket_inet_pton(PyObject *self, PyObject *args)
3412{
3413 int af;
3414 char* ip;
3415 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003416#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003417 char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003418#else
3419 char packed[sizeof(struct in_addr)];
3420#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003421 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
3422 return NULL;
3423 }
3424
Martin v. Löwis04697e82004-06-02 12:35:29 +00003425#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Martin v. Löwis10649092003-08-05 06:25:06 +00003426 if(af == AF_INET6) {
3427 PyErr_SetString(socket_error,
3428 "can't use AF_INET6, IPv6 is disabled");
3429 return NULL;
3430 }
3431#endif
3432
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003433 retval = inet_pton(af, ip, packed);
3434 if (retval < 0) {
3435 PyErr_SetFromErrno(socket_error);
3436 return NULL;
3437 } else if (retval == 0) {
3438 PyErr_SetString(socket_error,
3439 "illegal IP address string passed to inet_pton");
3440 return NULL;
3441 } else if (af == AF_INET) {
3442 return PyString_FromStringAndSize(packed,
3443 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003444#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003445 } else if (af == AF_INET6) {
3446 return PyString_FromStringAndSize(packed,
3447 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003448#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003449 } else {
3450 PyErr_SetString(socket_error, "unknown address family");
3451 return NULL;
3452 }
3453}
3454
3455PyDoc_STRVAR(inet_ntop_doc,
3456"inet_ntop(af, packed_ip) -> string formatted IP address\n\
3457\n\
3458Convert a packed IP address of the given family to string format.");
3459
3460static PyObject *
3461socket_inet_ntop(PyObject *self, PyObject *args)
3462{
3463 int af;
3464 char* packed;
3465 int len;
3466 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003467#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003468 char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003469#else
3470 char ip[INET_ADDRSTRLEN + 1];
3471#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003472
3473 /* Guarantee NUL-termination for PyString_FromString() below */
Jeremy Hylton80961f32004-11-07 14:24:25 +00003474 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003475
3476 if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {
3477 return NULL;
3478 }
3479
3480 if (af == AF_INET) {
3481 if (len != sizeof(struct in_addr)) {
3482 PyErr_SetString(PyExc_ValueError,
3483 "invalid length of packed IP address string");
3484 return NULL;
3485 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003486#ifdef ENABLE_IPV6
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003487 } else if (af == AF_INET6) {
3488 if (len != sizeof(struct in6_addr)) {
3489 PyErr_SetString(PyExc_ValueError,
3490 "invalid length of packed IP address string");
3491 return NULL;
3492 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003493#endif
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003494 } else {
3495 PyErr_Format(PyExc_ValueError,
3496 "unknown address family %d", af);
3497 return NULL;
3498 }
3499
3500 retval = inet_ntop(af, packed, ip, sizeof(ip));
3501 if (!retval) {
3502 PyErr_SetFromErrno(socket_error);
3503 return NULL;
3504 } else {
3505 return PyString_FromString(retval);
3506 }
3507
3508 /* NOTREACHED */
3509 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
3510 return NULL;
3511}
3512
3513#endif /* HAVE_INET_PTON */
3514
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003515/* Python interface to getaddrinfo(host, port). */
3516
3517/*ARGSUSED*/
3518static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003519socket_getaddrinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003520{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003521 struct addrinfo hints, *res;
3522 struct addrinfo *res0 = NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003523 PyObject *hobj = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003524 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00003525 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003526 char *hptr, *pptr;
3527 int family, socktype, protocol, flags;
3528 int error;
3529 PyObject *all = (PyObject *)NULL;
3530 PyObject *single = (PyObject *)NULL;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003531 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003532
3533 family = socktype = protocol = flags = 0;
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003534 family = AF_UNSPEC;
Martin v. Löwis2548c732003-04-18 10:39:54 +00003535 if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
3536 &hobj, &pobj, &family, &socktype,
3537 &protocol, &flags)) {
3538 return NULL;
3539 }
3540 if (hobj == Py_None) {
3541 hptr = NULL;
3542 } else if (PyUnicode_Check(hobj)) {
3543 idna = PyObject_CallMethod(hobj, "encode", "s", "idna");
3544 if (!idna)
3545 return NULL;
3546 hptr = PyString_AsString(idna);
3547 } else if (PyString_Check(hobj)) {
3548 hptr = PyString_AsString(hobj);
3549 } else {
3550 PyErr_SetString(PyExc_TypeError,
3551 "getaddrinfo() argument 1 must be string or None");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003552 return NULL;
3553 }
3554 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003555 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003556 pptr = pbuf;
3557 } else if (PyString_Check(pobj)) {
3558 pptr = PyString_AsString(pobj);
3559 } else if (pobj == Py_None) {
3560 pptr = (char *)NULL;
3561 } else {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003562 PyErr_SetString(socket_error, "Int or String expected");
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003563 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003564 }
3565 memset(&hints, 0, sizeof(hints));
3566 hints.ai_family = family;
3567 hints.ai_socktype = socktype;
3568 hints.ai_protocol = protocol;
3569 hints.ai_flags = flags;
Just van Rossum1040d2c2003-05-09 07:53:18 +00003570 Py_BEGIN_ALLOW_THREADS
3571 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003572 error = getaddrinfo(hptr, pptr, &hints, &res0);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003573 Py_END_ALLOW_THREADS
3574 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003575 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003576 set_gaierror(error);
Martin v. Löwis5db099a2003-08-07 11:55:15 +00003577 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003578 }
3579
3580 if ((all = PyList_New(0)) == NULL)
3581 goto err;
3582 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00003583 PyObject *addr =
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00003584 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
Guido van Rossum716aac02001-10-12 18:59:27 +00003585 if (addr == NULL)
3586 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003587 single = Py_BuildValue("iiisO", res->ai_family,
3588 res->ai_socktype, res->ai_protocol,
3589 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00003590 addr);
3591 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003592 if (single == NULL)
3593 goto err;
3594
3595 if (PyList_Append(all, single))
3596 goto err;
3597 Py_XDECREF(single);
3598 }
Martin v. Löwis2548c732003-04-18 10:39:54 +00003599 Py_XDECREF(idna);
Neal Norwitz90128ba2002-08-09 03:37:42 +00003600 if (res0)
3601 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003602 return all;
3603 err:
3604 Py_XDECREF(single);
3605 Py_XDECREF(all);
Martin v. Löwis2548c732003-04-18 10:39:54 +00003606 Py_XDECREF(idna);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00003607 if (res0)
3608 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003609 return (PyObject *)NULL;
3610}
3611
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003612PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003613"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
3614 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003615\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003616Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003617
3618/* Python interface to getnameinfo(sa, flags). */
3619
3620/*ARGSUSED*/
3621static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003622socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003623{
3624 PyObject *sa = (PyObject *)NULL;
3625 int flags;
3626 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003627 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003628 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
3629 struct addrinfo hints, *res = NULL;
3630 int error;
3631 PyObject *ret = (PyObject *)NULL;
3632
3633 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003634 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003635 return NULL;
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003636 if (!PyArg_ParseTuple(sa, "si|ii",
3637 &hostp, &port, &flowinfo, &scope_id))
Martin v. Löwis06b1d212001-11-02 23:34:52 +00003638 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00003639 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003640 memset(&hints, 0, sizeof(hints));
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00003641 hints.ai_family = AF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003642 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Just van Rossum1040d2c2003-05-09 07:53:18 +00003643 Py_BEGIN_ALLOW_THREADS
3644 ACQUIRE_GETADDRINFO_LOCK
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003645 error = getaddrinfo(hostp, pbuf, &hints, &res);
Just van Rossum1040d2c2003-05-09 07:53:18 +00003646 Py_END_ALLOW_THREADS
3647 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003648 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003649 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003650 goto fail;
3651 }
3652 if (res->ai_next) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003653 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003654 "sockaddr resolved to multiple addresses");
3655 goto fail;
3656 }
3657 switch (res->ai_family) {
3658 case AF_INET:
3659 {
3660 char *t1;
3661 int t2;
3662 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003663 PyErr_SetString(socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003664 "IPv4 sockaddr must be 2 tuple");
3665 goto fail;
3666 }
3667 break;
3668 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00003669#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003670 case AF_INET6:
3671 {
3672 struct sockaddr_in6 *sin6;
3673 sin6 = (struct sockaddr_in6 *)res->ai_addr;
3674 sin6->sin6_flowinfo = flowinfo;
3675 sin6->sin6_scope_id = scope_id;
3676 break;
3677 }
3678#endif
3679 }
3680 error = getnameinfo(res->ai_addr, res->ai_addrlen,
3681 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
3682 if (error) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003683 set_gaierror(error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003684 goto fail;
3685 }
3686 ret = Py_BuildValue("ss", hbuf, pbuf);
3687
3688fail:
3689 if (res)
3690 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003691 return ret;
3692}
3693
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003694PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003695"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003696\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003697Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003698
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003699
3700/* Python API to getting and setting the default timeout value. */
3701
3702static PyObject *
3703socket_getdefaulttimeout(PyObject *self)
3704{
3705 if (defaulttimeout < 0.0) {
3706 Py_INCREF(Py_None);
3707 return Py_None;
3708 }
3709 else
3710 return PyFloat_FromDouble(defaulttimeout);
3711}
3712
3713PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003714"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003715\n\
3716Returns the default timeout in floating seconds for new socket objects.\n\
3717A value of None indicates that new socket objects have no timeout.\n\
3718When the socket module is first imported, the default is None.");
3719
3720static PyObject *
3721socket_setdefaulttimeout(PyObject *self, PyObject *arg)
3722{
3723 double timeout;
3724
3725 if (arg == Py_None)
3726 timeout = -1.0;
3727 else {
3728 timeout = PyFloat_AsDouble(arg);
3729 if (timeout < 0.0) {
3730 if (!PyErr_Occurred())
3731 PyErr_SetString(PyExc_ValueError,
3732 "Timeout value out of range");
3733 return NULL;
3734 }
3735 }
3736
3737 defaulttimeout = timeout;
3738
3739 Py_INCREF(Py_None);
3740 return Py_None;
3741}
3742
3743PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003744"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003745\n\
3746Set the default timeout in floating seconds for new socket objects.\n\
3747A value of None indicates that new socket objects have no timeout.\n\
3748When the socket module is first imported, the default is None.");
3749
3750
Guido van Rossum30a685f1991-06-27 15:51:29 +00003751/* List of functions exported by this module. */
3752
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003753static PyMethodDef socket_methods[] = {
3754 {"gethostbyname", socket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003755 METH_VARARGS, gethostbyname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003756 {"gethostbyname_ex", socket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003757 METH_VARARGS, ghbn_ex_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003758 {"gethostbyaddr", socket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003759 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003760 {"gethostname", socket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003761 METH_VARARGS, gethostname_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003762 {"getservbyname", socket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003763 METH_VARARGS, getservbyname_doc},
Barry Warsaw11b91a02004-06-28 00:50:43 +00003764 {"getservbyport", socket_getservbyport,
3765 METH_VARARGS, getservbyport_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003766 {"getprotobyname", socket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003767 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003768#ifndef NO_DUP
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003769 {"fromfd", socket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003770 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00003771#endif
Dave Cole331708b2004-08-09 04:51:41 +00003772#ifdef HAVE_SOCKETPAIR
3773 {"socketpair", socket_socketpair,
3774 METH_VARARGS, socketpair_doc},
3775#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003776 {"ntohs", socket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003777 METH_VARARGS, ntohs_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003778 {"ntohl", socket_ntohl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003779 METH_O, ntohl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003780 {"htons", socket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003781 METH_VARARGS, htons_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003782 {"htonl", socket_htonl,
Jeremy Hyltonc075e192002-07-25 16:01:12 +00003783 METH_O, htonl_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003784 {"inet_aton", socket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003785 METH_VARARGS, inet_aton_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003786 {"inet_ntoa", socket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00003787 METH_VARARGS, inet_ntoa_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003788#ifdef HAVE_INET_PTON
3789 {"inet_pton", socket_inet_pton,
3790 METH_VARARGS, inet_pton_doc},
3791 {"inet_ntop", socket_inet_ntop,
3792 METH_VARARGS, inet_ntop_doc},
3793#endif
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003794 {"getaddrinfo", socket_getaddrinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003795 METH_VARARGS, getaddrinfo_doc},
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003796 {"getnameinfo", socket_getnameinfo,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003797 METH_VARARGS, getnameinfo_doc},
Guido van Rossum1693ba82002-07-18 21:11:26 +00003798 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00003799 METH_NOARGS, getdefaulttimeout_doc},
3800 {"setdefaulttimeout", socket_setdefaulttimeout,
3801 METH_O, setdefaulttimeout_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00003802 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003803};
3804
Guido van Rossum30a685f1991-06-27 15:51:29 +00003805
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003806#ifdef RISCOS
3807#define OS_INIT_DEFINED
Guido van Rossumbe32c891996-06-20 16:25:29 +00003808
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003809static int
3810os_init(void)
3811{
3812 _kernel_swi_regs r;
3813
3814 r.r[0] = 0;
3815 _kernel_swi(0x43380, &r, &r);
3816 taskwindow = r.r[0];
3817
Martin v. Löwisa94568a2003-05-10 07:36:56 +00003818 return 1;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003819}
3820
3821#endif /* RISCOS */
3822
3823
3824#ifdef MS_WINDOWS
3825#define OS_INIT_DEFINED
3826
3827/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003828
3829static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003830os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003831{
3832 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00003833}
3834
3835static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003836os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00003837{
3838 WSADATA WSAData;
3839 int ret;
3840 char buf[100];
3841 ret = WSAStartup(0x0101, &WSAData);
3842 switch (ret) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003843 case 0: /* No error */
Mark Hammond14350ab2003-07-09 04:57:46 +00003844 Py_AtExit(os_cleanup);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003845 return 1; /* Success */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003846 case WSASYSNOTREADY:
3847 PyErr_SetString(PyExc_ImportError,
3848 "WSAStartup failed: network not ready");
3849 break;
3850 case WSAVERNOTSUPPORTED:
3851 case WSAEINVAL:
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003852 PyErr_SetString(
3853 PyExc_ImportError,
3854 "WSAStartup failed: requested version not supported");
Guido van Rossumbe32c891996-06-20 16:25:29 +00003855 break;
3856 default:
Tim Peters885d4572001-11-28 20:27:42 +00003857 PyOS_snprintf(buf, sizeof(buf),
3858 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00003859 PyErr_SetString(PyExc_ImportError, buf);
3860 break;
3861 }
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003862 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003863}
3864
Guido van Rossum8d665e61996-06-26 18:22:49 +00003865#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00003866
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003867
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003868#ifdef PYOS_OS2
3869#define OS_INIT_DEFINED
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003870
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003871/* Additional initialization for OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003872
3873static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003874os_init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003875{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003876#ifndef PYCC_GCC
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003877 char reason[64];
3878 int rc = sock_init();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003879
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003880 if (rc == 0) {
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003881 return 1; /* Success */
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003882 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003883
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003884 PyOS_snprintf(reason, sizeof(reason),
3885 "OS/2 TCP/IP Error# %d", sock_errno());
3886 PyErr_SetString(PyExc_ImportError, reason);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003887
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003888 return 0; /* Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003889#else
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003890 /* No need to initialise sockets with GCC/EMX */
3891 return 1; /* Success */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003892#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003893}
3894
3895#endif /* PYOS_OS2 */
3896
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003897
3898#ifndef OS_INIT_DEFINED
3899static int
3900os_init(void)
3901{
3902 return 1; /* Success */
3903}
3904#endif
3905
3906
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003907/* C API table - always add new things to the end for binary
3908 compatibility. */
3909static
3910PySocketModule_APIObject PySocketModuleAPI =
3911{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003912 &sock_type,
Brett Cannon06c34792004-03-23 23:16:54 +00003913 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003914};
3915
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003916
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003917/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003918
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003919 This module is actually called "_socket", and there's a wrapper
3920 "socket.py" which implements some additional functionality. On some
3921 platforms (e.g. Windows and OS/2), socket.py also implements a
3922 wrapper for the socket type that provides missing functionality such
3923 as makefile(), dup() and fromfd(). The import of "_socket" may fail
3924 with an ImportError exception if os-specific initialization fails.
3925 On Windows, this does WINSOCK initialization. When WINSOCK is
3926 initialized succesfully, a call to WSACleanup() is scheduled to be
3927 made at exit time.
3928*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00003929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003930PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003931"Implementation module for socket operations.\n\
3932\n\
3933See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003934
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003935PyMODINIT_FUNC
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003936init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003937{
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003938 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00003939
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003940 if (!os_init())
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003941 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003942
3943 sock_type.ob_type = &PyType_Type;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003944 m = Py_InitModule3(PySocket_MODULE_NAME,
3945 socket_methods,
3946 socket_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00003947 if (m == NULL)
3948 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003949
3950 socket_error = PyErr_NewException("socket.error", NULL, NULL);
3951 if (socket_error == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003952 return;
Brett Cannon06c34792004-03-23 23:16:54 +00003953 PySocketModuleAPI.error = socket_error;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003954 Py_INCREF(socket_error);
3955 PyModule_AddObject(m, "error", socket_error);
3956 socket_herror = PyErr_NewException("socket.herror",
3957 socket_error, NULL);
3958 if (socket_herror == NULL)
3959 return;
3960 Py_INCREF(socket_herror);
3961 PyModule_AddObject(m, "herror", socket_herror);
3962 socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003963 NULL);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003964 if (socket_gaierror == NULL)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003965 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003966 Py_INCREF(socket_gaierror);
3967 PyModule_AddObject(m, "gaierror", socket_gaierror);
Raymond Hettingeref7343c2003-06-29 03:08:05 +00003968 socket_timeout = PyErr_NewException("socket.timeout",
3969 socket_error, NULL);
3970 if (socket_timeout == NULL)
3971 return;
3972 Py_INCREF(socket_timeout);
3973 PyModule_AddObject(m, "timeout", socket_timeout);
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003974 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003975 if (PyModule_AddObject(m, "SocketType",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003976 (PyObject *)&sock_type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003977 return;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003978 Py_INCREF((PyObject *)&sock_type);
Fred Drake4baedc12002-04-01 14:53:37 +00003979 if (PyModule_AddObject(m, "socket",
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003980 (PyObject *)&sock_type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003981 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003982
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00003983#ifdef ENABLE_IPV6
3984 has_ipv6 = Py_True;
3985#else
3986 has_ipv6 = Py_False;
3987#endif
3988 Py_INCREF(has_ipv6);
3989 PyModule_AddObject(m, "has_ipv6", has_ipv6);
3990
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003991 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003992 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003993 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3994 ) != 0)
3995 return;
3996
Guido van Rossum09be4091999-08-09 14:40:40 +00003997 /* Address families (we only support AF_INET and AF_UNIX) */
3998#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003999 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00004000#endif
Fred Drake4baedc12002-04-01 14:53:37 +00004001 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004002#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004003 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004004#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00004005#if defined(AF_UNIX)
Fred Drake4baedc12002-04-01 14:53:37 +00004006 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004007#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004008#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004009 /* Amateur Radio AX.25 */
4010 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004011#endif
4012#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004013 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00004014#endif
4015#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00004016 /* Appletalk DDP */
4017 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004018#endif
4019#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004020 /* Amateur radio NetROM */
4021 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004022#endif
4023#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00004024 /* Multiprotocol bridge */
4025 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004026#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004027#ifdef AF_ATMPVC
4028 /* ATM PVCs */
4029 PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);
4030#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004031#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00004032 /* Reserved for Werner's ATM */
4033 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00004034#endif
4035#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00004036 /* Reserved for X.25 project */
4037 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004038#endif
4039#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00004040 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00004041#endif
4042#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004043 /* Amateur Radio X.25 PLP */
4044 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004045#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004046#ifdef AF_DECnet
4047 /* Reserved for DECnet project */
4048 PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);
4049#endif
4050#ifdef AF_NETBEUI
4051 /* Reserved for 802.2LLC project */
4052 PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);
4053#endif
4054#ifdef AF_SECURITY
4055 /* Security callback pseudo AF */
4056 PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);
4057#endif
4058#ifdef AF_KEY
4059 /* PF_KEY key management API */
4060 PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);
4061#endif
4062#ifdef AF_NETLINK
4063 /* */
4064 PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);
Martin v. Löwis11017b12006-01-14 18:12:57 +00004065 PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004066#ifdef NETLINK_SKIP
Martin v. Löwis11017b12006-01-14 18:12:57 +00004067 PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004068#endif
4069#ifdef NETLINK_W1
4070 PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);
4071#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004072 PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);
4073 PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004074#ifdef NETLINK_TCPDIAG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004075 PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004076#endif
4077#ifdef NETLINK_NFLOG
Martin v. Löwis11017b12006-01-14 18:12:57 +00004078 PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00004079#endif
Neal Norwitz65851662006-01-16 04:31:40 +00004080#ifdef NETLINK_XFRM
Martin v. Löwis11017b12006-01-14 18:12:57 +00004081 PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00004082#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004083#ifdef NETLINK_ARPD
Martin v. Löwis11017b12006-01-14 18:12:57 +00004084 PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004085#endif
4086#ifdef NETLINK_ROUTE6
Martin v. Löwis11017b12006-01-14 18:12:57 +00004087 PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004088#endif
Martin v. Löwis11017b12006-01-14 18:12:57 +00004089 PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);
4090 PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004091#ifdef NETLINK_TAPBASE
Martin v. Löwis11017b12006-01-14 18:12:57 +00004092 PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004093#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004094#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00004095#ifdef AF_ROUTE
4096 /* Alias to emulate 4.4BSD */
4097 PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);
4098#endif
4099#ifdef AF_ASH
4100 /* Ash */
4101 PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);
4102#endif
4103#ifdef AF_ECONET
4104 /* Acorn Econet */
4105 PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);
4106#endif
4107#ifdef AF_ATMSVC
4108 /* ATM SVCs */
4109 PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);
4110#endif
4111#ifdef AF_SNA
4112 /* Linux SNA Project (nutters!) */
4113 PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);
4114#endif
4115#ifdef AF_IRDA
4116 /* IRDA sockets */
4117 PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);
4118#endif
4119#ifdef AF_PPPOX
4120 /* PPPoX sockets */
4121 PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);
4122#endif
4123#ifdef AF_WANPIPE
4124 /* Wanpipe API Sockets */
4125 PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);
4126#endif
4127#ifdef AF_LLC
4128 /* Linux LLC */
4129 PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);
4130#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004131
Hye-Shik Chang81268602004-02-02 06:05:24 +00004132#ifdef USE_BLUETOOTH
Martin v. Löwis12af0482004-01-31 12:34:17 +00004133 PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);
4134 PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004135#if !defined(__FreeBSD__)
Martin v. Löwis12af0482004-01-31 12:34:17 +00004136 PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00004137#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00004138 PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00004139 PyModule_AddObject(m, "BDADDR_ANY", Py_BuildValue("s", "00:00:00:00:00:00"));
4140 PyModule_AddObject(m, "BDADDR_LOCAL", Py_BuildValue("s", "00:00:00:FF:FF:FF"));
Martin v. Löwis12af0482004-01-31 12:34:17 +00004141#endif
4142
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00004143#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00004144 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
4145 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
4146 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
4147 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
4148 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
4149 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
4150 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
4151 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
4152 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00004153#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004154
4155 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00004156 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
4157 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004158#ifndef __BEOS__
4159/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00004160 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
4161 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004162#if defined(SOCK_RDM)
Fred Drake4baedc12002-04-01 14:53:37 +00004163 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00004164#endif
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00004165#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004166
4167#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00004168 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004169#endif
4170#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004171 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004172#endif
4173#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004174 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004175#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00004176#ifdef SO_EXCLUSIVEADDRUSE
4177 PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);
4178#endif
4179
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004180#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004181 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004182#endif
4183#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004184 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004185#endif
4186#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004187 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004188#endif
4189#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004190 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004191#endif
4192#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00004193 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004194#endif
4195#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00004196 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004197#endif
4198#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00004199 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004200#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004201#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004202 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004203#endif
4204#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00004205 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004206#endif
4207#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004208 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004209#endif
4210#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00004211 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004212#endif
4213#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004214 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004215#endif
4216#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00004217 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004218#endif
4219#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00004220 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004221#endif
4222#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004223 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004224#endif
4225
4226 /* Maximum number of connections for "listen" */
4227#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00004228 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004229#else
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004230 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004231#endif
4232
4233 /* Flags for send, recv */
4234#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00004235 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004236#endif
4237#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00004238 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004239#endif
4240#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00004241 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004242#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004243#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00004244 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00004245#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004246#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00004247 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004248#endif
4249#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004250 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004251#endif
4252#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00004253 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004254#endif
4255#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00004256 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004257#endif
4258#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00004259 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004260#endif
4261#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00004262 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004263#endif
4264
4265 /* Protocol level and numbers, usable for [gs]etsockopt */
4266#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00004267 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004268#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004269#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004270 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004271#else
Fred Drake4baedc12002-04-01 14:53:37 +00004272 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00004273#endif
4274#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00004275 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00004276#endif
4277#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00004278 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00004279#endif
4280#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00004281 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00004282#endif
4283#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00004284 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00004285#endif
4286#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00004287 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004288#endif
4289#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004290 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004291#else
Fred Drake4baedc12002-04-01 14:53:37 +00004292 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00004293#endif
4294#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004295 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004296#else
Fred Drake4baedc12002-04-01 14:53:37 +00004297 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00004298#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004299#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00004300 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00004301#else
Fred Drake4baedc12002-04-01 14:53:37 +00004302 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004303#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004304#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004305 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004306#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004307#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00004308 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00004309#else
Fred Drake4baedc12002-04-01 14:53:37 +00004310 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004311#endif
4312#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00004313 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004314#endif
4315#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00004316 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004317#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004318#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00004319 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004320#endif
Martin v. Löwisa0f17342003-10-03 13:56:20 +00004321#ifdef IPPROTO_IPV6
4322 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
4323#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004324#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00004325 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004326#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004327#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00004328 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00004329#else
Fred Drake4baedc12002-04-01 14:53:37 +00004330 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004331#endif
4332#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00004333 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004334#endif
4335#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00004336 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004337#endif
4338#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00004339 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00004340#else
Fred Drake4baedc12002-04-01 14:53:37 +00004341 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004342#endif
4343#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00004344 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004345#endif
4346#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00004347 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004348#endif
4349#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00004350 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004351#endif
4352#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00004353 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004354#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004355#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004356 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004357#endif
4358#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00004359 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004360#endif
4361#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00004362 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004363#endif
4364#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00004365 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004366#endif
4367#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00004368 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004369#endif
4370#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00004371 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004372#endif
4373#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00004374 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004375#endif
4376#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00004377 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004378#endif
4379#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00004380 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004381#endif
4382#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004383 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004384#endif
4385#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004386 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004387#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004388#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00004389 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004390#endif
4391#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00004392 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004393#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004394#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00004395 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004396#endif
4397#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00004398 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004399#endif
4400#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00004401 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004402#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004403#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00004404 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004405#endif
4406/**/
4407#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00004408 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00004409#else
Fred Drake4baedc12002-04-01 14:53:37 +00004410 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004411#endif
4412#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004413 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004414#endif
4415
4416 /* Some port configuration */
4417#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004418 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004419#else
Fred Drake4baedc12002-04-01 14:53:37 +00004420 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004421#endif
4422#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00004423 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004424#else
Fred Drake4baedc12002-04-01 14:53:37 +00004425 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004426#endif
4427
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004428 /* Some reserved IP v.4 addresses */
4429#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00004430 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004431#else
Fred Drake4baedc12002-04-01 14:53:37 +00004432 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004433#endif
4434#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00004435 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004436#else
Fred Drake4baedc12002-04-01 14:53:37 +00004437 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004438#endif
4439#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00004440 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004441#else
Fred Drake4baedc12002-04-01 14:53:37 +00004442 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004443#endif
4444#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004445 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004446#else
Fred Drake4baedc12002-04-01 14:53:37 +00004447 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004448#endif
4449#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004450 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
4451 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004452#else
Fred Drake4baedc12002-04-01 14:53:37 +00004453 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004454#endif
4455#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004456 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
4457 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004458#else
Fred Drake4baedc12002-04-01 14:53:37 +00004459 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004460#endif
4461#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00004462 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004463#else
Fred Drake4baedc12002-04-01 14:53:37 +00004464 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00004465#endif
4466
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004467 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004468#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00004469 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004470#endif
4471#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00004472 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004473#endif
4474#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00004475 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004476#endif
4477#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004478 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004479#endif
4480#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004481 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004482#endif
4483#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004484 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004485#endif
4486#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00004487 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004488#endif
4489#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00004490 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004491#endif
4492#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004493 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004494#endif
4495#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004496 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004497#endif
4498#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004499 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004500#endif
4501#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004502 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004503#endif
4504#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00004505 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00004506#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00004507#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00004508 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
4509 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00004510#endif
4511#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004512 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
4513 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00004514#endif
4515#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00004516 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00004517#endif
4518
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004519 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
4520#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004521 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004522#endif
4523#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00004524 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004525#endif
4526#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004527 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004528#endif
4529#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00004530 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004531#endif
4532#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00004533 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004534#endif
4535#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00004536 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004537#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004538 /* Additional IPV6 socket options, defined in RFC 3493 */
4539#ifdef IPV6_V6ONLY
4540 PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);
4541#endif
4542 /* Advanced IPV6 socket options, from RFC 3542 */
4543#ifdef IPV6_CHECKSUM
4544 PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);
4545#endif
4546#ifdef IPV6_DONTFRAG
4547 PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);
4548#endif
4549#ifdef IPV6_DSTOPTS
4550 PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);
4551#endif
4552#ifdef IPV6_HOPLIMIT
4553 PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);
4554#endif
4555#ifdef IPV6_HOPOPTS
4556 PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);
4557#endif
4558#ifdef IPV6_NEXTHOP
4559 PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);
4560#endif
4561#ifdef IPV6_PATHMTU
4562 PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);
4563#endif
4564#ifdef IPV6_PKTINFO
4565 PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);
4566#endif
4567#ifdef IPV6_RECVDSTOPTS
4568 PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);
4569#endif
4570#ifdef IPV6_RECVHOPLIMIT
4571 PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);
4572#endif
4573#ifdef IPV6_RECVHOPOPTS
4574 PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);
4575#endif
4576#ifdef IPV6_RECVPKTINFO
4577 PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);
4578#endif
4579#ifdef IPV6_RECVRTHDR
4580 PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);
4581#endif
4582#ifdef IPV6_RECVTCLASS
4583 PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);
4584#endif
4585#ifdef IPV6_RTHDR
4586 PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);
4587#endif
4588#ifdef IPV6_RTHDRDSTOPTS
4589 PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);
4590#endif
4591#ifdef IPV6_RTHDR_TYPE_0
4592 PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);
4593#endif
4594#ifdef IPV6_RECVPATHMTU
4595 PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);
4596#endif
4597#ifdef IPV6_TCLASS
4598 PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);
4599#endif
4600#ifdef IPV6_USE_MIN_MTU
4601 PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);
4602#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00004603
Guido van Rossum09be4091999-08-09 14:40:40 +00004604 /* TCP options */
4605#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00004606 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00004607#endif
4608#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00004609 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00004610#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004611#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00004612 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004613#endif
4614#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00004615 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004616#endif
4617#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00004618 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004619#endif
4620#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004621 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004622#endif
4623#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00004624 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004625#endif
4626#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00004627 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004628#endif
4629#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00004630 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004631#endif
4632#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00004633 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004634#endif
4635#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00004636 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004637#endif
4638#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00004639 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00004640#endif
4641
Guido van Rossum09be4091999-08-09 14:40:40 +00004642
4643 /* IPX options */
4644#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004645 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00004646#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004647
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004648 /* get{addr,name}info parameters */
4649#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004650 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004651#endif
4652#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00004653 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004654#endif
4655#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00004656 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004657#endif
4658#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00004659 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004660#endif
4661#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00004662 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004663#endif
4664#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00004665 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004666#endif
4667#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00004668 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004669#endif
4670#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00004671 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004672#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004673#ifdef EAI_OVERFLOW
4674 PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);
4675#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004676#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00004677 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004678#endif
4679#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00004680 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004681#endif
4682#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00004683 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004684#endif
4685#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00004686 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004687#endif
4688#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00004689 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004690#endif
4691#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00004692 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004693#endif
4694#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00004695 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004696#endif
4697#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00004698 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004699#endif
4700#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004701 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004702#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00004703#ifdef AI_NUMERICSERV
4704 PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);
4705#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004706#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00004707 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004708#endif
4709#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00004710 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004711#endif
4712#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00004713 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004714#endif
4715#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00004716 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004717#endif
4718#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00004719 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004720#endif
4721#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00004722 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004723#endif
4724#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004725 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004726#endif
4727#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004728 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004729#endif
4730#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00004731 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004732#endif
4733#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00004734 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004735#endif
4736#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00004737 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004738#endif
4739#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00004740 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004741#endif
4742#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00004743 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004744#endif
4745
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004746 /* shutdown() parameters */
4747#ifdef SHUT_RD
4748 PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);
4749#elif defined(SD_RECEIVE)
4750 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
4751#else
4752 PyModule_AddIntConstant(m, "SHUT_RD", 0);
4753#endif
4754#ifdef SHUT_WR
4755 PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);
4756#elif defined(SD_SEND)
4757 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
4758#else
4759 PyModule_AddIntConstant(m, "SHUT_WR", 1);
4760#endif
4761#ifdef SHUT_RDWR
4762 PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);
4763#elif defined(SD_BOTH)
4764 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
4765#else
4766 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
4767#endif
4768
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004769 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00004770#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
4771 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004772#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004773}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004774
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004775
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004776#ifndef HAVE_INET_PTON
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004777
4778/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004779/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004780
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004781int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004782inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004783{
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004784 if (af == AF_INET) {
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004785 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004786 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004787 if (packed_addr == INADDR_NONE)
4788 return 0;
4789 memcpy(dst, &packed_addr, 4);
4790 return 1;
4791 }
4792 /* Should set errno to EAFNOSUPPORT */
4793 return -1;
4794}
4795
Martin v. Löwisc925b1532001-07-21 09:42:15 +00004796const char *
4797inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004798{
4799 if (af == AF_INET) {
4800 struct in_addr packed_addr;
4801 if (size < 16)
4802 /* Should set errno to ENOSPC. */
4803 return NULL;
4804 memcpy(&packed_addr, src, sizeof(packed_addr));
4805 return strncpy(dst, inet_ntoa(packed_addr), size);
4806 }
4807 /* Should set errno to EAFNOSUPPORT */
4808 return NULL;
4809}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004810
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00004811#endif