blob: 5917b43024315dc5280ae4d73b926d9bfeb9dfe5 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
4This module provides an interface to Berkeley socket IPC.
5
6Limitations:
7
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00008- only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Jeremy Hylton22308652001-02-02 03:23:09 +00009 portable manner, though AF_PACKET is supported under Linux.
Guido van Rossum384ca9c2001-10-27 22:20:47 +000010- no read/write operations (use sendall/recv or makefile instead)
11- additional restrictions apply on Windows (compensated for by socket.py)
Guido van Rossum6574b3e1991-06-25 21:36:08 +000012
Guido van Rossum27e177d1995-03-16 15:43:47 +000013Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000014
Guido van Rossum27e177d1995-03-16 15:43:47 +000015- socket.error: exception raised for socket specific errors
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000016- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
17 a subclass of socket.error
18- socket.herror: exception raised for gethostby* errors,
19 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000020- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000021- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000022- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000023- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000024- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000025- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000026- socket.ntohs(16 bit value) --> new int object
27- socket.ntohl(32 bit value) --> new int object
28- socket.htons(16 bit value) --> new int object
29- socket.htonl(32 bit value) --> new int object
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000030- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
31 --> List of (family, socktype, proto, canonname, sockaddr)
32- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000033- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +000034- socket.inet_aton(IP address) -> 32-bit packed IP representation
35- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum6574b3e1991-06-25 21:36:08 +000036- an Internet socket address is a pair (hostname, port)
37 where hostname can be anything recognized by gethostbyname()
38 (including the dd.dd.dd.dd notation) and port is in host byte order
39- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000040- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000041- an AF_PACKET socket address is a tuple containing a string
42 specifying the ethernet interface and an integer specifying
43 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000044 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
45 specify packet-type and ha-type/addr -- these are ignored by
Jeremy Hylton22308652001-02-02 03:23:09 +000046 networking code, but accepted since they are returned by the
47 getsockname() method.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048
Guido van Rossum30a685f1991-06-27 15:51:29 +000049Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000050
Guido van Rossum81194471991-07-27 21:42:02 +000051- s.accept() --> new socket object, sockaddr
Fred Drake728819a2000-07-01 03:40:12 +000052- s.bind(sockaddr) --> None
Guido van Rossum27e177d1995-03-16 15:43:47 +000053- s.close() --> None
Fred Drake728819a2000-07-01 03:40:12 +000054- s.connect(sockaddr) --> None
55- s.connect_ex(sockaddr) --> 0 or errno (handy for e.g. async connect)
Guido van Rossum27e177d1995-03-16 15:43:47 +000056- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000057- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000058- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000059- s.getsockname() --> sockaddr
60- s.getsockopt(level, optname[, buflen]) --> int or string
61- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000062- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000063- s.recv(buflen [,flags]) --> string
64- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000065- s.send(string [,flags]) --> nbytes
Guido van Rossum9f7a5392001-10-26 03:25:00 +000066- s.sendall(string [,flags]) # tries to send everything in a loop
Guido van Rossumb6775db1994-08-01 11:34:53 +000067- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000068- s.setblocking(0 | 1) --> None
Guido van Rossum67f7a382002-06-06 21:08:16 +000069- s.settimeout(None | float) -> None # Argument in seconds
70- s.gettimeout() -> None or float seconds
Guido van Rossum27e177d1995-03-16 15:43:47 +000071- s.setsockopt(level, optname, value) --> None
72- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000073- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000074
Guido van Rossum6574b3e1991-06-25 21:36:08 +000075*/
76
Guido van Rossum73624e91994-10-10 17:59:00 +000077#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000078
Guido van Rossum384ca9c2001-10-27 22:20:47 +000079/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
80 I hope some day someone can clean this up please... */
81
Guido van Rossum9376b741999-09-15 22:01:40 +000082/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
83 script doesn't get this right, so we hardcode some platform checks below.
84 On the other hand, not all Linux versions agree, so there the settings
85 computed by the configure script are needed! */
86
87#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000088# undef HAVE_GETHOSTBYNAME_R_3_ARG
89# undef HAVE_GETHOSTBYNAME_R_5_ARG
90# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000091#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000092
Guido van Rossum7a122991999-04-13 04:07:32 +000093#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000094# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000095#endif
96
Guido van Rossume7de2061999-03-24 17:24:33 +000097#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000098# if defined(_AIX) || defined(__osf__)
99# define HAVE_GETHOSTBYNAME_R_3_ARG
100# elif defined(__sun) || defined(__sgi)
101# define HAVE_GETHOSTBYNAME_R_5_ARG
102# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000103/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000104# else
105# undef HAVE_GETHOSTBYNAME_R
106# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000107#endif
108
Guido van Rossum3baaa131999-03-22 21:44:51 +0000109#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000110# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000111#endif
112
113#ifdef USE_GETHOSTBYNAME_LOCK
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000114# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000115#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000116
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000117#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000118# include <types.h>
119# include <io.h>
120# include <sys/ioctl.h>
121# include <utils.h>
122# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000123#endif
124
125#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000126# define INCL_DOS
127# define INCL_DOSERRORS
128# define INCL_NOPMAPI
129# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000130#endif
131
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000132/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000133#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000134#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000135
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000136/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000137#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000138#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000139
140/* Addressing includes */
141
Guido van Rossum6f489d91996-06-28 20:15:15 +0000142#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000143
144/* Non-MS WINDOWS includes */
145# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000146
Guido van Rossum9376b741999-09-15 22:01:40 +0000147/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000148# ifdef __BEOS__
149# include <net/netdb.h>
150# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
151# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000152typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000153# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000154# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000155# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000156
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# ifndef RISCOS
158# include <fcntl.h>
159# else
160# include <sys/fcntl.h>
161# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000162int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163# endif
164
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000165#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000166
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167/* MS_WINDOWS includes */
168# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000169
Jeremy Hylton22308652001-02-02 03:23:09 +0000170#endif
171
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000172#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000173# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000174#endif
175
176#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000178#endif
179
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000180#ifndef O_NDELAY
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# define O_NDELAY O_NONBLOCK /* For QNX only? */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000182#endif
183
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000184#include "addrinfo.h"
185
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000186#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000187int inet_pton (int af, const char *src, void *dst);
188const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000189#endif
190
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000191#ifdef __APPLE__
192/* On OS X, getaddrinfo returns no error indication of lookup
193 failure, so we must use the emulation instead of the libinfo
194 implementation. Unfortunately, performing an autoconf test
195 for this bug would require DNS access for the machine performing
196 the configuration, which is not acceptable. Therefore, we
197 determine the bug just by checking for __APPLE__. If this bug
198 gets ever fixed, perhaps checking for sys/version.h would be
199 appropriate, which is 10/0 on the system with the bug. */
200#undef HAVE_GETADDRINFO
201/* avoid clashes with the C library definition of the symbol. */
202#define getaddrinfo fake_getaddrinfo
203#endif
204
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000205/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000206#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000207#include "getaddrinfo.c"
208#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000209#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000210#include "getnameinfo.c"
211#endif
212
Guido van Rossumbcc20741998-08-04 22:53:56 +0000213#if defined(MS_WINDOWS) || defined(__BEOS__)
214/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000215/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000216#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000217#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000218#endif
219
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000220#ifdef MS_WIN32
221# define EAFNOSUPPORT WSAEAFNOSUPPORT
222# define snprintf _snprintf
223#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000224
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000225#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000226#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000227#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000228#endif
229
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000230#ifndef SOCKETCLOSE
231#define SOCKETCLOSE close
232#endif
233
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000234/* XXX There's a problem here: *static* functions are not supposed to have
235 a Py prefix (or use CapitalizedWords). Later... */
236
Guido van Rossum30a685f1991-06-27 15:51:29 +0000237/* Global variable holding the exception type for errors detected
238 by this module (but not argument type or memory errors, etc.). */
239
Guido van Rossum73624e91994-10-10 17:59:00 +0000240static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000241static PyObject *PyH_Error;
242static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000243
Guido van Rossum48a680c2001-03-02 06:34:14 +0000244#ifdef RISCOS
245/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
246static int taskwindow;
247#endif
248
Tim Peters643a7fc2002-02-17 04:13:21 +0000249/* A forward reference to the socket type object.
250 The PySocketSock_Type variable contains pointers to various functions,
251 some of which call PySocketSock_New(), which uses PySocketSock_Type, so
252 there has to be a circular reference. */
253staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000254
Guido van Rossum30a685f1991-06-27 15:51:29 +0000255/* Convenience function to raise an error according to errno
256 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000257
Guido van Rossum73624e91994-10-10 17:59:00 +0000258static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000259PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000260{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000261#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000262 int err_no = WSAGetLastError();
263 if (err_no) {
264 static struct { int no; const char *msg; } *msgp, msgs[] = {
265 { WSAEINTR, "Interrupted system call" },
266 { WSAEBADF, "Bad file descriptor" },
267 { WSAEACCES, "Permission denied" },
268 { WSAEFAULT, "Bad address" },
269 { WSAEINVAL, "Invalid argument" },
270 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000271 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000272 "The socket operation could not complete "
273 "without blocking" },
274 { WSAEINPROGRESS, "Operation now in progress" },
275 { WSAEALREADY, "Operation already in progress" },
276 { WSAENOTSOCK, "Socket operation on non-socket" },
277 { WSAEDESTADDRREQ, "Destination address required" },
278 { WSAEMSGSIZE, "Message too long" },
279 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
280 { WSAENOPROTOOPT, "Protocol not available" },
281 { WSAEPROTONOSUPPORT, "Protocol not supported" },
282 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
283 { WSAEOPNOTSUPP, "Operation not supported" },
284 { WSAEPFNOSUPPORT, "Protocol family not supported" },
285 { WSAEAFNOSUPPORT, "Address family not supported" },
286 { WSAEADDRINUSE, "Address already in use" },
287 { WSAEADDRNOTAVAIL,
288 "Can't assign requested address" },
289 { WSAENETDOWN, "Network is down" },
290 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000291 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000292 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000293 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000294 "Software caused connection abort" },
295 { WSAECONNRESET, "Connection reset by peer" },
296 { WSAENOBUFS, "No buffer space available" },
297 { WSAEISCONN, "Socket is already connected" },
298 { WSAENOTCONN, "Socket is not connected" },
299 { WSAESHUTDOWN, "Can't send after socket shutdown" },
300 { WSAETOOMANYREFS,
301 "Too many references: can't splice" },
302 { WSAETIMEDOUT, "Operation timed out" },
303 { WSAECONNREFUSED, "Connection refused" },
304 { WSAELOOP, "Too many levels of symbolic links" },
305 { WSAENAMETOOLONG, "File name too long" },
306 { WSAEHOSTDOWN, "Host is down" },
307 { WSAEHOSTUNREACH, "No route to host" },
308 { WSAENOTEMPTY, "Directory not empty" },
309 { WSAEPROCLIM, "Too many processes" },
310 { WSAEUSERS, "Too many users" },
311 { WSAEDQUOT, "Disc quota exceeded" },
312 { WSAESTALE, "Stale NFS file handle" },
313 { WSAEREMOTE, "Too many levels of remote in path" },
314 { WSASYSNOTREADY,
315 "Network subsystem is unvailable" },
316 { WSAVERNOTSUPPORTED,
317 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000318 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000319 "Successful WSAStartup() not yet performed" },
320 { WSAEDISCON, "Graceful shutdown in progress" },
321 /* Resolver errors */
322 { WSAHOST_NOT_FOUND, "No such host is known" },
323 { WSATRY_AGAIN, "Host not found, or server failed" },
324 { WSANO_RECOVERY,
325 "Unexpected server error encountered" },
326 { WSANO_DATA, "Valid name without requested data" },
327 { WSANO_ADDRESS, "No address, look for MX record" },
328 { 0, NULL }
329 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000330 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000331 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000332
Mark Hammond46a733d2000-07-24 01:45:11 +0000333 for (msgp = msgs; msgp->msg; msgp++) {
334 if (err_no == msgp->no) {
335 msg = msgp->msg;
336 break;
337 }
338 }
339
340 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000341 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000342 PyErr_SetObject(PySocket_Error, v);
343 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000344 }
345 return NULL;
346 }
347 else
348#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000349
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000350#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000351 if (sock_errno() != NO_ERROR) {
352 APIRET rc;
353 ULONG msglen;
354 char outbuf[100];
355 int myerrorcode = sock_errno();
356
357 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
358 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
359 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
360 if (rc == NO_ERROR) {
361 PyObject *v;
362
363 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
364 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
365 char *lastc = &outbuf[ strlen(outbuf)-1 ];
366 while (lastc > outbuf && isspace(*lastc))
367 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
368 }
369 v = Py_BuildValue("(is)", myerrorcode, outbuf);
370 if (v != NULL) {
371 PyErr_SetObject(PySocket_Error, v);
372 Py_DECREF(v);
373 }
374 return NULL;
375 }
376 }
377#endif
378
Guido van Rossum73624e91994-10-10 17:59:00 +0000379 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000380}
381
Guido van Rossum30a685f1991-06-27 15:51:29 +0000382
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000383static PyObject *
384PyH_Err(int h_error)
385{
386 PyObject *v;
387
388#ifdef HAVE_HSTRERROR
389 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
390#else
391 v = Py_BuildValue("(is)", h_error, "host not found");
392#endif
393 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000394 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000395 Py_DECREF(v);
396 }
397
398 return NULL;
399}
400
401
402static PyObject *
403PyGAI_Err(int error)
404{
405 PyObject *v;
406
Martin v. Löwis272cb402002-03-01 08:31:07 +0000407#ifdef EAI_SYSTEM
408 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000409 if (error == EAI_SYSTEM)
410 return PySocket_Err();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000411#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000412
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000413#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000414 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000415#else
416 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
417#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000418 if (v != NULL) {
419 PyErr_SetObject(PyGAI_Error, v);
420 Py_DECREF(v);
421 }
422
423 return NULL;
424}
425
Guido van Rossum67f7a382002-06-06 21:08:16 +0000426/* For timeout errors */
427static PyObject *
428timeout_err(void)
429{
430 PyObject *v;
431
432#ifdef MS_WINDOWS
433 v = Py_BuildValue("(is)", WSAETIMEDOUT, "Socket operation timed out");
434#else
435 v = Py_BuildValue("(is)", ETIMEDOUT, "Socket operation timed out");
436#endif
437
438 if (v != NULL) {
439 PyErr_SetObject(PySocket_Error, v);
440 Py_DECREF(v);
441 }
442
443 return NULL;
444}
445
446/* Function to perfrom the setting of socket blocking mode
447 * internally. block = (1 | 0).
448 */
449static int
450internal_setblocking(PySocketSockObject *s, int block)
451{
452#ifndef RISCOS
453#ifndef MS_WINDOWS
454 int delay_flag;
455#endif
456#endif
457
458 Py_BEGIN_ALLOW_THREADS
459#ifdef __BEOS__
460 block = !block;
461 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
462 (void *)(&block), sizeof(int));
463#else
464#ifndef RISCOS
465#ifndef MS_WINDOWS
466#if defined(PYOS_OS2) && !defined(PYCC_GCC)
467 block = !block;
468 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
469#else /* !PYOS_OS2 */
470 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
471 if (block)
472 delay_flag &= (~O_NDELAY);
473 else
474 delay_flag |= O_NDELAY;
475 fcntl(s->sock_fd, F_SETFL, delay_flag);
476#endif /* !PYOS_OS2 */
477#else /* MS_WINDOWS */
478 block = !block;
479 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
480#endif /* MS_WINDOWS */
481#endif /* __BEOS__ */
482#endif /* RISCOS */
483 Py_END_ALLOW_THREADS
484
485 /* Since these don't return anything */
486 return 1;
487}
488
489/* For access to the select module to poll the socket for timeout
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000490 * functionality. writing is 1 for writing, 0 for reading.
Guido van Rossum67f7a382002-06-06 21:08:16 +0000491 * Return value: -1 if error, 0 if not ready, >= 1 if ready.
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000492 * An exception is set when the return value is <= 0 (!).
Guido van Rossum67f7a382002-06-06 21:08:16 +0000493 */
494static int
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000495internal_select(PySocketSockObject *s, int writing)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000496{
497 fd_set fds;
498 struct timeval tv;
499 int count;
500
501 /* Construct the arguments to select */
502 tv.tv_sec = (int)s->sock_timeout;
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000503 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000504 FD_ZERO(&fds);
505 FD_SET(s->sock_fd, &fds);
506
507 /* See if the socket is ready */
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000508 if (writing)
509 count = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000510 else
Guido van Rossumb9e916a2002-06-07 01:42:47 +0000511 count = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000512
513 /* Check for errors */
514 if (count < 0) {
515 s->errorhandler();
516 return -1;
517 }
518
519 /* Set the error if the timeout has elapsed, i.e, we were not
520 * polled.
521 */
522 if (count == 0)
523 timeout_err();
524
525 return count;
526}
527
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000528/* Initialize a new socket object. */
529
530static void
531init_sockobject(PySocketSockObject *s,
532 SOCKET_T fd, int family, int type, int proto)
533{
534#ifdef RISCOS
535 int block = 1;
536#endif
537 s->sock_fd = fd;
538 s->sock_family = family;
539 s->sock_type = type;
540 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000541 s->sock_blocking = 1; /* Start in blocking mode */
542 s->sock_timeout = -1.0; /* Start without timeout */
543
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000544 s->errorhandler = &PySocket_Err;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000545#ifdef RISCOS
546 if(taskwindow) {
547 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
548 }
549#endif
550}
551
552
Guido van Rossum30a685f1991-06-27 15:51:29 +0000553/* Create a new socket object.
554 This just creates the object and initializes it.
555 If the creation fails, return NULL and set an exception (implicit
556 in NEWOBJ()). */
557
Guido van Rossum73624e91994-10-10 17:59:00 +0000558static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000559PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000560{
Guido van Rossum73624e91994-10-10 17:59:00 +0000561 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000562 s = (PySocketSockObject *)
563 PyType_GenericNew(&PySocketSock_Type, NULL, NULL);
564 if (s != NULL)
565 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000566 return s;
567}
568
Guido van Rossum30a685f1991-06-27 15:51:29 +0000569
Guido van Rossum48a680c2001-03-02 06:34:14 +0000570/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000571 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000572#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000573PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000574#endif
575
576
Guido van Rossum30a685f1991-06-27 15:51:29 +0000577/* Convert a string specifying a host name or one of a few symbolic
578 names to a numeric IP address. This usually calls gethostbyname()
579 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000580 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000581 an error occurred; then an exception is raised. */
582
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000583static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000585{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586 struct addrinfo hints, *res;
587 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000588
Guido van Rossuma376cc51996-12-05 23:43:35 +0000589 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000590 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000591 int siz;
592 memset(&hints, 0, sizeof(hints));
593 hints.ai_family = af;
594 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
595 hints.ai_flags = AI_PASSIVE;
596 error = getaddrinfo(NULL, "0", &hints, &res);
597 if (error) {
598 PyGAI_Err(error);
599 return -1;
600 }
601 switch (res->ai_family) {
602 case AF_INET:
603 siz = 4;
604 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000605#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000606 case AF_INET6:
607 siz = 16;
608 break;
609#endif
610 default:
611 freeaddrinfo(res);
612 PyErr_SetString(PySocket_Error,
613 "unsupported address family");
614 return -1;
615 }
616 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000617 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000618 PyErr_SetString(PySocket_Error,
619 "wildcard resolved to multiple address");
620 return -1;
621 }
622 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
623 freeaddrinfo(res);
624 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000625 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000626 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000627 struct sockaddr_in *sin;
628 if (af != PF_INET && af != PF_UNSPEC) {
629 PyErr_SetString(PySocket_Error,
630 "address family mismatched");
631 return -1;
632 }
633 sin = (struct sockaddr_in *)addr_ret;
634 memset((void *) sin, '\0', sizeof(*sin));
635 sin->sin_family = AF_INET;
636#ifdef HAVE_SOCKADDR_SA_LEN
637 sin->sin_len = sizeof(*sin);
638#endif
639 sin->sin_addr.s_addr = INADDR_BROADCAST;
640 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000642 memset(&hints, 0, sizeof(hints));
643 hints.ai_family = af;
644 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000645#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000646 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000647 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000648 fails if no address family is given. Assume IPv4 for now.*/
649 hints.ai_family = AF_INET;
650 error = getaddrinfo(name, NULL, &hints, &res);
651 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000652#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000653 if (error) {
654 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000655 return -1;
656 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000657 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
658 freeaddrinfo(res);
659 switch (addr_ret->sa_family) {
660 case AF_INET:
661 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000662#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000663 case AF_INET6:
664 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000665#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000666 default:
667 PyErr_SetString(PySocket_Error, "unknown address family");
668 return -1;
669 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000670}
671
Guido van Rossum30a685f1991-06-27 15:51:29 +0000672
Guido van Rossum30a685f1991-06-27 15:51:29 +0000673/* Create a string object representing an IP address.
674 This is always a string of the form 'dd.dd.dd.dd' (with variable
675 size numbers). */
676
Guido van Rossum73624e91994-10-10 17:59:00 +0000677static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000678makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000679{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000680 char buf[NI_MAXHOST];
681 int error;
682
683 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
684 NI_NUMERICHOST);
685 if (error) {
686 PyGAI_Err(error);
687 return NULL;
688 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000689 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000690}
691
692
693/* Create an object representing the given socket address,
694 suitable for passing it back to bind(), connect() etc.
695 The family field of the sockaddr structure is inspected
696 to determine what kind of address it really is. */
697
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000698/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000699static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000700makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000701{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000702 if (addrlen == 0) {
703 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000704 Py_INCREF(Py_None);
705 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000706 }
707
Guido van Rossumbcc20741998-08-04 22:53:56 +0000708#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000709 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000710 addr->sa_family = AF_INET;
711#endif
712
Guido van Rossum30a685f1991-06-27 15:51:29 +0000713 switch (addr->sa_family) {
714
715 case AF_INET:
716 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000717 struct sockaddr_in *a;
718 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000719 PyObject *ret = NULL;
720 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000721 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000722 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
723 Py_DECREF(addrobj);
724 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000725 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000726 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000727
Guido van Rossumb6775db1994-08-01 11:34:53 +0000728#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000729 case AF_UNIX:
730 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000732 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000733 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000734#endif /* AF_UNIX */
735
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000736#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000737 case AF_INET6:
738 {
739 struct sockaddr_in6 *a;
740 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
741 PyObject *ret = NULL;
742 if (addrobj) {
743 a = (struct sockaddr_in6 *)addr;
744 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
745 a->sin6_flowinfo, a->sin6_scope_id);
746 Py_DECREF(addrobj);
747 }
748 return ret;
749 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000750#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000752#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000753 case AF_PACKET:
754 {
755 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
756 char *ifname = "";
757 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000758 /* need to look up interface name give index */
759 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000760 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000761 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000762 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000763 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000764 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000765 a->sll_pkttype, a->sll_hatype,
766 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000767 }
768#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000769
Guido van Rossum30a685f1991-06-27 15:51:29 +0000770 /* More cases here... */
771
772 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000773 /* If we don't know the address family, don't raise an
774 exception -- return it as a tuple. */
775 return Py_BuildValue("is#",
776 addr->sa_family,
777 addr->sa_data,
778 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000779
Guido van Rossum30a685f1991-06-27 15:51:29 +0000780 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781}
782
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783
784/* Parse a socket address argument according to the socket object's
785 address family. Return 1 if the address was in the proper format,
786 0 of not. The address is returned through addr_ret, its length
787 through len_ret. */
788
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000789static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000790getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000791 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000792{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000793 switch (s->sock_family) {
794
Guido van Rossumb6775db1994-08-01 11:34:53 +0000795#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000796 case AF_UNIX:
797 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000798 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000799 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000801 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000802 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000803 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000804 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000805 PyErr_SetString(PySocket_Error,
806 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000807 return 0;
808 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000809 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000810 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000811 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000812 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000813 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000814 return 1;
815 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000816#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000817
Guido van Rossum30a685f1991-06-27 15:51:29 +0000818 case AF_INET:
819 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000820 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000821 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000823 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000824 if (!PyTuple_Check(args)) {
825 PyErr_Format(PyExc_TypeError,
826 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
827 args->ob_type->tp_name);
828 return 0;
829 }
830 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000832 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000833 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000834 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000835 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000836 *addr_ret = (struct sockaddr *) addr;
837 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000838 return 1;
839 }
840
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000841#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000842 case AF_INET6:
843 {
844 struct sockaddr_in6* addr;
845 char *host;
846 int port, flowinfo, scope_id;
847 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
848 flowinfo = scope_id = 0;
849 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
850 &scope_id)) {
851 return 0;
852 }
853 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
854 return 0;
855 addr->sin6_family = s->sock_family;
856 addr->sin6_port = htons((short)port);
857 addr->sin6_flowinfo = flowinfo;
858 addr->sin6_scope_id = scope_id;
859 *addr_ret = (struct sockaddr *) addr;
860 *len_ret = sizeof *addr;
861 return 1;
862 }
863#endif
864
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000865#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000866 case AF_PACKET:
867 {
868 struct sockaddr_ll* addr;
869 struct ifreq ifr;
870 char *interfaceName;
871 int protoNumber;
872 int hatype = 0;
873 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000874 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000875
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000876 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
877 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000878 return 0;
879 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
880 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000881 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000882 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000883 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000884 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000885 addr = &(s->sock_addr.ll);
886 addr->sll_family = AF_PACKET;
887 addr->sll_protocol = htons((short)protoNumber);
888 addr->sll_ifindex = ifr.ifr_ifindex;
889 addr->sll_pkttype = pkttype;
890 addr->sll_hatype = hatype;
891 *addr_ret = (struct sockaddr *) addr;
892 *len_ret = sizeof *addr;
893 return 1;
894 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000895#endif
896
Guido van Rossum30a685f1991-06-27 15:51:29 +0000897 /* More cases here... */
898
899 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000900 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000901 return 0;
902
903 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000904}
905
Guido van Rossum30a685f1991-06-27 15:51:29 +0000906
Guido van Rossum48a680c2001-03-02 06:34:14 +0000907/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000908 Return 1 if the family is known, 0 otherwise. The length is returned
909 through len_ret. */
910
911static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000912getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000913{
914 switch (s->sock_family) {
915
Guido van Rossumb6775db1994-08-01 11:34:53 +0000916#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000917 case AF_UNIX:
918 {
919 *len_ret = sizeof (struct sockaddr_un);
920 return 1;
921 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000922#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000923
924 case AF_INET:
925 {
926 *len_ret = sizeof (struct sockaddr_in);
927 return 1;
928 }
929
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000930#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000931 case AF_INET6:
932 {
933 *len_ret = sizeof (struct sockaddr_in6);
934 return 1;
935 }
936#endif
937
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000938#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000939 case AF_PACKET:
940 {
941 *len_ret = sizeof (struct sockaddr_ll);
942 return 1;
943 }
944#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000945
Guido van Rossum710e1df1992-06-12 10:39:36 +0000946 /* More cases here... */
947
948 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000949 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000950 return 0;
951
952 }
953}
954
955
Guido van Rossum30a685f1991-06-27 15:51:29 +0000956/* s.accept() method */
957
Guido van Rossum73624e91994-10-10 17:59:00 +0000958static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000959PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000960{
961 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000962 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000963 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000964 PyObject *sock = NULL;
965 PyObject *addr = NULL;
966 PyObject *res = NULL;
967
Guido van Rossum710e1df1992-06-12 10:39:36 +0000968 if (!getsockaddrlen(s, &addrlen))
969 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000970 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000971
972 errno = 0; /* Reset indicator for use with timeout behavior */
973
Guido van Rossum73624e91994-10-10 17:59:00 +0000974 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000975 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000976 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000977
978 if (s->sock_timeout >= 0.0) {
979#ifdef MS_WINDOWS
980 if (newfd == INVALID_SOCKET)
981 if (!s->sock_blocking)
982 return s->errorhandler();
983 /* Check if we have a true failure
984 for a blocking socket */
985 if (errno != WSAEWOULDBLOCK)
986 return s->errorhandler();
987#else
988 if (newfd < 0) {
989 if (!s->sock_blocking)
990 return s->errorhandler();
991 /* Check if we have a true failure
992 for a blocking socket */
993 if (errno != EAGAIN && errno != EWOULDBLOCK)
994 return s->errorhandler();
995 }
996#endif
997
998 /* try waiting the timeout period */
999 if (internal_select(s, 0) <= 0)
1000 return NULL;
1001
1002 Py_BEGIN_ALLOW_THREADS
1003 newfd = accept(s->sock_fd,
1004 (struct sockaddr *)addrbuf,
1005 &addrlen);
1006 Py_END_ALLOW_THREADS
1007 }
1008
1009 /* At this point, we really have an error, whether using timeout
1010 * behavior or regular socket behavior
1011 */
Fred Drakea04eaad2000-06-30 02:46:07 +00001012#ifdef MS_WINDOWS
1013 if (newfd == INVALID_SOCKET)
1014#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001015 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001016#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001017 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001018
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019 /* Create the new object with unspecified family,
1020 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +00001021 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001022 s->sock_family,
1023 s->sock_type,
1024 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001025
Barry Warsaw752300b1997-01-03 17:18:10 +00001026 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001027 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001028 goto finally;
1029 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001030 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001031 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001032 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001033 goto finally;
1034
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001035 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001036
Guido van Rossum67f7a382002-06-06 21:08:16 +00001037finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001038 Py_XDECREF(sock);
1039 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001040 return res;
1041}
1042
Guido van Rossum82a5c661998-07-07 20:45:43 +00001043static char accept_doc[] =
1044"accept() -> (socket object, address info)\n\
1045\n\
1046Wait for an incoming connection. Return a new socket representing the\n\
1047connection, and the address of the client. For IP sockets, the address\n\
1048info is a pair (hostaddr, port).";
1049
Guido van Rossume4485b01994-09-07 14:32:49 +00001050/* s.setblocking(1 | 0) method */
1051
Guido van Rossum73624e91994-10-10 17:59:00 +00001052static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001053PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001054{
1055 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001056
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001057 block = PyInt_AsLong(arg);
1058 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001059 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001060
1061 s->sock_blocking = block;
1062
1063 /* If we're not using timeouts, actually set the blocking to give
1064 * old python behavior.
1065 */
1066 if (s->sock_timeout < 0.0)
1067 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001068
Guido van Rossum73624e91994-10-10 17:59:00 +00001069 Py_INCREF(Py_None);
1070 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001071}
Guido van Rossume4485b01994-09-07 14:32:49 +00001072
Guido van Rossum82a5c661998-07-07 20:45:43 +00001073static char setblocking_doc[] =
1074"setblocking(flag)\n\
1075\n\
1076Set the socket to blocking (flag is true) or non-blocking (false).\n\
1077This uses the FIONBIO ioctl with the O_NDELAY flag.";
1078
Guido van Rossumb9e916a2002-06-07 01:42:47 +00001079/* s.settimeout(float | None) method.
1080 * Causes an exception to be raised when the given time has
1081 * elapsed when performing a blocking socket operation.
Guido van Rossum67f7a382002-06-06 21:08:16 +00001082 */
1083static PyObject *
1084PySocketSock_settimeout(PySocketSockObject *s, PyObject *arg)
1085{
1086 double value;
1087
1088 if (arg == Py_None)
1089 value = -1.0;
1090 else {
1091 value = PyFloat_AsDouble(arg);
1092 if (value < 0.0) {
1093 if (!PyErr_Occurred())
1094 PyErr_SetString(PyExc_ValueError,
1095 "Invalid timeout value");
1096 return NULL;
1097 }
1098 }
1099
1100 s->sock_timeout = value;
1101
1102 /* The semantics of setting socket timeouts are:
1103 * If you settimeout(!=None):
1104 * The actual socket gets put in non-blocking mode and the select
1105 * is used to control timeouts.
1106 * Else if you settimeout(None) [then value is -1.0]:
1107 * The old behavior is used AND automatically, the socket is set
1108 * to blocking mode. That means that someone who was doing
1109 * non-blocking stuff before, sets a timeout, and then unsets
1110 * one, will have to call setblocking(0) again if he wants
1111 * non-blocking stuff. This makes sense because timeout stuff is
1112 * blocking by nature.
1113 */
Guido van Rossumb9e916a2002-06-07 01:42:47 +00001114 internal_setblocking(s, value < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001115
1116 s->sock_blocking = 1; /* Always negate setblocking() */
1117
1118 Py_INCREF(Py_None);
1119 return Py_None;
1120}
1121
1122static char settimeout_doc[] =
1123"settimeout(seconds)\n\
1124\n\
1125Set a timeout on blocking socket operations. 'seconds' can be a floating,\n\
1126integer, or long number of seconds, or the None value. Socket operations\n\
1127will raise an exception if the timeout period has elapsed before the\n\
1128operation has completed. Setting a timeout of None disables timeouts\n\
1129on socket operations.";
1130
1131/* s.gettimeout () method.
1132 * Returns the timeout associated with a socket.
1133 */
1134static PyObject *
1135PySocketSock_gettimeout(PySocketSockObject *s)
1136{
1137 if (s->sock_timeout < 0.0) {
1138 Py_INCREF(Py_None);
1139 return Py_None;
1140 }
1141 else
1142 return PyFloat_FromDouble(s->sock_timeout);
1143}
1144
1145static char gettimeout_doc[] =
1146"gettimeout()\n\
1147\n\
1148Returns the timeout in floating seconds associated with socket \n\
1149operations. A timeout of None indicates that timeouts on socket \n\
1150operations are disabled.";
Guido van Rossume4485b01994-09-07 14:32:49 +00001151
Guido van Rossum48a680c2001-03-02 06:34:14 +00001152#ifdef RISCOS
1153/* s.sleeptaskw(1 | 0) method */
1154
1155static PyObject *
1156PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1157{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001158 int block;
1159 int delay_flag;
1160 if (!PyArg_Parse(args, "i", &block))
1161 return NULL;
1162 Py_BEGIN_ALLOW_THREADS
1163 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1164 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001165
Guido van Rossum67f7a382002-06-06 21:08:16 +00001166 Py_INCREF(Py_None);
1167 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001168}
1169static char sleeptaskw_doc[] =
1170"sleeptaskw(flag)\n\
1171\n\
1172Allow sleeps in taskwindows.";
1173#endif
1174
1175
Guido van Rossumaee08791992-09-08 09:05:33 +00001176/* s.setsockopt() method.
1177 With an integer third argument, sets an integer option.
1178 With a string third argument, sets an option from a buffer;
1179 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001180
Guido van Rossum73624e91994-10-10 17:59:00 +00001181static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001182PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001183{
1184 int level;
1185 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001186 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001187 char *buf;
1188 int buflen;
1189 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001190
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001191 if (PyArg_ParseTuple(args, "iii:setsockopt",
1192 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001193 buf = (char *) &flag;
1194 buflen = sizeof flag;
1195 }
1196 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001197 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001198 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1199 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001200 return NULL;
1201 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001202 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001203 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001204 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001205 Py_INCREF(Py_None);
1206 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001207}
1208
Guido van Rossum82a5c661998-07-07 20:45:43 +00001209static char setsockopt_doc[] =
1210"setsockopt(level, option, value)\n\
1211\n\
1212Set a socket option. See the Unix manual for level and option.\n\
1213The value argument can either be an integer or a string.";
1214
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001215
Guido van Rossumaee08791992-09-08 09:05:33 +00001216/* s.getsockopt() method.
1217 With two arguments, retrieves an integer option.
1218 With a third integer argument, retrieves a string buffer of that size;
1219 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001220
Guido van Rossum73624e91994-10-10 17:59:00 +00001221static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001222PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001223{
1224 int level;
1225 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001226 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001227 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001228 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001229
Guido van Rossumbcc20741998-08-04 22:53:56 +00001230#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001231 /* We have incomplete socket support. */
1232 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001233 return NULL;
1234#else
1235
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001236 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1237 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001238 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001239
Guido van Rossumbe32c891996-06-20 16:25:29 +00001240 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001241 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001242 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001243 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001244 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001245 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001246 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001247 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001248 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001249 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001250 PyErr_SetString(PySocket_Error,
1251 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001252 return NULL;
1253 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001254 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001255 if (buf == NULL)
1256 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001257 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001258 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001259 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001260 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001261 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001262 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001263 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001264 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001265#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001266}
1267
Guido van Rossum82a5c661998-07-07 20:45:43 +00001268static char getsockopt_doc[] =
1269"getsockopt(level, option[, buffersize]) -> value\n\
1270\n\
1271Get a socket option. See the Unix manual for level and option.\n\
1272If a nonzero buffersize argument is given, the return value is a\n\
1273string of that length; otherwise it is an integer.";
1274
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001275
Fred Drake728819a2000-07-01 03:40:12 +00001276/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001277
Guido van Rossum73624e91994-10-10 17:59:00 +00001278static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001279PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001280{
1281 struct sockaddr *addr;
1282 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001283 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001284
Fred Drake728819a2000-07-01 03:40:12 +00001285 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001286 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001287 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001288 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001289 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001290 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001291 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001292 Py_INCREF(Py_None);
1293 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001294}
1295
Guido van Rossum82a5c661998-07-07 20:45:43 +00001296static char bind_doc[] =
1297"bind(address)\n\
1298\n\
1299Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001300pair (host, port); the host must refer to the local host. For raw packet\n\
1301sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001302
Guido van Rossum30a685f1991-06-27 15:51:29 +00001303
1304/* s.close() method.
1305 Set the file descriptor to -1 so operations tried subsequently
1306 will surely fail. */
1307
Guido van Rossum73624e91994-10-10 17:59:00 +00001308static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001309PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001310{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001311 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001312
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001313 if ((fd = s->sock_fd) != -1) {
1314 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001315 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001316 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001317 Py_END_ALLOW_THREADS
1318 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001319 Py_INCREF(Py_None);
1320 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001321}
1322
Guido van Rossum82a5c661998-07-07 20:45:43 +00001323static char close_doc[] =
1324"close()\n\
1325\n\
1326Close the socket. It cannot be used after this call.";
1327
Guido van Rossum30a685f1991-06-27 15:51:29 +00001328
Fred Drake728819a2000-07-01 03:40:12 +00001329/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001330
Guido van Rossum73624e91994-10-10 17:59:00 +00001331static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001332PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001333{
1334 struct sockaddr *addr;
1335 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001336 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001337
Fred Drake728819a2000-07-01 03:40:12 +00001338 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001339 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001340
1341 errno = 0; /* Reset the err indicator for use with timeouts */
1342
Guido van Rossum73624e91994-10-10 17:59:00 +00001343 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001344 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001345 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001346
1347 if (s->sock_timeout >= 0.0) {
1348 if (res < 0) {
1349 /* Return if we're already connected */
1350#ifdef MS_WINDOWS
1351 if (errno == WSAEINVAL || errno == WSAEISCONN)
1352#else
1353 if (errno == EISCONN)
1354#endif
1355 goto connected;
1356
1357 /* Check if we have an error */
1358 if (!s->sock_blocking)
1359 return s->errorhandler ();
1360 /* Check if we have a true failure for a blocking socket */
1361#ifdef MS_WINDOWS
1362 if (errno != WSAEWOULDBLOCK)
1363#else
1364 if (errno != EINPROGRESS && errno != EALREADY &&
1365 errno != EWOULDBLOCK)
1366#endif
1367 return s->errorhandler();
1368 }
1369
1370 /* Check if we're ready for the connect via select */
1371 if (internal_select(s, 1) <= 0)
1372 return NULL;
1373
1374 /* Complete the connection now */
1375 Py_BEGIN_ALLOW_THREADS
1376 res = connect(s->sock_fd, addr, addrlen);
1377 Py_END_ALLOW_THREADS
1378 }
1379
Guido van Rossumff4949e1992-08-05 19:58:53 +00001380 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001381 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001382
1383connected:
Guido van Rossum73624e91994-10-10 17:59:00 +00001384 Py_INCREF(Py_None);
1385 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001386}
1387
Guido van Rossum82a5c661998-07-07 20:45:43 +00001388static char connect_doc[] =
1389"connect(address)\n\
1390\n\
1391Connect the socket to a remote address. For IP sockets, the address\n\
1392is a pair (host, port).";
1393
Guido van Rossum30a685f1991-06-27 15:51:29 +00001394
Fred Drake728819a2000-07-01 03:40:12 +00001395/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001396
1397static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001398PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001399{
1400 struct sockaddr *addr;
1401 int addrlen;
1402 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001403
Fred Drake728819a2000-07-01 03:40:12 +00001404 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001405 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001406
1407 errno = 0; /* Reset the err indicator for use with timeouts */
1408
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001409 Py_BEGIN_ALLOW_THREADS
1410 res = connect(s->sock_fd, addr, addrlen);
1411 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001412
1413 if (s->sock_timeout >= 0.0) {
1414 if (res < 0) {
1415 /* Return if we're already connected */
1416#ifdef MS_WINDOWS
1417 if (errno == WSAEINVAL || errno == WSAEISCONN)
1418#else
1419 if (errno == EISCONN)
1420#endif
1421 goto conex_finally;
1422
1423 /* Check if we have an error */
1424 if (!s->sock_blocking)
1425 goto conex_finally;
1426 /* Check if we have a true failure for a blocking socket */
1427#ifdef MS_WINDOWS
1428 if (errno != WSAEWOULDBLOCK)
1429#else
1430 if (errno != EINPROGRESS && errno != EALREADY &&
1431 errno != EWOULDBLOCK)
1432#endif
1433 goto conex_finally;
1434 }
1435
1436 /* Check if we're ready for the connect via select */
1437 if (internal_select(s, 1) <= 0)
1438 return NULL;
1439
1440 /* Complete the connection now */
1441 Py_BEGIN_ALLOW_THREADS
1442 res = connect(s->sock_fd, addr, addrlen);
1443 Py_END_ALLOW_THREADS
1444 }
1445
Tim Petersc32410a2001-10-30 01:26:49 +00001446 if (res != 0) {
1447#ifdef MS_WINDOWS
1448 res = WSAGetLastError();
1449#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001450 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001451#endif
1452 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001453
1454conex_finally:
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001455 return PyInt_FromLong((long) res);
1456}
1457
Guido van Rossum82a5c661998-07-07 20:45:43 +00001458static char connect_ex_doc[] =
1459"connect_ex(address)\n\
1460\n\
1461This is like connect(address), but returns an error code (the errno value)\n\
1462instead of raising an exception when an error occurs.";
1463
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001464
Guido van Rossumed233a51992-06-23 09:07:03 +00001465/* s.fileno() method */
1466
Guido van Rossum73624e91994-10-10 17:59:00 +00001467static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001468PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001469{
Fred Drakea04eaad2000-06-30 02:46:07 +00001470#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001471 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001472#else
1473 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1474#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001475}
1476
Guido van Rossum82a5c661998-07-07 20:45:43 +00001477static char fileno_doc[] =
1478"fileno() -> integer\n\
1479\n\
1480Return the integer file descriptor of the socket.";
1481
Guido van Rossumed233a51992-06-23 09:07:03 +00001482
Guido van Rossumbe32c891996-06-20 16:25:29 +00001483#ifndef NO_DUP
1484/* s.dup() method */
1485
1486static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001487PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001488{
Fred Drakea04eaad2000-06-30 02:46:07 +00001489 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001490 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001491
Guido van Rossumbe32c891996-06-20 16:25:29 +00001492 newfd = dup(s->sock_fd);
1493 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001494 return s->errorhandler();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001495 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001496 s->sock_family,
1497 s->sock_type,
1498 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001499 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001500 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001501 return sock;
1502}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001503
1504static char dup_doc[] =
1505"dup() -> socket object\n\
1506\n\
1507Return a new socket object connected to the same system resource.";
1508
Guido van Rossumbe32c891996-06-20 16:25:29 +00001509#endif
1510
1511
Guido van Rossumc89705d1992-11-26 08:54:07 +00001512/* s.getsockname() method */
1513
Guido van Rossum73624e91994-10-10 17:59:00 +00001514static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001515PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001516{
1517 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001518 int res;
1519 socklen_t addrlen;
1520
Guido van Rossumc89705d1992-11-26 08:54:07 +00001521 if (!getsockaddrlen(s, &addrlen))
1522 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001523 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001524 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001525 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001526 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001527 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001528 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001529 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001530}
1531
Guido van Rossum82a5c661998-07-07 20:45:43 +00001532static char getsockname_doc[] =
1533"getsockname() -> address info\n\
1534\n\
1535Return the address of the local endpoint. For IP sockets, the address\n\
1536info is a pair (hostaddr, port).";
1537
Guido van Rossumc89705d1992-11-26 08:54:07 +00001538
Guido van Rossumb6775db1994-08-01 11:34:53 +00001539#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001540/* s.getpeername() method */
1541
Guido van Rossum73624e91994-10-10 17:59:00 +00001542static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001543PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001544{
1545 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001546 int res;
1547 socklen_t addrlen;
1548
Guido van Rossumc89705d1992-11-26 08:54:07 +00001549 if (!getsockaddrlen(s, &addrlen))
1550 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001551 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001552 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001553 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001554 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001555 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001556 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001557 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001558}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001559
1560static char getpeername_doc[] =
1561"getpeername() -> address info\n\
1562\n\
1563Return the address of the remote endpoint. For IP sockets, the address\n\
1564info is a pair (hostaddr, port).";
1565
Guido van Rossumb6775db1994-08-01 11:34:53 +00001566#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001567
1568
Guido van Rossum30a685f1991-06-27 15:51:29 +00001569/* s.listen(n) method */
1570
Guido van Rossum73624e91994-10-10 17:59:00 +00001571static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001572PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001573{
1574 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001575 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001576
1577 backlog = PyInt_AsLong(arg);
1578 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001579 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001580 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001581 if (backlog < 1)
1582 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001583 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001584 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001585 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001586 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001587 Py_INCREF(Py_None);
1588 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001589}
1590
Guido van Rossum82a5c661998-07-07 20:45:43 +00001591static char listen_doc[] =
1592"listen(backlog)\n\
1593\n\
1594Enable a server to accept connections. The backlog argument must be at\n\
1595least 1; it specifies the number of unaccepted connection that the system\n\
1596will allow before refusing new connections.";
1597
1598
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001599#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001600/* s.makefile(mode) method.
1601 Create a new open file object referring to a dupped version of
1602 the socket's file descriptor. (The dup() call is necessary so
1603 that the open file and socket objects may be closed independent
1604 of each other.)
1605 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1606
Guido van Rossum73624e91994-10-10 17:59:00 +00001607static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001608PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001609{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001610 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001611 char *mode = "r";
1612 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001613#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001614 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001615#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001616 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001617#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001618 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001619 PyObject *f;
1620
Guido van Rossum43713e52000-02-29 13:59:29 +00001621 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001622 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001623#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001624 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1625 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001626#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001627 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001628#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001629 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001630 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001631 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001632 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001633 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001634#ifdef USE_GUSI2
1635 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001636 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001637 bufsize = 0;
1638#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001639 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1640 if (f != NULL)
1641 PyFile_SetBufSize(f, bufsize);
1642 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001643}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001644
1645static char makefile_doc[] =
1646"makefile([mode[, buffersize]]) -> file object\n\
1647\n\
1648Return a regular file object corresponding to the socket.\n\
1649The mode and buffersize arguments are as for the built-in open() function.";
1650
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001651#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001652
Guido van Rossum48a680c2001-03-02 06:34:14 +00001653
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001654/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001655
Guido van Rossum73624e91994-10-10 17:59:00 +00001656static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001657PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001658{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001659 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001660 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001661
Guido van Rossum43713e52000-02-29 13:59:29 +00001662 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001663 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001664
1665 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001666 PyErr_SetString(PyExc_ValueError,
1667 "negative buffersize in connect");
1668 return NULL;
1669 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001670
Guido van Rossum73624e91994-10-10 17:59:00 +00001671 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001672 if (buf == NULL)
1673 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001674
1675 if (s->sock_timeout >= 0.0) {
1676 if (s->sock_blocking) {
1677 if (internal_select(s, 0) <= 0)
1678 return NULL;
1679 }
1680 }
1681
Guido van Rossum73624e91994-10-10 17:59:00 +00001682 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001683 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001684 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001685
Guido van Rossum7c53b771995-09-13 18:39:47 +00001686 if (n < 0) {
1687 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001688 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001689 }
Tim Peters5de98422002-04-27 18:44:32 +00001690 if (n != len)
1691 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001692 return buf;
1693}
1694
Guido van Rossum82a5c661998-07-07 20:45:43 +00001695static char recv_doc[] =
1696"recv(buffersize[, flags]) -> data\n\
1697\n\
1698Receive up to buffersize bytes from the socket. For the optional flags\n\
1699argument, see the Unix manual. When no data is available, block until\n\
1700at least one byte is available or until the remote end is closed. When\n\
1701the remote end is closed and all data is read, return the empty string.";
1702
Guido van Rossum30a685f1991-06-27 15:51:29 +00001703
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001704/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001705
Guido van Rossum73624e91994-10-10 17:59:00 +00001706static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001707PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001708{
1709 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001710 PyObject *buf = NULL;
1711 PyObject *addr = NULL;
1712 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001713 int len, n, flags = 0;
1714 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001715
Guido van Rossum43713e52000-02-29 13:59:29 +00001716 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001717 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001718
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001719 if (!getsockaddrlen(s, &addrlen))
1720 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001721 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001722 if (buf == NULL)
1723 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001724
1725 if (s->sock_timeout >= 0.0) {
1726 if (s->sock_blocking) {
1727 if (internal_select(s, 0) <= 0)
1728 return NULL;
1729 }
1730 }
1731
Guido van Rossum73624e91994-10-10 17:59:00 +00001732 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001733 memset(addrbuf, 0, addrlen);
1734 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001735#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001736#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001737 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001738#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001739 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001740#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001741#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001742 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001743#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001744 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001745 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001746
Guido van Rossum7c53b771995-09-13 18:39:47 +00001747 if (n < 0) {
1748 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001749 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001750 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001751
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001752 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001753 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001754
Guido van Rossum67f7a382002-06-06 21:08:16 +00001755 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
1756 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001757 goto finally;
1758
Guido van Rossum73624e91994-10-10 17:59:00 +00001759 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001760
1761finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001762 Py_XDECREF(addr);
1763 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001764 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001765}
1766
Guido van Rossum82a5c661998-07-07 20:45:43 +00001767static char recvfrom_doc[] =
1768"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1769\n\
1770Like recv(buffersize, flags) but also return the sender's address info.";
1771
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001772/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001773
Guido van Rossum73624e91994-10-10 17:59:00 +00001774static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001775PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001776{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001777 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001778 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001779
Guido van Rossum43713e52000-02-29 13:59:29 +00001780 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001781 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001782
1783 if (s->sock_timeout >= 0.0) {
1784 if (s->sock_blocking) {
1785 if (internal_select(s, 1) <= 0)
1786 return NULL;
1787 }
1788 }
1789
Guido van Rossum73624e91994-10-10 17:59:00 +00001790 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001791 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001792 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001793
Guido van Rossum30a685f1991-06-27 15:51:29 +00001794 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001795 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001796 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001797}
1798
Guido van Rossum82a5c661998-07-07 20:45:43 +00001799static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001800"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001801\n\
1802Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001803argument, see the Unix manual. Return the number of bytes\n\
1804sent; this may be less than len(data) if the network is busy.";
1805
1806
1807/* s.sendall(data [,flags]) method */
1808
1809static PyObject *
1810PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1811{
1812 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001813 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001814
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001815 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1816 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001817
1818 if (s->sock_timeout >= 0.0) {
1819 if (s->sock_blocking) {
Guido van Rossumb9e916a2002-06-07 01:42:47 +00001820 if (internal_select(s, 1) <= 0)
Guido van Rossum67f7a382002-06-06 21:08:16 +00001821 return NULL;
1822 }
1823 }
1824
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001825 Py_BEGIN_ALLOW_THREADS
1826 do {
1827 n = send(s->sock_fd, buf, len, flags);
1828 if (n < 0)
1829 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001830 buf += n;
1831 len -= n;
1832 } while (len > 0);
1833 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001834
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001835 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001836 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001837
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001838 Py_INCREF(Py_None);
1839 return Py_None;
1840}
1841
1842static char sendall_doc[] =
1843"sendall(data[, flags])\n\
1844\n\
1845Send a data string to the socket. For the optional flags\n\
1846argument, see the Unix manual. This calls send() repeatedly\n\
1847until all data is sent. If an error occurs, it's impossible\n\
1848to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001849
Guido van Rossum30a685f1991-06-27 15:51:29 +00001850
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001851/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001852
Guido van Rossum73624e91994-10-10 17:59:00 +00001853static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001854PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001855{
Guido van Rossum73624e91994-10-10 17:59:00 +00001856 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001857 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001858 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001859 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001860
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001861 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001862 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001863 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001864 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1865 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001866 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001867 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001868
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001869 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001870 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001871
1872 if (s->sock_timeout >= 0.0) {
1873 if (s->sock_blocking) {
1874 if (internal_select(s, 1) <= 0)
1875 return NULL;
1876 }
1877 }
1878
Guido van Rossum73624e91994-10-10 17:59:00 +00001879 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001880 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001881 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001882
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001883 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001884 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001885 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001886}
1887
Guido van Rossum82a5c661998-07-07 20:45:43 +00001888static char sendto_doc[] =
1889"sendto(data[, flags], address)\n\
1890\n\
1891Like send(data, flags) but allows specifying the destination address.\n\
1892For IP sockets, the address is a pair (hostaddr, port).";
1893
Guido van Rossum30a685f1991-06-27 15:51:29 +00001894
1895/* s.shutdown(how) method */
1896
Guido van Rossum73624e91994-10-10 17:59:00 +00001897static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001898PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001899{
1900 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001901 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001902
1903 how = PyInt_AsLong(arg);
1904 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001905 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001906 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001907 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001908 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001909 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001910 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001911 Py_INCREF(Py_None);
1912 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001913}
1914
Guido van Rossum82a5c661998-07-07 20:45:43 +00001915static char shutdown_doc[] =
1916"shutdown(flag)\n\
1917\n\
1918Shut down the reading side of the socket (flag == 0), the writing side\n\
1919of the socket (flag == 1), or both ends (flag == 2).";
1920
Guido van Rossum30a685f1991-06-27 15:51:29 +00001921
1922/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001923
Guido van Rossum73624e91994-10-10 17:59:00 +00001924static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001925 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001926 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001927 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001928 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001929 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001930 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001931 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001932 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001933 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001934 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001935#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001936 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001937 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001938#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001939 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001940 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001941#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001942 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001943 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001944#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001945 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001946 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001947 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1948 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001949 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001950 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001951#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001952 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1953 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001954#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001955 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1956 recv_doc},
1957 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1958 recvfrom_doc},
1959 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1960 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001961 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1962 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001963 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1964 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001965 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001966 setblocking_doc},
Guido van Rossum67f7a382002-06-06 21:08:16 +00001967 {"settimeout", (PyCFunction)PySocketSock_settimeout, METH_O,
1968 settimeout_doc},
1969 {"gettimeout", (PyCFunction)PySocketSock_gettimeout, METH_NOARGS,
1970 gettimeout_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001971 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1972 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001973 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001974 shutdown_doc},
1975#ifdef RISCOS
1976 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1977 sleeptaskw_doc},
1978#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001979 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001980};
1981
Guido van Rossum30a685f1991-06-27 15:51:29 +00001982
Guido van Rossum73624e91994-10-10 17:59:00 +00001983/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001984 First close the file description. */
1985
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001986static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001987PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001988{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001989 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001990 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001991 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001992}
1993
Guido van Rossum30a685f1991-06-27 15:51:29 +00001994
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001995static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001996PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001997{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001998 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001999#if SIZEOF_SOCKET_T > SIZEOF_LONG
2000 if (s->sock_fd > LONG_MAX) {
2001 /* this can occur on Win64, and actually there is a special
2002 ugly printf formatter for decimal pointer length integer
2003 printing, only bother if necessary*/
2004 PyErr_SetString(PyExc_OverflowError,
2005 "no printf formatter to display the socket descriptor in decimal");
2006 return NULL;
2007 }
2008#endif
Tim Peters885d4572001-11-28 20:27:42 +00002009 PyOS_snprintf(buf, sizeof(buf),
2010 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2011 (long)s->sock_fd, s->sock_family,
2012 s->sock_type,
2013 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002014 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002015}
2016
2017
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002018/* Create a new, uninitialized socket object. */
2019
2020static PyObject *
2021PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2022{
2023 PyObject *new;
2024
2025 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002026 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002027 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002028 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002029 ((PySocketSockObject *)new)->errorhandler = &PySocket_Err;
2030 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002031 return new;
2032}
2033
2034
2035/* Initialize a new socket object. */
2036
2037/*ARGSUSED*/
2038static int
2039PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
2040{
2041 PySocketSockObject *s = (PySocketSockObject *)self;
2042 SOCKET_T fd;
2043 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2044 static char *keywords[] = {"family", "type", "proto", 0};
2045
2046 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2047 "|iii:socket", keywords,
2048 &family, &type, &proto))
2049 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002050
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002051 Py_BEGIN_ALLOW_THREADS
2052 fd = socket(family, type, proto);
2053 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002054
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002055#ifdef MS_WINDOWS
2056 if (fd == INVALID_SOCKET)
2057#else
2058 if (fd < 0)
2059#endif
2060 {
2061 PySocket_Err();
2062 return -1;
2063 }
2064 init_sockobject(s, fd, family, type, proto);
2065 /* From now on, ignore SIGPIPE and let the error checking
2066 do the work. */
2067#ifdef SIGPIPE
2068 (void) signal(SIGPIPE, SIG_IGN);
2069#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002070
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002071 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002072
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002073}
2074
2075
Guido van Rossumb6775db1994-08-01 11:34:53 +00002076/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002077
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002078static char socket_doc[] =
2079"socket([family[, type[, proto]]]) -> socket object\n\
2080\n\
2081Open a socket of the given type. The family argument specifies the\n\
2082address family; it defaults to AF_INET. The type argument specifies\n\
2083whether this is a stream (SOCK_STREAM, this is the default)\n\
2084or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2085specifying the default protocol.\n\
2086\n\
2087A socket represents one endpoint of a network connection.\n\
2088\n\
2089Methods:\n\
2090\n\
2091accept() -- accept a connection, returning new socket and client address\n\
2092bind() -- bind the socket to a local address\n\
2093close() -- close the socket\n\
2094connect() -- connect the socket to a remote address\n\
2095connect_ex() -- connect, return an error code instead of an exception \n\
2096dup() -- return a new socket object identical to the current one (*)\n\
2097fileno() -- return underlying file descriptor\n\
2098getpeername() -- return remote address (*)\n\
2099getsockname() -- return local address\n\
2100getsockopt() -- get socket options\n\
2101listen() -- start listening for incoming connections\n\
Andrew M. Kuchling3072ecd2001-11-28 04:28:31 +00002102makefile() -- return a file object corresponding to the socket (*)\n\
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002103recv() -- receive data\n\
2104recvfrom() -- receive data and sender's address\n\
2105send() -- send data, may not send all of it\n\
2106sendall() -- send all data\n\
2107sendto() -- send data to a given address\n\
2108setblocking() -- set or clear the blocking I/O flag\n\
2109setsockopt() -- set socket options\n\
2110shutdown() -- shut down traffic in one or both directions\n\
2111\n\
2112(*) not available on all platforms!)";
2113
Guido van Rossum73624e91994-10-10 17:59:00 +00002114static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002115 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002116 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002117 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002118 sizeof(PySocketSockObject), /* tp_basicsize */
2119 0, /* tp_itemsize */
2120 (destructor)PySocketSock_dealloc, /* tp_dealloc */
2121 0, /* tp_print */
2122 0, /* tp_getattr */
2123 0, /* tp_setattr */
2124 0, /* tp_compare */
2125 (reprfunc)PySocketSock_repr, /* tp_repr */
2126 0, /* tp_as_number */
2127 0, /* tp_as_sequence */
2128 0, /* tp_as_mapping */
2129 0, /* tp_hash */
2130 0, /* tp_call */
2131 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002132 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002133 0, /* tp_setattro */
2134 0, /* tp_as_buffer */
2135 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2136 socket_doc, /* tp_doc */
2137 0, /* tp_traverse */
2138 0, /* tp_clear */
2139 0, /* tp_richcompare */
2140 0, /* tp_weaklistoffset */
2141 0, /* tp_iter */
2142 0, /* tp_iternext */
2143 PySocketSock_methods, /* tp_methods */
2144 0, /* tp_members */
2145 0, /* tp_getset */
2146 0, /* tp_base */
2147 0, /* tp_dict */
2148 0, /* tp_descr_get */
2149 0, /* tp_descr_set */
2150 0, /* tp_dictoffset */
2151 PySocketSock_init, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002152 0, /* set below */ /* tp_alloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002153 PySocketSock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002154 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002155};
2156
Guido van Rossum30a685f1991-06-27 15:51:29 +00002157
Guido van Rossum81194471991-07-27 21:42:02 +00002158/* Python interface to gethostname(). */
2159
2160/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002161static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002162PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002163{
2164 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002165 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002166 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002167 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002168 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002169 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002170 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002171 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002172 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00002173 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002174 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002175}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002176
Guido van Rossum82a5c661998-07-07 20:45:43 +00002177static char gethostname_doc[] =
2178"gethostname() -> string\n\
2179\n\
2180Return the current host name.";
2181
Guido van Rossumff4949e1992-08-05 19:58:53 +00002182
Guido van Rossum30a685f1991-06-27 15:51:29 +00002183/* Python interface to gethostbyname(name). */
2184
2185/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002186static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002187PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002188{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002189 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002190 struct sockaddr_storage addrbuf;
2191
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002192 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002193 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002194 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002195 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002196 return makeipaddr((struct sockaddr *)&addrbuf,
2197 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002198}
2199
Guido van Rossum82a5c661998-07-07 20:45:43 +00002200static char gethostbyname_doc[] =
2201"gethostbyname(host) -> address\n\
2202\n\
2203Return the IP address (a string of the form '255.255.255.255') for a host.";
2204
2205
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002206/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2207
2208static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002209gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002210{
2211 char **pch;
2212 PyObject *rtn_tuple = (PyObject *)NULL;
2213 PyObject *name_list = (PyObject *)NULL;
2214 PyObject *addr_list = (PyObject *)NULL;
2215 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002216
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002217 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002218 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002219#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002220 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002221#else
2222 PyErr_SetString(PySocket_Error, "host not found");
2223#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002224 return NULL;
2225 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002226
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002227 if (h->h_addrtype != af) {
2228#ifdef HAVE_STRERROR
2229 /* Let's get real error message to return */
2230 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002231#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002232 PyErr_SetString(PySocket_Error,
2233 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002234#endif
2235 return NULL;
2236 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002237
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002238 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002239
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002240 case AF_INET:
2241 if (alen < sizeof(struct sockaddr_in))
2242 return NULL;
2243 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002244
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002245#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002246 case AF_INET6:
2247 if (alen < sizeof(struct sockaddr_in6))
2248 return NULL;
2249 break;
2250#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002251
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002252 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002253
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002254 if ((name_list = PyList_New(0)) == NULL)
2255 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002256
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002257 if ((addr_list = PyList_New(0)) == NULL)
2258 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002259
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002260 for (pch = h->h_aliases; *pch != NULL; pch++) {
2261 int status;
2262 tmp = PyString_FromString(*pch);
2263 if (tmp == NULL)
2264 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002265
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002266 status = PyList_Append(name_list, tmp);
2267 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002268
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002269 if (status)
2270 goto err;
2271 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002272
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002273 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2274 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002275
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002276 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002277
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002278 case AF_INET:
2279 {
2280 struct sockaddr_in sin;
2281 memset(&sin, 0, sizeof(sin));
2282 sin.sin_family = af;
2283#ifdef HAVE_SOCKADDR_SA_LEN
2284 sin.sin_len = sizeof(sin);
2285#endif
2286 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2287 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002288
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002289 if (pch == h->h_addr_list && alen >= sizeof(sin))
2290 memcpy((char *) addr, &sin, sizeof(sin));
2291 break;
2292 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002293
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002294#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002295 case AF_INET6:
2296 {
2297 struct sockaddr_in6 sin6;
2298 memset(&sin6, 0, sizeof(sin6));
2299 sin6.sin6_family = af;
2300#ifdef HAVE_SOCKADDR_SA_LEN
2301 sin6.sin6_len = sizeof(sin6);
2302#endif
2303 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2304 tmp = makeipaddr((struct sockaddr *)&sin6,
2305 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002306
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002307 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2308 memcpy((char *) addr, &sin6, sizeof(sin6));
2309 break;
2310 }
2311#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002312
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002313 default: /* can't happen */
2314 PyErr_SetString(PySocket_Error,
2315 "unsupported address family");
2316 return NULL;
2317 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002318
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002319 if (tmp == NULL)
2320 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002321
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002322 status = PyList_Append(addr_list, tmp);
2323 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002324
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002325 if (status)
2326 goto err;
2327 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002328
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002329 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002330
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002331 err:
2332 Py_XDECREF(name_list);
2333 Py_XDECREF(addr_list);
2334 return rtn_tuple;
2335}
2336
2337
2338/* Python interface to gethostbyname_ex(name). */
2339
2340/*ARGSUSED*/
2341static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002342PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002343{
2344 char *name;
2345 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002346 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002347 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002348 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002349#ifdef HAVE_GETHOSTBYNAME_R
2350 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002351#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2352 struct hostent_data data;
2353#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002354 char buf[16384];
2355 int buf_len = (sizeof buf) - 1;
2356 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002357#endif
2358#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002359 int result;
2360#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002361#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002362
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002363 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002364 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002365 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002366 return NULL;
2367 Py_BEGIN_ALLOW_THREADS
2368#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002369#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002370 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002371#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002372 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002373#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002374 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002375 result = gethostbyname_r(name, &hp_allocated, &data);
2376 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002377#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002378#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002379#ifdef USE_GETHOSTBYNAME_LOCK
2380 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002381#endif
2382 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002383#endif /* HAVE_GETHOSTBYNAME_R */
2384 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002385 /* Some C libraries would require addr.__ss_family instead of
2386 * addr.ss_family.
2387 * Therefore, we cast the sockaddr_storage into sockaddr to
2388 * access sa_family.
2389 */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002390 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002391 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
2392 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002393#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002394 PyThread_release_lock(gethostbyname_lock);
2395#endif
2396 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002397}
2398
2399static char ghbn_ex_doc[] =
2400"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2401\n\
2402Return the true host name, a list of aliases, and a list of IP addresses,\n\
2403for a host. The host argument is a string giving a host name or IP number.";
2404
2405
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002406/* Python interface to gethostbyaddr(IP). */
2407
2408/*ARGSUSED*/
2409static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002410PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002411{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002412#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002413 struct sockaddr_storage addr;
2414#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002415 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002416#endif
2417 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002418 char *ip_num;
2419 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002420 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002421#ifdef HAVE_GETHOSTBYNAME_R
2422 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002423#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2424 struct hostent_data data;
2425#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002426 char buf[16384];
2427 int buf_len = (sizeof buf) - 1;
2428 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002429#endif
2430#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002431 int result;
2432#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002433#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002434 char *ap;
2435 int al;
2436 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002437
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002438 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002439 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002440 af = PF_UNSPEC;
2441 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002442 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002443 af = sa->sa_family;
2444 ap = NULL;
2445 al = 0;
2446 switch (af) {
2447 case AF_INET:
2448 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2449 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2450 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002451#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002452 case AF_INET6:
2453 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2454 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2455 break;
2456#endif
2457 default:
2458 PyErr_SetString(PySocket_Error, "unsupported address family");
2459 return NULL;
2460 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002461 Py_BEGIN_ALLOW_THREADS
2462#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002463#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002464 result = gethostbyaddr_r(ap, al, af,
2465 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002466 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002467#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002468 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002469 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002470#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002471 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002472 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002473 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002474#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002475#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002476#ifdef USE_GETHOSTBYNAME_LOCK
2477 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002478#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002479 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002480#endif /* HAVE_GETHOSTBYNAME_R */
2481 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002482 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002483#ifdef USE_GETHOSTBYNAME_LOCK
2484 PyThread_release_lock(gethostbyname_lock);
2485#endif
2486 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002487}
2488
Guido van Rossum82a5c661998-07-07 20:45:43 +00002489static char gethostbyaddr_doc[] =
2490"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2491\n\
2492Return the true host name, a list of aliases, and a list of IP addresses,\n\
2493for a host. The host argument is a string giving a host name or IP number.";
2494
Guido van Rossum30a685f1991-06-27 15:51:29 +00002495
2496/* Python interface to getservbyname(name).
2497 This only returns the port number, since the other info is already
2498 known or not useful (like the list of aliases). */
2499
2500/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002501static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002502PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002503{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002504 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002505 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002506 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002507 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002508 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002509 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002510 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002511 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002512 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002513 return NULL;
2514 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002515 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002516}
2517
Guido van Rossum82a5c661998-07-07 20:45:43 +00002518static char getservbyname_doc[] =
2519"getservbyname(servicename, protocolname) -> integer\n\
2520\n\
2521Return a port number from a service name and protocol name.\n\
2522The protocol name should be 'tcp' or 'udp'.";
2523
Guido van Rossum30a685f1991-06-27 15:51:29 +00002524
Guido van Rossum3901d851996-12-19 16:35:04 +00002525/* Python interface to getprotobyname(name).
2526 This only returns the protocol number, since the other info is
2527 already known or not useful (like the list of aliases). */
2528
2529/*ARGSUSED*/
2530static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002531PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002532{
2533 char *name;
2534 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002535#ifdef __BEOS__
2536/* Not available in BeOS yet. - [cjh] */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002537 PyErr_SetString(PySocket_Error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002538 return NULL;
2539#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002540 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002541 return NULL;
2542 Py_BEGIN_ALLOW_THREADS
2543 sp = getprotobyname(name);
2544 Py_END_ALLOW_THREADS
2545 if (sp == NULL) {
2546 PyErr_SetString(PySocket_Error, "protocol not found");
2547 return NULL;
2548 }
2549 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002550#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002551}
2552
Guido van Rossum82a5c661998-07-07 20:45:43 +00002553static char getprotobyname_doc[] =
2554"getprotobyname(name) -> integer\n\
2555\n\
2556Return the protocol number for the named protocol. (Rarely used.)";
2557
Guido van Rossum3901d851996-12-19 16:35:04 +00002558
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002559#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002560/* Create a socket object from a numeric file description.
2561 Useful e.g. if stdin is a socket.
2562 Additional arguments as for socket(). */
2563
2564/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002565static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002566PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002567{
Guido van Rossum73624e91994-10-10 17:59:00 +00002568 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002569 SOCKET_T fd;
2570 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002571 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2572 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002573 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002574 /* Dup the fd so it and the socket can be closed independently */
2575 fd = dup(fd);
2576 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002577 return PySocket_Err();
2578 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002579 /* From now on, ignore SIGPIPE and let the error checking
2580 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002581#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002582 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002583#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002584 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002585}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002586
2587static char fromfd_doc[] =
2588"fromfd(fd, family, type[, proto]) -> socket object\n\
2589\n\
2590Create a socket object from the given file descriptor.\n\
2591The remaining arguments are the same as for socket().";
2592
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002593#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002594
Guido van Rossum82a5c661998-07-07 20:45:43 +00002595
Guido van Rossum006bf911996-06-12 04:04:55 +00002596static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002597PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002598{
2599 int x1, x2;
2600
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002601 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002602 return NULL;
2603 }
2604 x2 = (int)ntohs((short)x1);
2605 return PyInt_FromLong(x2);
2606}
2607
Guido van Rossum82a5c661998-07-07 20:45:43 +00002608static char ntohs_doc[] =
2609"ntohs(integer) -> integer\n\
2610\n\
2611Convert a 16-bit integer from network to host byte order.";
2612
2613
Guido van Rossum006bf911996-06-12 04:04:55 +00002614static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002615PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002616{
2617 int x1, x2;
2618
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002619 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002620 return NULL;
2621 }
2622 x2 = ntohl(x1);
2623 return PyInt_FromLong(x2);
2624}
2625
Guido van Rossum82a5c661998-07-07 20:45:43 +00002626static char ntohl_doc[] =
2627"ntohl(integer) -> integer\n\
2628\n\
2629Convert a 32-bit integer from network to host byte order.";
2630
2631
Guido van Rossum006bf911996-06-12 04:04:55 +00002632static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002633PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002634{
2635 int x1, x2;
2636
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002637 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002638 return NULL;
2639 }
2640 x2 = (int)htons((short)x1);
2641 return PyInt_FromLong(x2);
2642}
2643
Guido van Rossum82a5c661998-07-07 20:45:43 +00002644static char htons_doc[] =
2645"htons(integer) -> integer\n\
2646\n\
2647Convert a 16-bit integer from host to network byte order.";
2648
2649
Guido van Rossum006bf911996-06-12 04:04:55 +00002650static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002651PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002652{
2653 int x1, x2;
2654
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002655 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002656 return NULL;
2657 }
2658 x2 = htonl(x1);
2659 return PyInt_FromLong(x2);
2660}
2661
Guido van Rossum82a5c661998-07-07 20:45:43 +00002662static char htonl_doc[] =
2663"htonl(integer) -> integer\n\
2664\n\
2665Convert a 32-bit integer from host to network byte order.";
2666
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002667/*
2668 * socket.inet_aton() and socket.inet_ntoa() functions
2669 *
2670 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2671 *
2672 */
2673
Guido van Rossum48a680c2001-03-02 06:34:14 +00002674static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002675"inet_aton(string) -> packed 32-bit IP representation\n\
2676\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002677Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002678binary format used in low-level network functions.";
2679
2680static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002681PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002682{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002683#ifndef INADDR_NONE
2684#define INADDR_NONE (-1)
2685#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002686
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002687 /* Have to use inet_addr() instead */
2688 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002689 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002690
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002691 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002692 return NULL;
2693 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002694 packed_addr = inet_addr(ip_addr);
2695
2696 if (packed_addr == INADDR_NONE) { /* invalid address */
2697 PyErr_SetString(PySocket_Error,
2698 "illegal IP address string passed to inet_aton");
2699 return NULL;
2700 }
2701
2702 return PyString_FromStringAndSize((char *) &packed_addr,
2703 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002704}
2705
Guido van Rossum48a680c2001-03-02 06:34:14 +00002706static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002707"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002708\n\
2709Convert an IP address from 32-bit packed binary format to string format";
2710
2711static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002712PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002713{
2714 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002715 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002716 struct in_addr packed_addr;
2717
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002718 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002719 return NULL;
2720 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002721
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002722 if (addr_len != sizeof(packed_addr)) {
2723 PyErr_SetString(PySocket_Error,
2724 "packed IP wrong length for inet_ntoa");
2725 return NULL;
2726 }
2727
2728 memcpy(&packed_addr, packed_str, addr_len);
2729
2730 return PyString_FromString(inet_ntoa(packed_addr));
2731}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002732
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002733/* Python interface to getaddrinfo(host, port). */
2734
2735/*ARGSUSED*/
2736static PyObject *
2737PySocket_getaddrinfo(PyObject *self, PyObject *args)
2738{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002739 struct addrinfo hints, *res;
2740 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002741 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002742 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002743 char *hptr, *pptr;
2744 int family, socktype, protocol, flags;
2745 int error;
2746 PyObject *all = (PyObject *)NULL;
2747 PyObject *single = (PyObject *)NULL;
2748
2749 family = socktype = protocol = flags = 0;
2750 family = PF_UNSPEC;
2751 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2752 &hptr, &pobj, &family, &socktype,
2753 &protocol, &flags)) {
2754 return NULL;
2755 }
2756 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002757 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002758 pptr = pbuf;
2759 } else if (PyString_Check(pobj)) {
2760 pptr = PyString_AsString(pobj);
2761 } else if (pobj == Py_None) {
2762 pptr = (char *)NULL;
2763 } else {
2764 PyErr_SetString(PySocket_Error, "Int or String expected");
2765 return NULL;
2766 }
2767 memset(&hints, 0, sizeof(hints));
2768 hints.ai_family = family;
2769 hints.ai_socktype = socktype;
2770 hints.ai_protocol = protocol;
2771 hints.ai_flags = flags;
2772 error = getaddrinfo(hptr, pptr, &hints, &res0);
2773 if (error) {
2774 PyGAI_Err(error);
2775 return NULL;
2776 }
2777
2778 if ((all = PyList_New(0)) == NULL)
2779 goto err;
2780 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002781 PyObject *addr =
2782 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2783 if (addr == NULL)
2784 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002785 single = Py_BuildValue("iiisO", res->ai_family,
2786 res->ai_socktype, res->ai_protocol,
2787 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002788 addr);
2789 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002790 if (single == NULL)
2791 goto err;
2792
2793 if (PyList_Append(all, single))
2794 goto err;
2795 Py_XDECREF(single);
2796 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002797 return all;
2798 err:
2799 Py_XDECREF(single);
2800 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002801 if (res0)
2802 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002803 return (PyObject *)NULL;
2804}
2805
2806static char getaddrinfo_doc[] =
2807"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2808 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2809\n\
2810Resolve host and port into addrinfo struct.";
2811
2812/* Python interface to getnameinfo(sa, flags). */
2813
2814/*ARGSUSED*/
2815static PyObject *
2816PySocket_getnameinfo(PyObject *self, PyObject *args)
2817{
2818 PyObject *sa = (PyObject *)NULL;
2819 int flags;
2820 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002821 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002822 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2823 struct addrinfo hints, *res = NULL;
2824 int error;
2825 PyObject *ret = (PyObject *)NULL;
2826
2827 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002828 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002829 return NULL;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002830 if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id))
2831 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002832 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002833 memset(&hints, 0, sizeof(hints));
2834 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002835 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002836 error = getaddrinfo(hostp, pbuf, &hints, &res);
2837 if (error) {
2838 PyGAI_Err(error);
2839 goto fail;
2840 }
2841 if (res->ai_next) {
2842 PyErr_SetString(PySocket_Error,
2843 "sockaddr resolved to multiple addresses");
2844 goto fail;
2845 }
2846 switch (res->ai_family) {
2847 case AF_INET:
2848 {
2849 char *t1;
2850 int t2;
2851 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2852 PyErr_SetString(PySocket_Error,
2853 "IPv4 sockaddr must be 2 tuple");
2854 goto fail;
2855 }
2856 break;
2857 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002858#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002859 case AF_INET6:
2860 {
2861 struct sockaddr_in6 *sin6;
2862 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2863 sin6->sin6_flowinfo = flowinfo;
2864 sin6->sin6_scope_id = scope_id;
2865 break;
2866 }
2867#endif
2868 }
2869 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2870 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2871 if (error) {
2872 PyGAI_Err(error);
2873 goto fail;
2874 }
2875 ret = Py_BuildValue("ss", hbuf, pbuf);
2876
2877fail:
2878 if (res)
2879 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002880 return ret;
2881}
2882
2883static char getnameinfo_doc[] =
2884"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2885\n\
2886Get host and port for a sockaddr.";
2887
Guido van Rossum30a685f1991-06-27 15:51:29 +00002888/* List of functions exported by this module. */
2889
Guido van Rossum73624e91994-10-10 17:59:00 +00002890static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002891 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002892 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002893 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002894 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002895 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002896 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002897 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002898 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002899 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002900 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002901 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002902 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002903#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002904 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002905 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002906#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002907 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002908 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002909 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002910 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002911 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002912 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002913 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002914 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002915 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002916 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002917 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002918 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002919 {"getaddrinfo", PySocket_getaddrinfo,
2920 METH_VARARGS, getaddrinfo_doc},
2921 {"getnameinfo", PySocket_getnameinfo,
2922 METH_VARARGS, getnameinfo_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002923 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002924};
2925
Guido van Rossum30a685f1991-06-27 15:51:29 +00002926
Guido van Rossum8d665e61996-06-26 18:22:49 +00002927#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002928
2929/* Additional initialization and cleanup for NT/Windows */
2930
2931static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002932NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002933{
2934 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002935}
2936
2937static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002938NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002939{
2940 WSADATA WSAData;
2941 int ret;
2942 char buf[100];
2943 ret = WSAStartup(0x0101, &WSAData);
2944 switch (ret) {
2945 case 0: /* no error */
2946 atexit(NTcleanup);
2947 return 1;
2948 case WSASYSNOTREADY:
2949 PyErr_SetString(PyExc_ImportError,
2950 "WSAStartup failed: network not ready");
2951 break;
2952 case WSAVERNOTSUPPORTED:
2953 case WSAEINVAL:
2954 PyErr_SetString(PyExc_ImportError,
2955 "WSAStartup failed: requested version not supported");
2956 break;
2957 default:
Tim Peters885d4572001-11-28 20:27:42 +00002958 PyOS_snprintf(buf, sizeof(buf),
2959 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002960 PyErr_SetString(PyExc_ImportError, buf);
2961 break;
2962 }
2963 return 0;
2964}
2965
Guido van Rossum8d665e61996-06-26 18:22:49 +00002966#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002967
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002968#if defined(PYOS_OS2)
2969
2970/* Additional initialization and cleanup for OS/2 */
2971
2972static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002973OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002974{
2975 /* No cleanup is necessary for OS/2 Sockets */
2976}
2977
2978static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002979OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002980{
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002981#if !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002982 char reason[64];
2983 int rc = sock_init();
2984
2985 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002986 atexit(OS2cleanup);
2987 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002988 }
2989
Tim Peters75cdad52001-11-28 22:07:30 +00002990 PyOS_snprintf(reason, sizeof(reason),
2991 "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002992 PyErr_SetString(PyExc_ImportError, reason);
2993
Guido van Rossum32c575d1997-12-02 20:37:32 +00002994 return 0; /* Indicate Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002995#else
2996 /* no need to initialise sockets with GCC/EMX */
2997 return 1;
2998#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002999}
3000
3001#endif /* PYOS_OS2 */
3002
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003003/* C API table - always add new things to the end for binary
3004 compatibility. */
3005static
3006PySocketModule_APIObject PySocketModuleAPI =
3007{
3008 &PySocketSock_Type,
3009};
3010
Guido van Rossum30a685f1991-06-27 15:51:29 +00003011/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003012 * This is called when the first 'import socket' is done,
3013 * via a table in config.c, if config.c is compiled with USE_SOCKET
3014 * defined.
3015 *
3016 * For MS_WINDOWS (which means any Windows variant), this module
3017 * is actually called "_socket", and there's a wrapper "socket.py"
3018 * which implements some missing functionality (such as makefile(),
3019 * dup() and fromfd()). The import of "_socket" may fail with an
3020 * ImportError exception if initialization of WINSOCK fails. When
3021 * WINSOCK is initialized succesfully, a call to WSACleanup() is
3022 * scheduled to be made at exit time.
3023 *
3024 * For OS/2, this module is also called "_socket" and uses a wrapper
3025 * "socket.py" which implements that functionality that is missing
3026 * when PC operating systems don't put socket descriptors in the
3027 * operating system's filesystem layer.
3028 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003029
Guido van Rossum82a5c661998-07-07 20:45:43 +00003030static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00003031"Implementation module for socket operations. See the socket module\n\
3032for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00003033
Guido van Rossum3886bb61998-12-04 18:50:17 +00003034DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003035init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003036{
Fred Drake4baedc12002-04-01 14:53:37 +00003037 PyObject *m;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003038#ifdef RISCOS
3039 _kernel_swi_regs r;
3040 r.r[0]=0;
3041 _kernel_swi(0x43380, &r, &r);
3042 taskwindow = r.r[0];
3043#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003044#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003045 if (!NTinit())
3046 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003047#else
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003048#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003049 if (!OS2init())
3050 return;
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003051#endif /* PYOS_OS2 */
Fred Drakea136d492000-08-16 14:18:30 +00003052#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003053#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003054 PySocketSock_Type.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00003055 PySocketSock_Type.tp_getattro = PyObject_GenericGetAttr;
3056 PySocketSock_Type.tp_alloc = PyType_GenericAlloc;
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00003057 PySocketSock_Type.tp_free = PyObject_Del;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003058 m = Py_InitModule3(PySocket_MODULE_NAME,
3059 PySocket_methods,
3060 module_doc);
Fred Drake4baedc12002-04-01 14:53:37 +00003061
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003062 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3063 if (PySocket_Error == NULL)
3064 return;
Fred Drake4baedc12002-04-01 14:53:37 +00003065 Py_INCREF(PySocket_Error);
3066 PyModule_AddObject(m, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003067 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3068 if (PyH_Error == NULL)
3069 return;
Fred Drake4baedc12002-04-01 14:53:37 +00003070 Py_INCREF(PyH_Error);
3071 PyModule_AddObject(m, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003072 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3073 NULL);
3074 if (PyGAI_Error == NULL)
3075 return;
Fred Drake4baedc12002-04-01 14:53:37 +00003076 Py_INCREF(PyGAI_Error);
3077 PyModule_AddObject(m, "gaierror", PyGAI_Error);
3078 Py_INCREF((PyObject *)&PySocketSock_Type);
3079 if (PyModule_AddObject(m, "SocketType",
3080 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003081 return;
Fred Drake4baedc12002-04-01 14:53:37 +00003082 Py_INCREF((PyObject *)&PySocketSock_Type);
3083 if (PyModule_AddObject(m, "socket",
3084 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003085 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003086
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003087 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003088 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003089 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3090 ) != 0)
3091 return;
3092
Guido van Rossum09be4091999-08-09 14:40:40 +00003093 /* Address families (we only support AF_INET and AF_UNIX) */
3094#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003095 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003096#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003097 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003098#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003099 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003100#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003101#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00003102 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003103#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003104#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003105 /* Amateur Radio AX.25 */
3106 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003107#endif
3108#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003109 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003110#endif
3111#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003112 /* Appletalk DDP */
3113 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003114#endif
3115#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003116 /* Amateur radio NetROM */
3117 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003118#endif
3119#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003120 /* Multiprotocol bridge */
3121 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003122#endif
3123#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003124 /* Reserved for Werner's ATM */
3125 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003126#endif
3127#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003128 /* Reserved for X.25 project */
3129 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003130#endif
3131#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003132 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003133#endif
3134#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003135 /* Amateur Radio X.25 PLP */
3136 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003137#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003138#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003139 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3140 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3141 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3142 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3143 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3144 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3145 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3146 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3147 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003148#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003149
3150 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003151 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3152 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003153#ifndef __BEOS__
3154/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003155 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3156 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3157 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003158#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003159
3160#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003161 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003162#endif
3163#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003164 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003165#endif
3166#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003167 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003168#endif
3169#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003170 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003171#endif
3172#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003173 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003174#endif
3175#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003176 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003177#endif
3178#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003179 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003180#endif
3181#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003182 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003183#endif
3184#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003185 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003186#endif
3187#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003188 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003189#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003190#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003191 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003192#endif
3193#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003194 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003195#endif
3196#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003197 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003198#endif
3199#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003200 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003201#endif
3202#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003203 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003204#endif
3205#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003206 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003207#endif
3208#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003209 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003210#endif
3211#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003212 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003213#endif
3214
3215 /* Maximum number of connections for "listen" */
3216#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003217 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003218#else
Fred Drake4baedc12002-04-01 14:53:37 +00003219 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003220#endif
3221
3222 /* Flags for send, recv */
3223#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003224 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003225#endif
3226#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003227 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003228#endif
3229#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003230 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003231#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003232#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003233 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003234#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003235#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003236 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003237#endif
3238#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003239 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003240#endif
3241#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003242 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003243#endif
3244#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003245 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003246#endif
3247#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003248 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003249#endif
3250#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003251 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003252#endif
3253
3254 /* Protocol level and numbers, usable for [gs]etsockopt */
3255#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003256 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003257#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003258#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003259 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003260#else
Fred Drake4baedc12002-04-01 14:53:37 +00003261 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003262#endif
3263#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003264 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003265#endif
3266#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003267 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003268#endif
3269#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003270 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003271#endif
3272#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003273 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003274#endif
3275#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003276 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003277#endif
3278#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003279 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003280#else
Fred Drake4baedc12002-04-01 14:53:37 +00003281 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003282#endif
3283#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003284 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003285#else
Fred Drake4baedc12002-04-01 14:53:37 +00003286 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003287#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003288#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003289 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003290#else
Fred Drake4baedc12002-04-01 14:53:37 +00003291 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003292#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003293#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003294 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003295#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003296#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003297 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003298#else
Fred Drake4baedc12002-04-01 14:53:37 +00003299 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003300#endif
3301#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003302 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003303#endif
3304#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003305 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003306#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003307#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003308 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003309#endif
3310#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003311 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003312#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003313#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003314 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003315#else
Fred Drake4baedc12002-04-01 14:53:37 +00003316 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003317#endif
3318#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003319 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003320#endif
3321#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003322 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003323#endif
3324#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003325 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003326#else
Fred Drake4baedc12002-04-01 14:53:37 +00003327 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003328#endif
3329#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003330 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003331#endif
3332#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003333 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003334#endif
3335#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003336 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003337#endif
3338#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003339 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003340#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003341#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003342 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003343#endif
3344#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003345 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003346#endif
3347#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003348 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003349#endif
3350#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003351 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003352#endif
3353#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003354 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003355#endif
3356#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003357 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003358#endif
3359#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003360 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003361#endif
3362#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003363 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003364#endif
3365#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003366 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003367#endif
3368#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003369 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003370#endif
3371#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003372 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003373#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003374#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003375 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003376#endif
3377#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003378 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003379#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003380#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003381 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003382#endif
3383#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003384 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003385#endif
3386#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003387 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003388#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003389#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003390 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003391#endif
3392/**/
3393#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003394 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003395#else
Fred Drake4baedc12002-04-01 14:53:37 +00003396 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003397#endif
3398#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003399 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003400#endif
3401
3402 /* Some port configuration */
3403#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003404 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003405#else
Fred Drake4baedc12002-04-01 14:53:37 +00003406 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003407#endif
3408#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003409 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003410#else
Fred Drake4baedc12002-04-01 14:53:37 +00003411 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003412#endif
3413
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003414 /* Some reserved IP v.4 addresses */
3415#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003416 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003417#else
Fred Drake4baedc12002-04-01 14:53:37 +00003418 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003419#endif
3420#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003421 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003422#else
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003424#endif
3425#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003426 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003427#else
Fred Drake4baedc12002-04-01 14:53:37 +00003428 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003429#endif
3430#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003431 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003432#else
Fred Drake4baedc12002-04-01 14:53:37 +00003433 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003434#endif
3435#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003436 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3437 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003438#else
Fred Drake4baedc12002-04-01 14:53:37 +00003439 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003440#endif
3441#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003442 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3443 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003444#else
Fred Drake4baedc12002-04-01 14:53:37 +00003445 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003446#endif
3447#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003448 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003449#else
Fred Drake4baedc12002-04-01 14:53:37 +00003450 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003451#endif
3452
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003453 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003454#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003455 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003456#endif
3457#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003458 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003459#endif
3460#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003461 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003462#endif
3463#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003464 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003465#endif
3466#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003467 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003468#endif
3469#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003470 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003471#endif
3472#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003473 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003474#endif
3475#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003476 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003477#endif
3478#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003479 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003480#endif
3481#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003482 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003483#endif
3484#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003485 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003486#endif
3487#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003488 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003489#endif
3490#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003491 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003492#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003493#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003494 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3495 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003496#endif
3497#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003498 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3499 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003500#endif
3501#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003502 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003503#endif
3504
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003505 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3506#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003507 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003508#endif
3509#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003510 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003511#endif
3512#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003513 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003514#endif
3515#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003516 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003517#endif
3518#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003519 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003520#endif
3521#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003522 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003523#endif
3524
Guido van Rossum09be4091999-08-09 14:40:40 +00003525 /* TCP options */
3526#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003527 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003528#endif
3529#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003530 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003531#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003532#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003533 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003534#endif
3535#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003536 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003537#endif
3538#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003539 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003540#endif
3541#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003542 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003543#endif
3544#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003545 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003546#endif
3547#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003548 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003549#endif
3550#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003551 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003552#endif
3553#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003554 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003555#endif
3556#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003557 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003558#endif
3559#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003560 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003561#endif
3562
Guido van Rossum09be4091999-08-09 14:40:40 +00003563
3564 /* IPX options */
3565#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003566 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003567#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003568
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003569 /* get{addr,name}info parameters */
3570#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003571 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003572#endif
3573#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003574 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003575#endif
3576#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003577 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003578#endif
3579#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003580 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003581#endif
3582#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003583 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003584#endif
3585#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003586 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003587#endif
3588#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003589 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003590#endif
3591#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003592 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003593#endif
3594#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003595 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003596#endif
3597#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003598 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003599#endif
3600#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003601 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003602#endif
3603#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003604 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003605#endif
3606#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003607 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003608#endif
3609#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003610 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003611#endif
3612#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003613 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003614#endif
3615#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003616 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003617#endif
3618#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003619 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003620#endif
3621#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003622 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003623#endif
3624#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003625 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003626#endif
3627#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003628 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003629#endif
3630#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003631 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003632#endif
3633#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003634 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003635#endif
3636#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003637 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003638#endif
3639#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003640 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003641#endif
3642#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003643 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003644#endif
3645#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003646 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003647#endif
3648#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003649 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003650#endif
3651#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003652 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003653#endif
3654#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003655 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003656#endif
3657#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003658 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003659#endif
3660
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003661 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003662#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003663 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003664#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003665}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003666
3667/* Simplistic emulation code for inet_pton that only works for IPv4 */
3668#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003669int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003670inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003671{
3672 if(af == AF_INET){
3673 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003674 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003675 if (packed_addr == INADDR_NONE)
3676 return 0;
3677 memcpy(dst, &packed_addr, 4);
3678 return 1;
3679 }
3680 /* Should set errno to EAFNOSUPPORT */
3681 return -1;
3682}
3683
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003684const char *
3685inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003686{
3687 if (af == AF_INET) {
3688 struct in_addr packed_addr;
3689 if (size < 16)
3690 /* Should set errno to ENOSPC. */
3691 return NULL;
3692 memcpy(&packed_addr, src, sizeof(packed_addr));
3693 return strncpy(dst, inet_ntoa(packed_addr), size);
3694 }
3695 /* Should set errno to EAFNOSUPPORT */
3696 return NULL;
3697}
3698#endif