blob: 06d3f794f565ef660b630e2b22a715f1188f9422 [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
490 * functionality. If reading is: 1 poll as read, 0, poll as write.
491 * Return value: -1 if error, 0 if not ready, >= 1 if ready.
492 */
493static int
494internal_select(PySocketSockObject *s, int reading)
495{
496 fd_set fds;
497 struct timeval tv;
498 int count;
499
500 /* Construct the arguments to select */
501 tv.tv_sec = (int)s->sock_timeout;
502 tv.tv_usec = (int)(s->sock_timeout/1e6);
503 FD_ZERO(&fds);
504 FD_SET(s->sock_fd, &fds);
505
506 /* See if the socket is ready */
507 if (reading)
508 count = select(s->sock_fd, &fds, NULL, NULL, &tv);
509 else
510 count = select(s->sock_fd, NULL, &fds, NULL, &tv);
511
512 /* Check for errors */
513 if (count < 0) {
514 s->errorhandler();
515 return -1;
516 }
517
518 /* Set the error if the timeout has elapsed, i.e, we were not
519 * polled.
520 */
521 if (count == 0)
522 timeout_err();
523
524 return count;
525}
526
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000527/* Initialize a new socket object. */
528
529static void
530init_sockobject(PySocketSockObject *s,
531 SOCKET_T fd, int family, int type, int proto)
532{
533#ifdef RISCOS
534 int block = 1;
535#endif
536 s->sock_fd = fd;
537 s->sock_family = family;
538 s->sock_type = type;
539 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000540 s->sock_blocking = 1; /* Start in blocking mode */
541 s->sock_timeout = -1.0; /* Start without timeout */
542
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000543 s->errorhandler = &PySocket_Err;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000544#ifdef RISCOS
545 if(taskwindow) {
546 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
547 }
548#endif
549}
550
551
Guido van Rossum30a685f1991-06-27 15:51:29 +0000552/* Create a new socket object.
553 This just creates the object and initializes it.
554 If the creation fails, return NULL and set an exception (implicit
555 in NEWOBJ()). */
556
Guido van Rossum73624e91994-10-10 17:59:00 +0000557static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000558PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000559{
Guido van Rossum73624e91994-10-10 17:59:00 +0000560 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000561 s = (PySocketSockObject *)
562 PyType_GenericNew(&PySocketSock_Type, NULL, NULL);
563 if (s != NULL)
564 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565 return s;
566}
567
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568
Guido van Rossum48a680c2001-03-02 06:34:14 +0000569/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000570 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000571#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000572PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000573#endif
574
575
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576/* Convert a string specifying a host name or one of a few symbolic
577 names to a numeric IP address. This usually calls gethostbyname()
578 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000579 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000580 an error occurred; then an exception is raised. */
581
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000582static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000583setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000584{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000585 struct addrinfo hints, *res;
586 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000587
Guido van Rossuma376cc51996-12-05 23:43:35 +0000588 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000589 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000590 int siz;
591 memset(&hints, 0, sizeof(hints));
592 hints.ai_family = af;
593 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
594 hints.ai_flags = AI_PASSIVE;
595 error = getaddrinfo(NULL, "0", &hints, &res);
596 if (error) {
597 PyGAI_Err(error);
598 return -1;
599 }
600 switch (res->ai_family) {
601 case AF_INET:
602 siz = 4;
603 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000604#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000605 case AF_INET6:
606 siz = 16;
607 break;
608#endif
609 default:
610 freeaddrinfo(res);
611 PyErr_SetString(PySocket_Error,
612 "unsupported address family");
613 return -1;
614 }
615 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000616 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000617 PyErr_SetString(PySocket_Error,
618 "wildcard resolved to multiple address");
619 return -1;
620 }
621 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
622 freeaddrinfo(res);
623 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000625 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000626 struct sockaddr_in *sin;
627 if (af != PF_INET && af != PF_UNSPEC) {
628 PyErr_SetString(PySocket_Error,
629 "address family mismatched");
630 return -1;
631 }
632 sin = (struct sockaddr_in *)addr_ret;
633 memset((void *) sin, '\0', sizeof(*sin));
634 sin->sin_family = AF_INET;
635#ifdef HAVE_SOCKADDR_SA_LEN
636 sin->sin_len = sizeof(*sin);
637#endif
638 sin->sin_addr.s_addr = INADDR_BROADCAST;
639 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000640 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000641 memset(&hints, 0, sizeof(hints));
642 hints.ai_family = af;
643 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000644#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000645 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000646 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000647 fails if no address family is given. Assume IPv4 for now.*/
648 hints.ai_family = AF_INET;
649 error = getaddrinfo(name, NULL, &hints, &res);
650 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000651#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000652 if (error) {
653 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000654 return -1;
655 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000656 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
657 freeaddrinfo(res);
658 switch (addr_ret->sa_family) {
659 case AF_INET:
660 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000661#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000662 case AF_INET6:
663 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000664#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000665 default:
666 PyErr_SetString(PySocket_Error, "unknown address family");
667 return -1;
668 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669}
670
Guido van Rossum30a685f1991-06-27 15:51:29 +0000671
Guido van Rossum30a685f1991-06-27 15:51:29 +0000672/* Create a string object representing an IP address.
673 This is always a string of the form 'dd.dd.dd.dd' (with variable
674 size numbers). */
675
Guido van Rossum73624e91994-10-10 17:59:00 +0000676static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000677makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000678{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000679 char buf[NI_MAXHOST];
680 int error;
681
682 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
683 NI_NUMERICHOST);
684 if (error) {
685 PyGAI_Err(error);
686 return NULL;
687 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000688 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000689}
690
691
692/* Create an object representing the given socket address,
693 suitable for passing it back to bind(), connect() etc.
694 The family field of the sockaddr structure is inspected
695 to determine what kind of address it really is. */
696
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000697/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000698static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000699makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000700{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000701 if (addrlen == 0) {
702 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000703 Py_INCREF(Py_None);
704 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000705 }
706
Guido van Rossumbcc20741998-08-04 22:53:56 +0000707#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000708 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000709 addr->sa_family = AF_INET;
710#endif
711
Guido van Rossum30a685f1991-06-27 15:51:29 +0000712 switch (addr->sa_family) {
713
714 case AF_INET:
715 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000716 struct sockaddr_in *a;
717 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000718 PyObject *ret = NULL;
719 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000720 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000721 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
722 Py_DECREF(addrobj);
723 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000724 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000725 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000726
Guido van Rossumb6775db1994-08-01 11:34:53 +0000727#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000728 case AF_UNIX:
729 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000730 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000731 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000732 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000733#endif /* AF_UNIX */
734
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000735#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000736 case AF_INET6:
737 {
738 struct sockaddr_in6 *a;
739 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
740 PyObject *ret = NULL;
741 if (addrobj) {
742 a = (struct sockaddr_in6 *)addr;
743 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
744 a->sin6_flowinfo, a->sin6_scope_id);
745 Py_DECREF(addrobj);
746 }
747 return ret;
748 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000749#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000750
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000751#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000752 case AF_PACKET:
753 {
754 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
755 char *ifname = "";
756 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000757 /* need to look up interface name give index */
758 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000759 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000760 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000761 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000762 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000763 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000764 a->sll_pkttype, a->sll_hatype,
765 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000766 }
767#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000768
Guido van Rossum30a685f1991-06-27 15:51:29 +0000769 /* More cases here... */
770
771 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000772 /* If we don't know the address family, don't raise an
773 exception -- return it as a tuple. */
774 return Py_BuildValue("is#",
775 addr->sa_family,
776 addr->sa_data,
777 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000778
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780}
781
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782
783/* Parse a socket address argument according to the socket object's
784 address family. Return 1 if the address was in the proper format,
785 0 of not. The address is returned through addr_ret, its length
786 through len_ret. */
787
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000789getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000790 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000792 switch (s->sock_family) {
793
Guido van Rossumb6775db1994-08-01 11:34:53 +0000794#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000795 case AF_UNIX:
796 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000797 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000798 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000799 int len;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000800 addr = (struct sockaddr_un*)&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000801 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000803 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000804 PyErr_SetString(PySocket_Error,
805 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000806 return 0;
807 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000808 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000809 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000810 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000811 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000812 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813 return 1;
814 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000815#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000816
Guido van Rossum30a685f1991-06-27 15:51:29 +0000817 case AF_INET:
818 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000819 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000820 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000821 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000822 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000823 if (!PyTuple_Check(args)) {
824 PyErr_Format(PyExc_TypeError,
825 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
826 args->ob_type->tp_name);
827 return 0;
828 }
829 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000831 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000832 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000833 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000834 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000835 *addr_ret = (struct sockaddr *) addr;
836 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000837 return 1;
838 }
839
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000840#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000841 case AF_INET6:
842 {
843 struct sockaddr_in6* addr;
844 char *host;
845 int port, flowinfo, scope_id;
846 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
847 flowinfo = scope_id = 0;
848 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
849 &scope_id)) {
850 return 0;
851 }
852 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
853 return 0;
854 addr->sin6_family = s->sock_family;
855 addr->sin6_port = htons((short)port);
856 addr->sin6_flowinfo = flowinfo;
857 addr->sin6_scope_id = scope_id;
858 *addr_ret = (struct sockaddr *) addr;
859 *len_ret = sizeof *addr;
860 return 1;
861 }
862#endif
863
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000864#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000865 case AF_PACKET:
866 {
867 struct sockaddr_ll* addr;
868 struct ifreq ifr;
869 char *interfaceName;
870 int protoNumber;
871 int hatype = 0;
872 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000873 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000874
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000875 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
876 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000877 return 0;
878 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
879 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000880 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000881 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000882 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000883 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000884 addr = &(s->sock_addr.ll);
885 addr->sll_family = AF_PACKET;
886 addr->sll_protocol = htons((short)protoNumber);
887 addr->sll_ifindex = ifr.ifr_ifindex;
888 addr->sll_pkttype = pkttype;
889 addr->sll_hatype = hatype;
890 *addr_ret = (struct sockaddr *) addr;
891 *len_ret = sizeof *addr;
892 return 1;
893 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000894#endif
895
Guido van Rossum30a685f1991-06-27 15:51:29 +0000896 /* More cases here... */
897
898 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000899 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900 return 0;
901
902 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000903}
904
Guido van Rossum30a685f1991-06-27 15:51:29 +0000905
Guido van Rossum48a680c2001-03-02 06:34:14 +0000906/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000907 Return 1 if the family is known, 0 otherwise. The length is returned
908 through len_ret. */
909
910static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000911getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000912{
913 switch (s->sock_family) {
914
Guido van Rossumb6775db1994-08-01 11:34:53 +0000915#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000916 case AF_UNIX:
917 {
918 *len_ret = sizeof (struct sockaddr_un);
919 return 1;
920 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000921#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000922
923 case AF_INET:
924 {
925 *len_ret = sizeof (struct sockaddr_in);
926 return 1;
927 }
928
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000929#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000930 case AF_INET6:
931 {
932 *len_ret = sizeof (struct sockaddr_in6);
933 return 1;
934 }
935#endif
936
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000937#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000938 case AF_PACKET:
939 {
940 *len_ret = sizeof (struct sockaddr_ll);
941 return 1;
942 }
943#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000944
Guido van Rossum710e1df1992-06-12 10:39:36 +0000945 /* More cases here... */
946
947 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000948 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000949 return 0;
950
951 }
952}
953
954
Guido van Rossum30a685f1991-06-27 15:51:29 +0000955/* s.accept() method */
956
Guido van Rossum73624e91994-10-10 17:59:00 +0000957static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000958PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000959{
960 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000961 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000962 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000963 PyObject *sock = NULL;
964 PyObject *addr = NULL;
965 PyObject *res = NULL;
966
Guido van Rossum710e1df1992-06-12 10:39:36 +0000967 if (!getsockaddrlen(s, &addrlen))
968 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000969 memset(addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000970
971 errno = 0; /* Reset indicator for use with timeout behavior */
972
Guido van Rossum73624e91994-10-10 17:59:00 +0000973 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000974 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000975 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000976
977 if (s->sock_timeout >= 0.0) {
978#ifdef MS_WINDOWS
979 if (newfd == INVALID_SOCKET)
980 if (!s->sock_blocking)
981 return s->errorhandler();
982 /* Check if we have a true failure
983 for a blocking socket */
984 if (errno != WSAEWOULDBLOCK)
985 return s->errorhandler();
986#else
987 if (newfd < 0) {
988 if (!s->sock_blocking)
989 return s->errorhandler();
990 /* Check if we have a true failure
991 for a blocking socket */
992 if (errno != EAGAIN && errno != EWOULDBLOCK)
993 return s->errorhandler();
994 }
995#endif
996
997 /* try waiting the timeout period */
998 if (internal_select(s, 0) <= 0)
999 return NULL;
1000
1001 Py_BEGIN_ALLOW_THREADS
1002 newfd = accept(s->sock_fd,
1003 (struct sockaddr *)addrbuf,
1004 &addrlen);
1005 Py_END_ALLOW_THREADS
1006 }
1007
1008 /* At this point, we really have an error, whether using timeout
1009 * behavior or regular socket behavior
1010 */
Fred Drakea04eaad2000-06-30 02:46:07 +00001011#ifdef MS_WINDOWS
1012 if (newfd == INVALID_SOCKET)
1013#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001014 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +00001015#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001016 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00001017
Guido van Rossum30a685f1991-06-27 15:51:29 +00001018 /* Create the new object with unspecified family,
1019 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001021 s->sock_family,
1022 s->sock_type,
1023 s->sock_proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001024
Barry Warsaw752300b1997-01-03 17:18:10 +00001025 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001026 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +00001027 goto finally;
1028 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001029 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Guido van Rossum67f7a382002-06-06 21:08:16 +00001030 addrlen);
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001031 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +00001032 goto finally;
1033
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001034 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001035
Guido van Rossum67f7a382002-06-06 21:08:16 +00001036finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001037 Py_XDECREF(sock);
1038 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001039 return res;
1040}
1041
Guido van Rossum82a5c661998-07-07 20:45:43 +00001042static char accept_doc[] =
1043"accept() -> (socket object, address info)\n\
1044\n\
1045Wait for an incoming connection. Return a new socket representing the\n\
1046connection, and the address of the client. For IP sockets, the address\n\
1047info is a pair (hostaddr, port).";
1048
Guido van Rossume4485b01994-09-07 14:32:49 +00001049/* s.setblocking(1 | 0) method */
1050
Guido van Rossum73624e91994-10-10 17:59:00 +00001051static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001052PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00001053{
1054 int block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001055
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001056 block = PyInt_AsLong(arg);
1057 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +00001058 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001059
1060 s->sock_blocking = block;
1061
1062 /* If we're not using timeouts, actually set the blocking to give
1063 * old python behavior.
1064 */
1065 if (s->sock_timeout < 0.0)
1066 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00001067
Guido van Rossum73624e91994-10-10 17:59:00 +00001068 Py_INCREF(Py_None);
1069 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00001070}
Guido van Rossume4485b01994-09-07 14:32:49 +00001071
Guido van Rossum82a5c661998-07-07 20:45:43 +00001072static char setblocking_doc[] =
1073"setblocking(flag)\n\
1074\n\
1075Set the socket to blocking (flag is true) or non-blocking (false).\n\
1076This uses the FIONBIO ioctl with the O_NDELAY flag.";
1077
Guido van Rossum67f7a382002-06-06 21:08:16 +00001078/* s.settimeout (float | int | long) method.
1079 * Causes an exception to be raised when the integer number of seconds
1080 * has elapsed when performing a blocking socket operation.
1081 */
1082static PyObject *
1083PySocketSock_settimeout(PySocketSockObject *s, PyObject *arg)
1084{
1085 double value;
1086
1087 if (arg == Py_None)
1088 value = -1.0;
1089 else {
1090 value = PyFloat_AsDouble(arg);
1091 if (value < 0.0) {
1092 if (!PyErr_Occurred())
1093 PyErr_SetString(PyExc_ValueError,
1094 "Invalid timeout value");
1095 return NULL;
1096 }
1097 }
1098
1099 s->sock_timeout = value;
1100
1101 /* The semantics of setting socket timeouts are:
1102 * If you settimeout(!=None):
1103 * The actual socket gets put in non-blocking mode and the select
1104 * is used to control timeouts.
1105 * Else if you settimeout(None) [then value is -1.0]:
1106 * The old behavior is used AND automatically, the socket is set
1107 * to blocking mode. That means that someone who was doing
1108 * non-blocking stuff before, sets a timeout, and then unsets
1109 * one, will have to call setblocking(0) again if he wants
1110 * non-blocking stuff. This makes sense because timeout stuff is
1111 * blocking by nature.
1112 */
1113 if (value < 0.0)
1114 internal_setblocking(s, 0);
1115 else
1116 internal_setblocking(s, 1);
1117
1118 s->sock_blocking = 1; /* Always negate setblocking() */
1119
1120 Py_INCREF(Py_None);
1121 return Py_None;
1122}
1123
1124static char settimeout_doc[] =
1125"settimeout(seconds)\n\
1126\n\
1127Set a timeout on blocking socket operations. 'seconds' can be a floating,\n\
1128integer, or long number of seconds, or the None value. Socket operations\n\
1129will raise an exception if the timeout period has elapsed before the\n\
1130operation has completed. Setting a timeout of None disables timeouts\n\
1131on socket operations.";
1132
1133/* s.gettimeout () method.
1134 * Returns the timeout associated with a socket.
1135 */
1136static PyObject *
1137PySocketSock_gettimeout(PySocketSockObject *s)
1138{
1139 if (s->sock_timeout < 0.0) {
1140 Py_INCREF(Py_None);
1141 return Py_None;
1142 }
1143 else
1144 return PyFloat_FromDouble(s->sock_timeout);
1145}
1146
1147static char gettimeout_doc[] =
1148"gettimeout()\n\
1149\n\
1150Returns the timeout in floating seconds associated with socket \n\
1151operations. A timeout of None indicates that timeouts on socket \n\
1152operations are disabled.";
Guido van Rossume4485b01994-09-07 14:32:49 +00001153
Guido van Rossum48a680c2001-03-02 06:34:14 +00001154#ifdef RISCOS
1155/* s.sleeptaskw(1 | 0) method */
1156
1157static PyObject *
1158PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
1159{
Guido van Rossum67f7a382002-06-06 21:08:16 +00001160 int block;
1161 int delay_flag;
1162 if (!PyArg_Parse(args, "i", &block))
1163 return NULL;
1164 Py_BEGIN_ALLOW_THREADS
1165 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
1166 Py_END_ALLOW_THREADS
Guido van Rossum48a680c2001-03-02 06:34:14 +00001167
Guido van Rossum67f7a382002-06-06 21:08:16 +00001168 Py_INCREF(Py_None);
1169 return Py_None;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001170}
1171static char sleeptaskw_doc[] =
1172"sleeptaskw(flag)\n\
1173\n\
1174Allow sleeps in taskwindows.";
1175#endif
1176
1177
Guido van Rossumaee08791992-09-08 09:05:33 +00001178/* s.setsockopt() method.
1179 With an integer third argument, sets an integer option.
1180 With a string third argument, sets an option from a buffer;
1181 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001182
Guido van Rossum73624e91994-10-10 17:59:00 +00001183static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001184PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001185{
1186 int level;
1187 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001188 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +00001189 char *buf;
1190 int buflen;
1191 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001192
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001193 if (PyArg_ParseTuple(args, "iii:setsockopt",
1194 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001195 buf = (char *) &flag;
1196 buflen = sizeof flag;
1197 }
1198 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001199 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001200 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1201 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001202 return NULL;
1203 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001204 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001205 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001206 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001207 Py_INCREF(Py_None);
1208 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001209}
1210
Guido van Rossum82a5c661998-07-07 20:45:43 +00001211static char setsockopt_doc[] =
1212"setsockopt(level, option, value)\n\
1213\n\
1214Set a socket option. See the Unix manual for level and option.\n\
1215The value argument can either be an integer or a string.";
1216
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001217
Guido van Rossumaee08791992-09-08 09:05:33 +00001218/* s.getsockopt() method.
1219 With two arguments, retrieves an integer option.
1220 With a third integer argument, retrieves a string buffer of that size;
1221 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001222
Guido van Rossum73624e91994-10-10 17:59:00 +00001223static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001224PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001225{
1226 int level;
1227 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001228 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001229 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001230 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001231
Guido van Rossumbcc20741998-08-04 22:53:56 +00001232#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001233 /* We have incomplete socket support. */
1234 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001235 return NULL;
1236#else
1237
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001238 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1239 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001240 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001241
Guido van Rossumbe32c891996-06-20 16:25:29 +00001242 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001243 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001244 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001245 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001246 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001247 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001248 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001249 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001250 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001251 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001252 PyErr_SetString(PySocket_Error,
1253 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001254 return NULL;
1255 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001256 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001257 if (buf == NULL)
1258 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001259 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001260 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001261 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001262 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001263 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001264 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001265 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001266 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001267#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001268}
1269
Guido van Rossum82a5c661998-07-07 20:45:43 +00001270static char getsockopt_doc[] =
1271"getsockopt(level, option[, buffersize]) -> value\n\
1272\n\
1273Get a socket option. See the Unix manual for level and option.\n\
1274If a nonzero buffersize argument is given, the return value is a\n\
1275string of that length; otherwise it is an integer.";
1276
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001277
Fred Drake728819a2000-07-01 03:40:12 +00001278/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001279
Guido van Rossum73624e91994-10-10 17:59:00 +00001280static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001281PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001282{
1283 struct sockaddr *addr;
1284 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001285 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001286
Fred Drake728819a2000-07-01 03:40:12 +00001287 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001288 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001289 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001290 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001291 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001292 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001293 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001294 Py_INCREF(Py_None);
1295 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001296}
1297
Guido van Rossum82a5c661998-07-07 20:45:43 +00001298static char bind_doc[] =
1299"bind(address)\n\
1300\n\
1301Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001302pair (host, port); the host must refer to the local host. For raw packet\n\
1303sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001304
Guido van Rossum30a685f1991-06-27 15:51:29 +00001305
1306/* s.close() method.
1307 Set the file descriptor to -1 so operations tried subsequently
1308 will surely fail. */
1309
Guido van Rossum73624e91994-10-10 17:59:00 +00001310static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001311PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001312{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001313 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001314
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001315 if ((fd = s->sock_fd) != -1) {
1316 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001317 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001318 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001319 Py_END_ALLOW_THREADS
1320 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001321 Py_INCREF(Py_None);
1322 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001323}
1324
Guido van Rossum82a5c661998-07-07 20:45:43 +00001325static char close_doc[] =
1326"close()\n\
1327\n\
1328Close the socket. It cannot be used after this call.";
1329
Guido van Rossum30a685f1991-06-27 15:51:29 +00001330
Fred Drake728819a2000-07-01 03:40:12 +00001331/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001332
Guido van Rossum73624e91994-10-10 17:59:00 +00001333static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001334PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001335{
1336 struct sockaddr *addr;
1337 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001338 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001339
Fred Drake728819a2000-07-01 03:40:12 +00001340 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001341 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001342
1343 errno = 0; /* Reset the err indicator for use with timeouts */
1344
Guido van Rossum73624e91994-10-10 17:59:00 +00001345 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001346 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001347 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001348
1349 if (s->sock_timeout >= 0.0) {
1350 if (res < 0) {
1351 /* Return if we're already connected */
1352#ifdef MS_WINDOWS
1353 if (errno == WSAEINVAL || errno == WSAEISCONN)
1354#else
1355 if (errno == EISCONN)
1356#endif
1357 goto connected;
1358
1359 /* Check if we have an error */
1360 if (!s->sock_blocking)
1361 return s->errorhandler ();
1362 /* Check if we have a true failure for a blocking socket */
1363#ifdef MS_WINDOWS
1364 if (errno != WSAEWOULDBLOCK)
1365#else
1366 if (errno != EINPROGRESS && errno != EALREADY &&
1367 errno != EWOULDBLOCK)
1368#endif
1369 return s->errorhandler();
1370 }
1371
1372 /* Check if we're ready for the connect via select */
1373 if (internal_select(s, 1) <= 0)
1374 return NULL;
1375
1376 /* Complete the connection now */
1377 Py_BEGIN_ALLOW_THREADS
1378 res = connect(s->sock_fd, addr, addrlen);
1379 Py_END_ALLOW_THREADS
1380 }
1381
Guido van Rossumff4949e1992-08-05 19:58:53 +00001382 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001383 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001384
1385connected:
Guido van Rossum73624e91994-10-10 17:59:00 +00001386 Py_INCREF(Py_None);
1387 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001388}
1389
Guido van Rossum82a5c661998-07-07 20:45:43 +00001390static char connect_doc[] =
1391"connect(address)\n\
1392\n\
1393Connect the socket to a remote address. For IP sockets, the address\n\
1394is a pair (host, port).";
1395
Guido van Rossum30a685f1991-06-27 15:51:29 +00001396
Fred Drake728819a2000-07-01 03:40:12 +00001397/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001398
1399static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001400PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001401{
1402 struct sockaddr *addr;
1403 int addrlen;
1404 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001405
Fred Drake728819a2000-07-01 03:40:12 +00001406 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001407 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001408
1409 errno = 0; /* Reset the err indicator for use with timeouts */
1410
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001411 Py_BEGIN_ALLOW_THREADS
1412 res = connect(s->sock_fd, addr, addrlen);
1413 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001414
1415 if (s->sock_timeout >= 0.0) {
1416 if (res < 0) {
1417 /* Return if we're already connected */
1418#ifdef MS_WINDOWS
1419 if (errno == WSAEINVAL || errno == WSAEISCONN)
1420#else
1421 if (errno == EISCONN)
1422#endif
1423 goto conex_finally;
1424
1425 /* Check if we have an error */
1426 if (!s->sock_blocking)
1427 goto conex_finally;
1428 /* Check if we have a true failure for a blocking socket */
1429#ifdef MS_WINDOWS
1430 if (errno != WSAEWOULDBLOCK)
1431#else
1432 if (errno != EINPROGRESS && errno != EALREADY &&
1433 errno != EWOULDBLOCK)
1434#endif
1435 goto conex_finally;
1436 }
1437
1438 /* Check if we're ready for the connect via select */
1439 if (internal_select(s, 1) <= 0)
1440 return NULL;
1441
1442 /* Complete the connection now */
1443 Py_BEGIN_ALLOW_THREADS
1444 res = connect(s->sock_fd, addr, addrlen);
1445 Py_END_ALLOW_THREADS
1446 }
1447
Tim Petersc32410a2001-10-30 01:26:49 +00001448 if (res != 0) {
1449#ifdef MS_WINDOWS
1450 res = WSAGetLastError();
1451#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001452 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001453#endif
1454 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001455
1456conex_finally:
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001457 return PyInt_FromLong((long) res);
1458}
1459
Guido van Rossum82a5c661998-07-07 20:45:43 +00001460static char connect_ex_doc[] =
1461"connect_ex(address)\n\
1462\n\
1463This is like connect(address), but returns an error code (the errno value)\n\
1464instead of raising an exception when an error occurs.";
1465
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001466
Guido van Rossumed233a51992-06-23 09:07:03 +00001467/* s.fileno() method */
1468
Guido van Rossum73624e91994-10-10 17:59:00 +00001469static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001470PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001471{
Fred Drakea04eaad2000-06-30 02:46:07 +00001472#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001473 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001474#else
1475 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1476#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001477}
1478
Guido van Rossum82a5c661998-07-07 20:45:43 +00001479static char fileno_doc[] =
1480"fileno() -> integer\n\
1481\n\
1482Return the integer file descriptor of the socket.";
1483
Guido van Rossumed233a51992-06-23 09:07:03 +00001484
Guido van Rossumbe32c891996-06-20 16:25:29 +00001485#ifndef NO_DUP
1486/* s.dup() method */
1487
1488static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001489PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001490{
Fred Drakea04eaad2000-06-30 02:46:07 +00001491 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001492 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001493
Guido van Rossumbe32c891996-06-20 16:25:29 +00001494 newfd = dup(s->sock_fd);
1495 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001496 return s->errorhandler();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001497 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001498 s->sock_family,
1499 s->sock_type,
1500 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001501 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001502 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001503 return sock;
1504}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001505
1506static char dup_doc[] =
1507"dup() -> socket object\n\
1508\n\
1509Return a new socket object connected to the same system resource.";
1510
Guido van Rossumbe32c891996-06-20 16:25:29 +00001511#endif
1512
1513
Guido van Rossumc89705d1992-11-26 08:54:07 +00001514/* s.getsockname() method */
1515
Guido van Rossum73624e91994-10-10 17:59:00 +00001516static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001517PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001518{
1519 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001520 int res;
1521 socklen_t addrlen;
1522
Guido van Rossumc89705d1992-11-26 08:54:07 +00001523 if (!getsockaddrlen(s, &addrlen))
1524 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001525 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001526 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001527 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001528 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001529 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001530 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001531 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001532}
1533
Guido van Rossum82a5c661998-07-07 20:45:43 +00001534static char getsockname_doc[] =
1535"getsockname() -> address info\n\
1536\n\
1537Return the address of the local endpoint. For IP sockets, the address\n\
1538info is a pair (hostaddr, port).";
1539
Guido van Rossumc89705d1992-11-26 08:54:07 +00001540
Guido van Rossumb6775db1994-08-01 11:34:53 +00001541#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001542/* s.getpeername() method */
1543
Guido van Rossum73624e91994-10-10 17:59:00 +00001544static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001545PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001546{
1547 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001548 int res;
1549 socklen_t addrlen;
1550
Guido van Rossumc89705d1992-11-26 08:54:07 +00001551 if (!getsockaddrlen(s, &addrlen))
1552 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001553 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001554 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001555 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001556 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001557 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001558 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001559 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001560}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001561
1562static char getpeername_doc[] =
1563"getpeername() -> address info\n\
1564\n\
1565Return the address of the remote endpoint. For IP sockets, the address\n\
1566info is a pair (hostaddr, port).";
1567
Guido van Rossumb6775db1994-08-01 11:34:53 +00001568#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001569
1570
Guido van Rossum30a685f1991-06-27 15:51:29 +00001571/* s.listen(n) method */
1572
Guido van Rossum73624e91994-10-10 17:59:00 +00001573static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001574PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001575{
1576 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001577 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001578
1579 backlog = PyInt_AsLong(arg);
1580 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001583 if (backlog < 1)
1584 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001585 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001586 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001587 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001588 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001589 Py_INCREF(Py_None);
1590 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001591}
1592
Guido van Rossum82a5c661998-07-07 20:45:43 +00001593static char listen_doc[] =
1594"listen(backlog)\n\
1595\n\
1596Enable a server to accept connections. The backlog argument must be at\n\
1597least 1; it specifies the number of unaccepted connection that the system\n\
1598will allow before refusing new connections.";
1599
1600
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001601#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001602/* s.makefile(mode) method.
1603 Create a new open file object referring to a dupped version of
1604 the socket's file descriptor. (The dup() call is necessary so
1605 that the open file and socket objects may be closed independent
1606 of each other.)
1607 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1608
Guido van Rossum73624e91994-10-10 17:59:00 +00001609static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001610PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001611{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001612 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001613 char *mode = "r";
1614 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001615#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001616 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001617#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001618 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001619#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001620 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001621 PyObject *f;
1622
Guido van Rossum43713e52000-02-29 13:59:29 +00001623 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001624 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001625#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001626 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1627 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001628#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001629 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001630#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001631 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001632 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001633 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001634 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001635 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001636#ifdef USE_GUSI2
1637 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
Guido van Rossum67f7a382002-06-06 21:08:16 +00001638 if (strchr(mode, 'b') != NULL)
Jack Jansen6d8898b2002-03-25 15:32:01 +00001639 bufsize = 0;
1640#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001641 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1642 if (f != NULL)
1643 PyFile_SetBufSize(f, bufsize);
1644 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001645}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001646
1647static char makefile_doc[] =
1648"makefile([mode[, buffersize]]) -> file object\n\
1649\n\
1650Return a regular file object corresponding to the socket.\n\
1651The mode and buffersize arguments are as for the built-in open() function.";
1652
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001653#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001654
Guido van Rossum48a680c2001-03-02 06:34:14 +00001655
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001656/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001657
Guido van Rossum73624e91994-10-10 17:59:00 +00001658static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001659PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001660{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001661 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001662 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001663
Guido van Rossum43713e52000-02-29 13:59:29 +00001664 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001665 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001666
1667 if (len < 0) {
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001668 PyErr_SetString(PyExc_ValueError,
1669 "negative buffersize in connect");
1670 return NULL;
1671 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001672
Guido van Rossum73624e91994-10-10 17:59:00 +00001673 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001674 if (buf == NULL)
1675 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001676
1677 if (s->sock_timeout >= 0.0) {
1678 if (s->sock_blocking) {
1679 if (internal_select(s, 0) <= 0)
1680 return NULL;
1681 }
1682 }
1683
Guido van Rossum73624e91994-10-10 17:59:00 +00001684 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001685 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001686 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001687
Guido van Rossum7c53b771995-09-13 18:39:47 +00001688 if (n < 0) {
1689 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001690 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001691 }
Tim Peters5de98422002-04-27 18:44:32 +00001692 if (n != len)
1693 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001694 return buf;
1695}
1696
Guido van Rossum82a5c661998-07-07 20:45:43 +00001697static char recv_doc[] =
1698"recv(buffersize[, flags]) -> data\n\
1699\n\
1700Receive up to buffersize bytes from the socket. For the optional flags\n\
1701argument, see the Unix manual. When no data is available, block until\n\
1702at least one byte is available or until the remote end is closed. When\n\
1703the remote end is closed and all data is read, return the empty string.";
1704
Guido van Rossum30a685f1991-06-27 15:51:29 +00001705
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001706/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001707
Guido van Rossum73624e91994-10-10 17:59:00 +00001708static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001709PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001710{
1711 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001712 PyObject *buf = NULL;
1713 PyObject *addr = NULL;
1714 PyObject *ret = NULL;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001715 int len, n, flags = 0;
1716 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001717
Guido van Rossum43713e52000-02-29 13:59:29 +00001718 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001719 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001720
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001721 if (!getsockaddrlen(s, &addrlen))
1722 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001723 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001724 if (buf == NULL)
1725 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001726
1727 if (s->sock_timeout >= 0.0) {
1728 if (s->sock_blocking) {
1729 if (internal_select(s, 0) <= 0)
1730 return NULL;
1731 }
1732 }
1733
Guido van Rossum73624e91994-10-10 17:59:00 +00001734 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001735 memset(addrbuf, 0, addrlen);
1736 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001737#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001738#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001739 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001740#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001741 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001742#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001743#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001744 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001745#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001746 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001747 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001748
Guido van Rossum7c53b771995-09-13 18:39:47 +00001749 if (n < 0) {
1750 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001751 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001752 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001753
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001754 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001755 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001756
Guido van Rossum67f7a382002-06-06 21:08:16 +00001757 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
1758 addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001759 goto finally;
1760
Guido van Rossum73624e91994-10-10 17:59:00 +00001761 ret = Py_BuildValue("OO", buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001762
1763finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001764 Py_XDECREF(addr);
1765 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001766 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001767}
1768
Guido van Rossum82a5c661998-07-07 20:45:43 +00001769static char recvfrom_doc[] =
1770"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1771\n\
1772Like recv(buffersize, flags) but also return the sender's address info.";
1773
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001774/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001775
Guido van Rossum73624e91994-10-10 17:59:00 +00001776static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001777PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001778{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001779 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001780 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001781
Guido van Rossum43713e52000-02-29 13:59:29 +00001782 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001783 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001784
1785 if (s->sock_timeout >= 0.0) {
1786 if (s->sock_blocking) {
1787 if (internal_select(s, 1) <= 0)
1788 return NULL;
1789 }
1790 }
1791
Guido van Rossum73624e91994-10-10 17:59:00 +00001792 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001793 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001794 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001795
Guido van Rossum30a685f1991-06-27 15:51:29 +00001796 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001797 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001798 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001799}
1800
Guido van Rossum82a5c661998-07-07 20:45:43 +00001801static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001802"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001803\n\
1804Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001805argument, see the Unix manual. Return the number of bytes\n\
1806sent; this may be less than len(data) if the network is busy.";
1807
1808
1809/* s.sendall(data [,flags]) method */
1810
1811static PyObject *
1812PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1813{
1814 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001815 int len, n, flags = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001816
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001817 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1818 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001819
1820 if (s->sock_timeout >= 0.0) {
1821 if (s->sock_blocking) {
1822 if (internal_select(s, 1) < 0)
1823 return NULL;
1824 }
1825 }
1826
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001827 Py_BEGIN_ALLOW_THREADS
1828 do {
1829 n = send(s->sock_fd, buf, len, flags);
1830 if (n < 0)
1831 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001832 buf += n;
1833 len -= n;
1834 } while (len > 0);
1835 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001836
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001837 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001838 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00001839
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001840 Py_INCREF(Py_None);
1841 return Py_None;
1842}
1843
1844static char sendall_doc[] =
1845"sendall(data[, flags])\n\
1846\n\
1847Send a data string to the socket. For the optional flags\n\
1848argument, see the Unix manual. This calls send() repeatedly\n\
1849until all data is sent. If an error occurs, it's impossible\n\
1850to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001851
Guido van Rossum30a685f1991-06-27 15:51:29 +00001852
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001853/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001854
Guido van Rossum73624e91994-10-10 17:59:00 +00001855static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001856PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001857{
Guido van Rossum73624e91994-10-10 17:59:00 +00001858 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001859 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001860 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001861 int addrlen, len, n, flags;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001862
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001863 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001864 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001865 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001866 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1867 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001868 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001869 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00001870
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001871 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001872 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00001873
1874 if (s->sock_timeout >= 0.0) {
1875 if (s->sock_blocking) {
1876 if (internal_select(s, 1) <= 0)
1877 return NULL;
1878 }
1879 }
1880
Guido van Rossum73624e91994-10-10 17:59:00 +00001881 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001882 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001883 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00001884
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001885 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001886 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001887 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001888}
1889
Guido van Rossum82a5c661998-07-07 20:45:43 +00001890static char sendto_doc[] =
1891"sendto(data[, flags], address)\n\
1892\n\
1893Like send(data, flags) but allows specifying the destination address.\n\
1894For IP sockets, the address is a pair (hostaddr, port).";
1895
Guido van Rossum30a685f1991-06-27 15:51:29 +00001896
1897/* s.shutdown(how) method */
1898
Guido van Rossum73624e91994-10-10 17:59:00 +00001899static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001900PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001901{
1902 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001903 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001904
1905 how = PyInt_AsLong(arg);
1906 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001907 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001908 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001909 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001910 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001911 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001912 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001913 Py_INCREF(Py_None);
1914 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001915}
1916
Guido van Rossum82a5c661998-07-07 20:45:43 +00001917static char shutdown_doc[] =
1918"shutdown(flag)\n\
1919\n\
1920Shut down the reading side of the socket (flag == 0), the writing side\n\
1921of the socket (flag == 1), or both ends (flag == 2).";
1922
Guido van Rossum30a685f1991-06-27 15:51:29 +00001923
1924/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001925
Guido van Rossum73624e91994-10-10 17:59:00 +00001926static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001927 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001928 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001929 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001930 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001931 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001932 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001933 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001934 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001935 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001936 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001937#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001938 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001939 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001940#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001941 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001942 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001943#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001944 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001945 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001946#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001947 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001948 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001949 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1950 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001951 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001952 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001953#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001954 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1955 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001956#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001957 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1958 recv_doc},
1959 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1960 recvfrom_doc},
1961 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1962 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001963 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1964 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001965 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1966 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001967 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001968 setblocking_doc},
Guido van Rossum67f7a382002-06-06 21:08:16 +00001969 {"settimeout", (PyCFunction)PySocketSock_settimeout, METH_O,
1970 settimeout_doc},
1971 {"gettimeout", (PyCFunction)PySocketSock_gettimeout, METH_NOARGS,
1972 gettimeout_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001973 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1974 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001975 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001976 shutdown_doc},
1977#ifdef RISCOS
1978 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1979 sleeptaskw_doc},
1980#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001981 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001982};
1983
Guido van Rossum30a685f1991-06-27 15:51:29 +00001984
Guido van Rossum73624e91994-10-10 17:59:00 +00001985/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001986 First close the file description. */
1987
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001988static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001989PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001990{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001991 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001992 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001993 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001994}
1995
Guido van Rossum30a685f1991-06-27 15:51:29 +00001996
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001997static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001998PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001999{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002000 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00002001#if SIZEOF_SOCKET_T > SIZEOF_LONG
2002 if (s->sock_fd > LONG_MAX) {
2003 /* this can occur on Win64, and actually there is a special
2004 ugly printf formatter for decimal pointer length integer
2005 printing, only bother if necessary*/
2006 PyErr_SetString(PyExc_OverflowError,
2007 "no printf formatter to display the socket descriptor in decimal");
2008 return NULL;
2009 }
2010#endif
Tim Peters885d4572001-11-28 20:27:42 +00002011 PyOS_snprintf(buf, sizeof(buf),
2012 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
2013 (long)s->sock_fd, s->sock_family,
2014 s->sock_type,
2015 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00002016 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002017}
2018
2019
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002020/* Create a new, uninitialized socket object. */
2021
2022static PyObject *
2023PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2024{
2025 PyObject *new;
2026
2027 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00002028 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002029 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002030 ((PySocketSockObject *)new)->sock_timeout = -1.0;
Guido van Rossume1c478f2002-06-06 20:08:25 +00002031 ((PySocketSockObject *)new)->errorhandler = &PySocket_Err;
2032 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002033 return new;
2034}
2035
2036
2037/* Initialize a new socket object. */
2038
2039/*ARGSUSED*/
2040static int
2041PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
2042{
2043 PySocketSockObject *s = (PySocketSockObject *)self;
2044 SOCKET_T fd;
2045 int family = AF_INET, type = SOCK_STREAM, proto = 0;
2046 static char *keywords[] = {"family", "type", "proto", 0};
2047
2048 if (!PyArg_ParseTupleAndKeywords(args, kwds,
2049 "|iii:socket", keywords,
2050 &family, &type, &proto))
2051 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002052
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002053 Py_BEGIN_ALLOW_THREADS
2054 fd = socket(family, type, proto);
2055 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002056
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002057#ifdef MS_WINDOWS
2058 if (fd == INVALID_SOCKET)
2059#else
2060 if (fd < 0)
2061#endif
2062 {
2063 PySocket_Err();
2064 return -1;
2065 }
2066 init_sockobject(s, fd, family, type, proto);
2067 /* From now on, ignore SIGPIPE and let the error checking
2068 do the work. */
2069#ifdef SIGPIPE
2070 (void) signal(SIGPIPE, SIG_IGN);
2071#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002072
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002073 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002074
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002075}
2076
2077
Guido van Rossumb6775db1994-08-01 11:34:53 +00002078/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002079
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002080static char socket_doc[] =
2081"socket([family[, type[, proto]]]) -> socket object\n\
2082\n\
2083Open a socket of the given type. The family argument specifies the\n\
2084address family; it defaults to AF_INET. The type argument specifies\n\
2085whether this is a stream (SOCK_STREAM, this is the default)\n\
2086or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
2087specifying the default protocol.\n\
2088\n\
2089A socket represents one endpoint of a network connection.\n\
2090\n\
2091Methods:\n\
2092\n\
2093accept() -- accept a connection, returning new socket and client address\n\
2094bind() -- bind the socket to a local address\n\
2095close() -- close the socket\n\
2096connect() -- connect the socket to a remote address\n\
2097connect_ex() -- connect, return an error code instead of an exception \n\
2098dup() -- return a new socket object identical to the current one (*)\n\
2099fileno() -- return underlying file descriptor\n\
2100getpeername() -- return remote address (*)\n\
2101getsockname() -- return local address\n\
2102getsockopt() -- get socket options\n\
2103listen() -- start listening for incoming connections\n\
Andrew M. Kuchling3072ecd2001-11-28 04:28:31 +00002104makefile() -- return a file object corresponding to the socket (*)\n\
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002105recv() -- receive data\n\
2106recvfrom() -- receive data and sender's address\n\
2107send() -- send data, may not send all of it\n\
2108sendall() -- send all data\n\
2109sendto() -- send data to a given address\n\
2110setblocking() -- set or clear the blocking I/O flag\n\
2111setsockopt() -- set socket options\n\
2112shutdown() -- shut down traffic in one or both directions\n\
2113\n\
2114(*) not available on all platforms!)";
2115
Guido van Rossum73624e91994-10-10 17:59:00 +00002116static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00002117 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002118 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00002119 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002120 sizeof(PySocketSockObject), /* tp_basicsize */
2121 0, /* tp_itemsize */
2122 (destructor)PySocketSock_dealloc, /* tp_dealloc */
2123 0, /* tp_print */
2124 0, /* tp_getattr */
2125 0, /* tp_setattr */
2126 0, /* tp_compare */
2127 (reprfunc)PySocketSock_repr, /* tp_repr */
2128 0, /* tp_as_number */
2129 0, /* tp_as_sequence */
2130 0, /* tp_as_mapping */
2131 0, /* tp_hash */
2132 0, /* tp_call */
2133 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002134 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002135 0, /* tp_setattro */
2136 0, /* tp_as_buffer */
2137 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2138 socket_doc, /* tp_doc */
2139 0, /* tp_traverse */
2140 0, /* tp_clear */
2141 0, /* tp_richcompare */
2142 0, /* tp_weaklistoffset */
2143 0, /* tp_iter */
2144 0, /* tp_iternext */
2145 PySocketSock_methods, /* tp_methods */
2146 0, /* tp_members */
2147 0, /* tp_getset */
2148 0, /* tp_base */
2149 0, /* tp_dict */
2150 0, /* tp_descr_get */
2151 0, /* tp_descr_set */
2152 0, /* tp_dictoffset */
2153 PySocketSock_init, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002154 0, /* set below */ /* tp_alloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002155 PySocketSock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002156 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002157};
2158
Guido van Rossum30a685f1991-06-27 15:51:29 +00002159
Guido van Rossum81194471991-07-27 21:42:02 +00002160/* Python interface to gethostname(). */
2161
2162/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002163static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002164PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00002165{
2166 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00002167 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002168 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00002169 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002170 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002171 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00002172 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002173 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002174 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00002175 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00002176 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00002177}
Guido van Rossumff4949e1992-08-05 19:58:53 +00002178
Guido van Rossum82a5c661998-07-07 20:45:43 +00002179static char gethostname_doc[] =
2180"gethostname() -> string\n\
2181\n\
2182Return the current host name.";
2183
Guido van Rossumff4949e1992-08-05 19:58:53 +00002184
Guido van Rossum30a685f1991-06-27 15:51:29 +00002185/* Python interface to gethostbyname(name). */
2186
2187/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002188static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002189PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002190{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002191 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002192 struct sockaddr_storage addrbuf;
2193
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002194 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002195 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002196 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002197 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002198 return makeipaddr((struct sockaddr *)&addrbuf,
2199 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002200}
2201
Guido van Rossum82a5c661998-07-07 20:45:43 +00002202static char gethostbyname_doc[] =
2203"gethostbyname(host) -> address\n\
2204\n\
2205Return the IP address (a string of the form '255.255.255.255') for a host.";
2206
2207
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002208/* Convenience function common to gethostbyname_ex and gethostbyaddr */
2209
2210static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002211gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002212{
2213 char **pch;
2214 PyObject *rtn_tuple = (PyObject *)NULL;
2215 PyObject *name_list = (PyObject *)NULL;
2216 PyObject *addr_list = (PyObject *)NULL;
2217 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002218
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002219 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002220 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002221#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002222 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00002223#else
2224 PyErr_SetString(PySocket_Error, "host not found");
2225#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002226 return NULL;
2227 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002228
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002229 if (h->h_addrtype != af) {
2230#ifdef HAVE_STRERROR
2231 /* Let's get real error message to return */
2232 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002233#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002234 PyErr_SetString(PySocket_Error,
2235 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002236#endif
2237 return NULL;
2238 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002239
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002240 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002241
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002242 case AF_INET:
2243 if (alen < sizeof(struct sockaddr_in))
2244 return NULL;
2245 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002246
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002247#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002248 case AF_INET6:
2249 if (alen < sizeof(struct sockaddr_in6))
2250 return NULL;
2251 break;
2252#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002253
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002254 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002255
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002256 if ((name_list = PyList_New(0)) == NULL)
2257 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002258
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002259 if ((addr_list = PyList_New(0)) == NULL)
2260 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002261
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002262 for (pch = h->h_aliases; *pch != NULL; pch++) {
2263 int status;
2264 tmp = PyString_FromString(*pch);
2265 if (tmp == NULL)
2266 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002267
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002268 status = PyList_Append(name_list, tmp);
2269 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002270
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002271 if (status)
2272 goto err;
2273 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002274
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002275 for (pch = h->h_addr_list; *pch != NULL; pch++) {
2276 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002277
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002278 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00002279
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002280 case AF_INET:
2281 {
2282 struct sockaddr_in sin;
2283 memset(&sin, 0, sizeof(sin));
2284 sin.sin_family = af;
2285#ifdef HAVE_SOCKADDR_SA_LEN
2286 sin.sin_len = sizeof(sin);
2287#endif
2288 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
2289 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002290
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002291 if (pch == h->h_addr_list && alen >= sizeof(sin))
2292 memcpy((char *) addr, &sin, sizeof(sin));
2293 break;
2294 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002295
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002296#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002297 case AF_INET6:
2298 {
2299 struct sockaddr_in6 sin6;
2300 memset(&sin6, 0, sizeof(sin6));
2301 sin6.sin6_family = af;
2302#ifdef HAVE_SOCKADDR_SA_LEN
2303 sin6.sin6_len = sizeof(sin6);
2304#endif
2305 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
2306 tmp = makeipaddr((struct sockaddr *)&sin6,
2307 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002308
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002309 if (pch == h->h_addr_list && alen >= sizeof(sin6))
2310 memcpy((char *) addr, &sin6, sizeof(sin6));
2311 break;
2312 }
2313#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00002314
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002315 default: /* can't happen */
2316 PyErr_SetString(PySocket_Error,
2317 "unsupported address family");
2318 return NULL;
2319 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002320
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002321 if (tmp == NULL)
2322 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002323
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002324 status = PyList_Append(addr_list, tmp);
2325 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002326
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002327 if (status)
2328 goto err;
2329 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002330
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002331 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002332
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002333 err:
2334 Py_XDECREF(name_list);
2335 Py_XDECREF(addr_list);
2336 return rtn_tuple;
2337}
2338
2339
2340/* Python interface to gethostbyname_ex(name). */
2341
2342/*ARGSUSED*/
2343static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002344PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002345{
2346 char *name;
2347 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002348 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002349 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00002350 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002351#ifdef HAVE_GETHOSTBYNAME_R
2352 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002353#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2354 struct hostent_data data;
2355#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002356 char buf[16384];
2357 int buf_len = (sizeof buf) - 1;
2358 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002359#endif
2360#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002361 int result;
2362#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002363#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002364
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002365 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002366 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002367 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002368 return NULL;
2369 Py_BEGIN_ALLOW_THREADS
2370#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002371#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002372 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002373#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002374 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002375#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002376 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002377 result = gethostbyname_r(name, &hp_allocated, &data);
2378 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002379#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002380#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002381#ifdef USE_GETHOSTBYNAME_LOCK
2382 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002383#endif
2384 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002385#endif /* HAVE_GETHOSTBYNAME_R */
2386 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002387 /* Some C libraries would require addr.__ss_family instead of
2388 * addr.ss_family.
2389 * Therefore, we cast the sockaddr_storage into sockaddr to
2390 * access sa_family.
2391 */
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002392 sa = (struct sockaddr*)&addr;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002393 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),
2394 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002395#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002396 PyThread_release_lock(gethostbyname_lock);
2397#endif
2398 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002399}
2400
2401static char ghbn_ex_doc[] =
2402"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2403\n\
2404Return the true host name, a list of aliases, and a list of IP addresses,\n\
2405for a host. The host argument is a string giving a host name or IP number.";
2406
2407
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002408/* Python interface to gethostbyaddr(IP). */
2409
2410/*ARGSUSED*/
2411static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002412PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002413{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002414#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002415 struct sockaddr_storage addr;
2416#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002417 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002418#endif
2419 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002420 char *ip_num;
2421 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002422 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002423#ifdef HAVE_GETHOSTBYNAME_R
2424 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002425#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2426 struct hostent_data data;
2427#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002428 char buf[16384];
2429 int buf_len = (sizeof buf) - 1;
2430 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002431#endif
2432#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002433 int result;
2434#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002435#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002436 char *ap;
2437 int al;
2438 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002439
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002440 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002441 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002442 af = PF_UNSPEC;
2443 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002444 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002445 af = sa->sa_family;
2446 ap = NULL;
2447 al = 0;
2448 switch (af) {
2449 case AF_INET:
2450 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2451 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2452 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002453#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002454 case AF_INET6:
2455 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2456 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2457 break;
2458#endif
2459 default:
2460 PyErr_SetString(PySocket_Error, "unsupported address family");
2461 return NULL;
2462 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002463 Py_BEGIN_ALLOW_THREADS
2464#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002465#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002466 result = gethostbyaddr_r(ap, al, af,
2467 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002468 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002469#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002470 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002471 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002472#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002473 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002474 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002475 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002476#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002477#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002478#ifdef USE_GETHOSTBYNAME_LOCK
2479 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002480#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002481 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002482#endif /* HAVE_GETHOSTBYNAME_R */
2483 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002484 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002485#ifdef USE_GETHOSTBYNAME_LOCK
2486 PyThread_release_lock(gethostbyname_lock);
2487#endif
2488 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002489}
2490
Guido van Rossum82a5c661998-07-07 20:45:43 +00002491static char gethostbyaddr_doc[] =
2492"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2493\n\
2494Return the true host name, a list of aliases, and a list of IP addresses,\n\
2495for a host. The host argument is a string giving a host name or IP number.";
2496
Guido van Rossum30a685f1991-06-27 15:51:29 +00002497
2498/* Python interface to getservbyname(name).
2499 This only returns the port number, since the other info is already
2500 known or not useful (like the list of aliases). */
2501
2502/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002503static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002504PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002505{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002506 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002507 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002508 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002509 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002510 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002511 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002512 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002513 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002514 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002515 return NULL;
2516 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002517 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002518}
2519
Guido van Rossum82a5c661998-07-07 20:45:43 +00002520static char getservbyname_doc[] =
2521"getservbyname(servicename, protocolname) -> integer\n\
2522\n\
2523Return a port number from a service name and protocol name.\n\
2524The protocol name should be 'tcp' or 'udp'.";
2525
Guido van Rossum30a685f1991-06-27 15:51:29 +00002526
Guido van Rossum3901d851996-12-19 16:35:04 +00002527/* Python interface to getprotobyname(name).
2528 This only returns the protocol number, since the other info is
2529 already known or not useful (like the list of aliases). */
2530
2531/*ARGSUSED*/
2532static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002533PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002534{
2535 char *name;
2536 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002537#ifdef __BEOS__
2538/* Not available in BeOS yet. - [cjh] */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002539 PyErr_SetString(PySocket_Error, "getprotobyname not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00002540 return NULL;
2541#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002542 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002543 return NULL;
2544 Py_BEGIN_ALLOW_THREADS
2545 sp = getprotobyname(name);
2546 Py_END_ALLOW_THREADS
2547 if (sp == NULL) {
2548 PyErr_SetString(PySocket_Error, "protocol not found");
2549 return NULL;
2550 }
2551 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002552#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002553}
2554
Guido van Rossum82a5c661998-07-07 20:45:43 +00002555static char getprotobyname_doc[] =
2556"getprotobyname(name) -> integer\n\
2557\n\
2558Return the protocol number for the named protocol. (Rarely used.)";
2559
Guido van Rossum3901d851996-12-19 16:35:04 +00002560
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002561#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002562/* Create a socket object from a numeric file description.
2563 Useful e.g. if stdin is a socket.
2564 Additional arguments as for socket(). */
2565
2566/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002567static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002568PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002569{
Guido van Rossum73624e91994-10-10 17:59:00 +00002570 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002571 SOCKET_T fd;
2572 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002573 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2574 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002575 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002576 /* Dup the fd so it and the socket can be closed independently */
2577 fd = dup(fd);
2578 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002579 return PySocket_Err();
2580 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002581 /* From now on, ignore SIGPIPE and let the error checking
2582 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002583#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002584 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002585#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002586 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002587}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002588
2589static char fromfd_doc[] =
2590"fromfd(fd, family, type[, proto]) -> socket object\n\
2591\n\
2592Create a socket object from the given file descriptor.\n\
2593The remaining arguments are the same as for socket().";
2594
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002595#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002596
Guido van Rossum82a5c661998-07-07 20:45:43 +00002597
Guido van Rossum006bf911996-06-12 04:04:55 +00002598static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002599PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002600{
2601 int x1, x2;
2602
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002603 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002604 return NULL;
2605 }
2606 x2 = (int)ntohs((short)x1);
2607 return PyInt_FromLong(x2);
2608}
2609
Guido van Rossum82a5c661998-07-07 20:45:43 +00002610static char ntohs_doc[] =
2611"ntohs(integer) -> integer\n\
2612\n\
2613Convert a 16-bit integer from network to host byte order.";
2614
2615
Guido van Rossum006bf911996-06-12 04:04:55 +00002616static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002617PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002618{
2619 int x1, x2;
2620
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002621 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002622 return NULL;
2623 }
2624 x2 = ntohl(x1);
2625 return PyInt_FromLong(x2);
2626}
2627
Guido van Rossum82a5c661998-07-07 20:45:43 +00002628static char ntohl_doc[] =
2629"ntohl(integer) -> integer\n\
2630\n\
2631Convert a 32-bit integer from network to host byte order.";
2632
2633
Guido van Rossum006bf911996-06-12 04:04:55 +00002634static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002635PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002636{
2637 int x1, x2;
2638
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002639 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002640 return NULL;
2641 }
2642 x2 = (int)htons((short)x1);
2643 return PyInt_FromLong(x2);
2644}
2645
Guido van Rossum82a5c661998-07-07 20:45:43 +00002646static char htons_doc[] =
2647"htons(integer) -> integer\n\
2648\n\
2649Convert a 16-bit integer from host to network byte order.";
2650
2651
Guido van Rossum006bf911996-06-12 04:04:55 +00002652static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002653PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002654{
2655 int x1, x2;
2656
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002657 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002658 return NULL;
2659 }
2660 x2 = htonl(x1);
2661 return PyInt_FromLong(x2);
2662}
2663
Guido van Rossum82a5c661998-07-07 20:45:43 +00002664static char htonl_doc[] =
2665"htonl(integer) -> integer\n\
2666\n\
2667Convert a 32-bit integer from host to network byte order.";
2668
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002669/*
2670 * socket.inet_aton() and socket.inet_ntoa() functions
2671 *
2672 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2673 *
2674 */
2675
Guido van Rossum48a680c2001-03-02 06:34:14 +00002676static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002677"inet_aton(string) -> packed 32-bit IP representation\n\
2678\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002679Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002680binary format used in low-level network functions.";
2681
2682static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002683PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002684{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002685#ifndef INADDR_NONE
2686#define INADDR_NONE (-1)
2687#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002688
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002689 /* Have to use inet_addr() instead */
2690 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002691 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002692
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002693 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002694 return NULL;
2695 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002696 packed_addr = inet_addr(ip_addr);
2697
2698 if (packed_addr == INADDR_NONE) { /* invalid address */
2699 PyErr_SetString(PySocket_Error,
2700 "illegal IP address string passed to inet_aton");
2701 return NULL;
2702 }
2703
2704 return PyString_FromStringAndSize((char *) &packed_addr,
2705 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002706}
2707
Guido van Rossum48a680c2001-03-02 06:34:14 +00002708static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002709"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002710\n\
2711Convert an IP address from 32-bit packed binary format to string format";
2712
2713static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002714PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002715{
2716 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002717 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002718 struct in_addr packed_addr;
2719
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002720 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002721 return NULL;
2722 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002723
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002724 if (addr_len != sizeof(packed_addr)) {
2725 PyErr_SetString(PySocket_Error,
2726 "packed IP wrong length for inet_ntoa");
2727 return NULL;
2728 }
2729
2730 memcpy(&packed_addr, packed_str, addr_len);
2731
2732 return PyString_FromString(inet_ntoa(packed_addr));
2733}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002734
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002735/* Python interface to getaddrinfo(host, port). */
2736
2737/*ARGSUSED*/
2738static PyObject *
2739PySocket_getaddrinfo(PyObject *self, PyObject *args)
2740{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002741 struct addrinfo hints, *res;
2742 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002743 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002744 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002745 char *hptr, *pptr;
2746 int family, socktype, protocol, flags;
2747 int error;
2748 PyObject *all = (PyObject *)NULL;
2749 PyObject *single = (PyObject *)NULL;
2750
2751 family = socktype = protocol = flags = 0;
2752 family = PF_UNSPEC;
2753 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2754 &hptr, &pobj, &family, &socktype,
2755 &protocol, &flags)) {
2756 return NULL;
2757 }
2758 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002759 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002760 pptr = pbuf;
2761 } else if (PyString_Check(pobj)) {
2762 pptr = PyString_AsString(pobj);
2763 } else if (pobj == Py_None) {
2764 pptr = (char *)NULL;
2765 } else {
2766 PyErr_SetString(PySocket_Error, "Int or String expected");
2767 return NULL;
2768 }
2769 memset(&hints, 0, sizeof(hints));
2770 hints.ai_family = family;
2771 hints.ai_socktype = socktype;
2772 hints.ai_protocol = protocol;
2773 hints.ai_flags = flags;
2774 error = getaddrinfo(hptr, pptr, &hints, &res0);
2775 if (error) {
2776 PyGAI_Err(error);
2777 return NULL;
2778 }
2779
2780 if ((all = PyList_New(0)) == NULL)
2781 goto err;
2782 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002783 PyObject *addr =
2784 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2785 if (addr == NULL)
2786 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002787 single = Py_BuildValue("iiisO", res->ai_family,
2788 res->ai_socktype, res->ai_protocol,
2789 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002790 addr);
2791 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002792 if (single == NULL)
2793 goto err;
2794
2795 if (PyList_Append(all, single))
2796 goto err;
2797 Py_XDECREF(single);
2798 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002799 return all;
2800 err:
2801 Py_XDECREF(single);
2802 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002803 if (res0)
2804 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002805 return (PyObject *)NULL;
2806}
2807
2808static char getaddrinfo_doc[] =
2809"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2810 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2811\n\
2812Resolve host and port into addrinfo struct.";
2813
2814/* Python interface to getnameinfo(sa, flags). */
2815
2816/*ARGSUSED*/
2817static PyObject *
2818PySocket_getnameinfo(PyObject *self, PyObject *args)
2819{
2820 PyObject *sa = (PyObject *)NULL;
2821 int flags;
2822 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002823 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002824 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2825 struct addrinfo hints, *res = NULL;
2826 int error;
2827 PyObject *ret = (PyObject *)NULL;
2828
2829 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002830 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002831 return NULL;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002832 if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id))
2833 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002834 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002835 memset(&hints, 0, sizeof(hints));
2836 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002837 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002838 error = getaddrinfo(hostp, pbuf, &hints, &res);
2839 if (error) {
2840 PyGAI_Err(error);
2841 goto fail;
2842 }
2843 if (res->ai_next) {
2844 PyErr_SetString(PySocket_Error,
2845 "sockaddr resolved to multiple addresses");
2846 goto fail;
2847 }
2848 switch (res->ai_family) {
2849 case AF_INET:
2850 {
2851 char *t1;
2852 int t2;
2853 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2854 PyErr_SetString(PySocket_Error,
2855 "IPv4 sockaddr must be 2 tuple");
2856 goto fail;
2857 }
2858 break;
2859 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002860#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002861 case AF_INET6:
2862 {
2863 struct sockaddr_in6 *sin6;
2864 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2865 sin6->sin6_flowinfo = flowinfo;
2866 sin6->sin6_scope_id = scope_id;
2867 break;
2868 }
2869#endif
2870 }
2871 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2872 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2873 if (error) {
2874 PyGAI_Err(error);
2875 goto fail;
2876 }
2877 ret = Py_BuildValue("ss", hbuf, pbuf);
2878
2879fail:
2880 if (res)
2881 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002882 return ret;
2883}
2884
2885static char getnameinfo_doc[] =
2886"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2887\n\
2888Get host and port for a sockaddr.";
2889
Guido van Rossum30a685f1991-06-27 15:51:29 +00002890/* List of functions exported by this module. */
2891
Guido van Rossum73624e91994-10-10 17:59:00 +00002892static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002893 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002894 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002895 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002896 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002897 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002898 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002899 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002900 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002901 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002902 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002903 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002904 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002905#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002906 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002907 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002908#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002909 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002910 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002911 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002912 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002913 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002914 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002915 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002916 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002917 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002918 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002919 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002920 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002921 {"getaddrinfo", PySocket_getaddrinfo,
2922 METH_VARARGS, getaddrinfo_doc},
2923 {"getnameinfo", PySocket_getnameinfo,
2924 METH_VARARGS, getnameinfo_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002925 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002926};
2927
Guido van Rossum30a685f1991-06-27 15:51:29 +00002928
Guido van Rossum8d665e61996-06-26 18:22:49 +00002929#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002930
2931/* Additional initialization and cleanup for NT/Windows */
2932
2933static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002934NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002935{
2936 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002937}
2938
2939static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002940NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002941{
2942 WSADATA WSAData;
2943 int ret;
2944 char buf[100];
2945 ret = WSAStartup(0x0101, &WSAData);
2946 switch (ret) {
2947 case 0: /* no error */
2948 atexit(NTcleanup);
2949 return 1;
2950 case WSASYSNOTREADY:
2951 PyErr_SetString(PyExc_ImportError,
2952 "WSAStartup failed: network not ready");
2953 break;
2954 case WSAVERNOTSUPPORTED:
2955 case WSAEINVAL:
2956 PyErr_SetString(PyExc_ImportError,
2957 "WSAStartup failed: requested version not supported");
2958 break;
2959 default:
Tim Peters885d4572001-11-28 20:27:42 +00002960 PyOS_snprintf(buf, sizeof(buf),
2961 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002962 PyErr_SetString(PyExc_ImportError, buf);
2963 break;
2964 }
2965 return 0;
2966}
2967
Guido van Rossum8d665e61996-06-26 18:22:49 +00002968#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002969
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002970#if defined(PYOS_OS2)
2971
2972/* Additional initialization and cleanup for OS/2 */
2973
2974static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002975OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002976{
2977 /* No cleanup is necessary for OS/2 Sockets */
2978}
2979
2980static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002981OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002982{
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002983#if !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002984 char reason[64];
2985 int rc = sock_init();
2986
2987 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002988 atexit(OS2cleanup);
2989 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002990 }
2991
Tim Peters75cdad52001-11-28 22:07:30 +00002992 PyOS_snprintf(reason, sizeof(reason),
2993 "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002994 PyErr_SetString(PyExc_ImportError, reason);
2995
Guido van Rossum32c575d1997-12-02 20:37:32 +00002996 return 0; /* Indicate Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002997#else
2998 /* no need to initialise sockets with GCC/EMX */
2999 return 1;
3000#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003001}
3002
3003#endif /* PYOS_OS2 */
3004
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003005/* C API table - always add new things to the end for binary
3006 compatibility. */
3007static
3008PySocketModule_APIObject PySocketModuleAPI =
3009{
3010 &PySocketSock_Type,
3011};
3012
Guido van Rossum30a685f1991-06-27 15:51:29 +00003013/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003014 * This is called when the first 'import socket' is done,
3015 * via a table in config.c, if config.c is compiled with USE_SOCKET
3016 * defined.
3017 *
3018 * For MS_WINDOWS (which means any Windows variant), this module
3019 * is actually called "_socket", and there's a wrapper "socket.py"
3020 * which implements some missing functionality (such as makefile(),
3021 * dup() and fromfd()). The import of "_socket" may fail with an
3022 * ImportError exception if initialization of WINSOCK fails. When
3023 * WINSOCK is initialized succesfully, a call to WSACleanup() is
3024 * scheduled to be made at exit time.
3025 *
3026 * For OS/2, this module is also called "_socket" and uses a wrapper
3027 * "socket.py" which implements that functionality that is missing
3028 * when PC operating systems don't put socket descriptors in the
3029 * operating system's filesystem layer.
3030 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003031
Guido van Rossum82a5c661998-07-07 20:45:43 +00003032static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00003033"Implementation module for socket operations. See the socket module\n\
3034for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00003035
Guido van Rossum3886bb61998-12-04 18:50:17 +00003036DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003037init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003038{
Fred Drake4baedc12002-04-01 14:53:37 +00003039 PyObject *m;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003040#ifdef RISCOS
3041 _kernel_swi_regs r;
3042 r.r[0]=0;
3043 _kernel_swi(0x43380, &r, &r);
3044 taskwindow = r.r[0];
3045#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00003046#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00003047 if (!NTinit())
3048 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00003049#else
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003050#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00003051 if (!OS2init())
3052 return;
Andrew MacIntyreba43e872002-03-03 03:03:52 +00003053#endif /* PYOS_OS2 */
Fred Drakea136d492000-08-16 14:18:30 +00003054#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00003055#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003056 PySocketSock_Type.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00003057 PySocketSock_Type.tp_getattro = PyObject_GenericGetAttr;
3058 PySocketSock_Type.tp_alloc = PyType_GenericAlloc;
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00003059 PySocketSock_Type.tp_free = PyObject_Del;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003060 m = Py_InitModule3(PySocket_MODULE_NAME,
3061 PySocket_methods,
3062 module_doc);
Fred Drake4baedc12002-04-01 14:53:37 +00003063
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003064 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
3065 if (PySocket_Error == NULL)
3066 return;
Fred Drake4baedc12002-04-01 14:53:37 +00003067 Py_INCREF(PySocket_Error);
3068 PyModule_AddObject(m, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003069 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
3070 if (PyH_Error == NULL)
3071 return;
Fred Drake4baedc12002-04-01 14:53:37 +00003072 Py_INCREF(PyH_Error);
3073 PyModule_AddObject(m, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003074 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
3075 NULL);
3076 if (PyGAI_Error == NULL)
3077 return;
Fred Drake4baedc12002-04-01 14:53:37 +00003078 Py_INCREF(PyGAI_Error);
3079 PyModule_AddObject(m, "gaierror", PyGAI_Error);
3080 Py_INCREF((PyObject *)&PySocketSock_Type);
3081 if (PyModule_AddObject(m, "SocketType",
3082 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00003083 return;
Fred Drake4baedc12002-04-01 14:53:37 +00003084 Py_INCREF((PyObject *)&PySocketSock_Type);
3085 if (PyModule_AddObject(m, "socket",
3086 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003087 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00003088
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003089 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00003090 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003091 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
3092 ) != 0)
3093 return;
3094
Guido van Rossum09be4091999-08-09 14:40:40 +00003095 /* Address families (we only support AF_INET and AF_UNIX) */
3096#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00003097 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00003098#endif
Fred Drake4baedc12002-04-01 14:53:37 +00003099 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003100#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003101 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003102#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00003103#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00003104 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003105#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003106#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003107 /* Amateur Radio AX.25 */
3108 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003109#endif
3110#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003111 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00003112#endif
3113#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00003114 /* Appletalk DDP */
3115 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003116#endif
3117#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003118 /* Amateur radio NetROM */
3119 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003120#endif
3121#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00003122 /* Multiprotocol bridge */
3123 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003124#endif
3125#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00003126 /* Reserved for Werner's ATM */
3127 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00003128#endif
3129#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00003130 /* Reserved for X.25 project */
3131 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003132#endif
3133#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00003134 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00003135#endif
3136#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003137 /* Amateur Radio X.25 PLP */
3138 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003139#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00003140#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00003141 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
3142 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
3143 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
3144 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
3145 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
3146 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
3147 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
3148 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
3149 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00003150#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003151
3152 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00003153 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
3154 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003155#ifndef __BEOS__
3156/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00003157 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
3158 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
3159 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00003160#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003161
3162#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00003163 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003164#endif
3165#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003166 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003167#endif
3168#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003169 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003170#endif
3171#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003172 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003173#endif
3174#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003175 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003176#endif
3177#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003178 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003179#endif
3180#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003181 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003182#endif
3183#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00003184 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003185#endif
3186#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00003187 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003188#endif
3189#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00003190 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003191#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003192#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003193 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003194#endif
3195#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00003196 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003197#endif
3198#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003199 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003200#endif
3201#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00003202 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003203#endif
3204#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003205 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003206#endif
3207#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00003208 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003209#endif
3210#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00003211 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003212#endif
3213#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003214 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003215#endif
3216
3217 /* Maximum number of connections for "listen" */
3218#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00003219 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003220#else
Fred Drake4baedc12002-04-01 14:53:37 +00003221 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003222#endif
3223
3224 /* Flags for send, recv */
3225#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00003226 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003227#endif
3228#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00003229 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003230#endif
3231#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00003232 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003233#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003234#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00003235 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00003236#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003237#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00003238 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003239#endif
3240#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003241 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003242#endif
3243#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00003244 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003245#endif
3246#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00003247 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003248#endif
3249#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00003250 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003251#endif
3252#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00003253 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003254#endif
3255
3256 /* Protocol level and numbers, usable for [gs]etsockopt */
3257#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00003258 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003259#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003260#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003261 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003262#else
Fred Drake4baedc12002-04-01 14:53:37 +00003263 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00003264#endif
3265#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00003266 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00003267#endif
3268#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00003269 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00003270#endif
3271#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00003272 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00003273#endif
3274#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00003275 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00003276#endif
3277#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00003278 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003279#endif
3280#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003281 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003282#else
Fred Drake4baedc12002-04-01 14:53:37 +00003283 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00003284#endif
3285#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003286 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003287#else
Fred Drake4baedc12002-04-01 14:53:37 +00003288 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00003289#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003290#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00003291 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00003292#else
Fred Drake4baedc12002-04-01 14:53:37 +00003293 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003294#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003295#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003296 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003297#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003298#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00003299 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00003300#else
Fred Drake4baedc12002-04-01 14:53:37 +00003301 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003302#endif
3303#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00003304 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003305#endif
3306#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00003307 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003308#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003309#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00003310 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003311#endif
3312#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00003313 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003314#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003315#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00003316 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00003317#else
Fred Drake4baedc12002-04-01 14:53:37 +00003318 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003319#endif
3320#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00003321 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003322#endif
3323#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00003324 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003325#endif
3326#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00003327 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00003328#else
Fred Drake4baedc12002-04-01 14:53:37 +00003329 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003330#endif
3331#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00003332 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003333#endif
3334#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00003335 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003336#endif
3337#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00003338 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003339#endif
3340#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00003341 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003342#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003343#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003344 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003345#endif
3346#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00003347 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003348#endif
3349#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00003350 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003351#endif
3352#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003353 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003354#endif
3355#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003356 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003357#endif
3358#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003359 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003360#endif
3361#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003362 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003363#endif
3364#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003365 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003366#endif
3367#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003368 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003369#endif
3370#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003371 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003372#endif
3373#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003374 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003375#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003376#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003377 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003378#endif
3379#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003380 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003381#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003382#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003383 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003384#endif
3385#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003386 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003387#endif
3388#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003389 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003390#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003391#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003392 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003393#endif
3394/**/
3395#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003396 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003397#else
Fred Drake4baedc12002-04-01 14:53:37 +00003398 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003399#endif
3400#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003401 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003402#endif
3403
3404 /* Some port configuration */
3405#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003406 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003407#else
Fred Drake4baedc12002-04-01 14:53:37 +00003408 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003409#endif
3410#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003411 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003412#else
Fred Drake4baedc12002-04-01 14:53:37 +00003413 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003414#endif
3415
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003416 /* Some reserved IP v.4 addresses */
3417#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003418 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003419#else
Fred Drake4baedc12002-04-01 14:53:37 +00003420 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003421#endif
3422#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003423 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003424#else
Fred Drake4baedc12002-04-01 14:53:37 +00003425 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003426#endif
3427#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003428 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003429#else
Fred Drake4baedc12002-04-01 14:53:37 +00003430 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003431#endif
3432#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003433 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003434#else
Fred Drake4baedc12002-04-01 14:53:37 +00003435 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003436#endif
3437#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003438 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3439 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003440#else
Fred Drake4baedc12002-04-01 14:53:37 +00003441 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003442#endif
3443#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003444 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3445 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003446#else
Fred Drake4baedc12002-04-01 14:53:37 +00003447 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003448#endif
3449#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003450 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003451#else
Fred Drake4baedc12002-04-01 14:53:37 +00003452 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003453#endif
3454
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003455 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003456#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003457 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003458#endif
3459#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003460 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003461#endif
3462#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003463 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003464#endif
3465#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003466 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003467#endif
3468#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003469 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003470#endif
3471#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003472 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003473#endif
3474#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003475 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003476#endif
3477#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003478 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003479#endif
3480#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003481 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003482#endif
3483#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003484 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003485#endif
3486#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003487 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003488#endif
3489#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003490 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003491#endif
3492#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003493 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003494#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003495#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003496 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3497 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003498#endif
3499#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003500 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3501 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003502#endif
3503#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003504 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003505#endif
3506
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003507 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3508#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003509 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003510#endif
3511#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003512 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003513#endif
3514#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003515 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003516#endif
3517#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003518 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003519#endif
3520#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003521 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003522#endif
3523#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003524 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003525#endif
3526
Guido van Rossum09be4091999-08-09 14:40:40 +00003527 /* TCP options */
3528#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003529 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003530#endif
3531#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003532 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003533#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003534#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003535 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003536#endif
3537#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003538 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003539#endif
3540#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003541 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003542#endif
3543#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003544 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003545#endif
3546#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003547 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003548#endif
3549#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003550 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003551#endif
3552#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003553 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003554#endif
3555#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003556 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003557#endif
3558#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003559 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003560#endif
3561#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003562 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003563#endif
3564
Guido van Rossum09be4091999-08-09 14:40:40 +00003565
3566 /* IPX options */
3567#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003568 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003569#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003570
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003571 /* get{addr,name}info parameters */
3572#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003573 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003574#endif
3575#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003576 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003577#endif
3578#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003579 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003580#endif
3581#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003582 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003583#endif
3584#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003585 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003586#endif
3587#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003588 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003589#endif
3590#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003591 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003592#endif
3593#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003594 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003595#endif
3596#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003597 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003598#endif
3599#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003600 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003601#endif
3602#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003603 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003604#endif
3605#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003606 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003607#endif
3608#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003609 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003610#endif
3611#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003612 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003613#endif
3614#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003615 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003616#endif
3617#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003618 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003619#endif
3620#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003621 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003622#endif
3623#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003624 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003625#endif
3626#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003627 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003628#endif
3629#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003630 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003631#endif
3632#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003633 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003634#endif
3635#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003636 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003637#endif
3638#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003639 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003640#endif
3641#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003642 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003643#endif
3644#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003645 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003646#endif
3647#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003648 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003649#endif
3650#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003651 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003652#endif
3653#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003654 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003655#endif
3656#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003657 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003658#endif
3659#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003660 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003661#endif
3662
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003663 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003664#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003665 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003666#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003667}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003668
3669/* Simplistic emulation code for inet_pton that only works for IPv4 */
3670#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003671int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003672inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003673{
3674 if(af == AF_INET){
3675 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003676 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003677 if (packed_addr == INADDR_NONE)
3678 return 0;
3679 memcpy(dst, &packed_addr, 4);
3680 return 1;
3681 }
3682 /* Should set errno to EAFNOSUPPORT */
3683 return -1;
3684}
3685
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003686const char *
3687inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003688{
3689 if (af == AF_INET) {
3690 struct in_addr packed_addr;
3691 if (size < 16)
3692 /* Should set errno to ENOSPC. */
3693 return NULL;
3694 memcpy(&packed_addr, src, sizeof(packed_addr));
3695 return strncpy(dst, inet_ntoa(packed_addr), size);
3696 }
3697 /* Should set errno to EAFNOSUPPORT */
3698 return NULL;
3699}
3700#endif