blob: 1874541bb1cc6b92bef457a04f772bfd6f21c687 [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
69- s.setsockopt(level, optname, value) --> None
70- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000071- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000072
Guido van Rossum6574b3e1991-06-25 21:36:08 +000073*/
74
Guido van Rossum73624e91994-10-10 17:59:00 +000075#include "Python.h"
Guido van Rossum3baaa131999-03-22 21:44:51 +000076
Guido van Rossum384ca9c2001-10-27 22:20:47 +000077/* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
78 I hope some day someone can clean this up please... */
79
Guido van Rossum9376b741999-09-15 22:01:40 +000080/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
81 script doesn't get this right, so we hardcode some platform checks below.
82 On the other hand, not all Linux versions agree, so there the settings
83 computed by the configure script are needed! */
84
85#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000086# undef HAVE_GETHOSTBYNAME_R_3_ARG
87# undef HAVE_GETHOSTBYNAME_R_5_ARG
88# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +000089#endif
Guido van Rossume7de2061999-03-24 17:24:33 +000090
Guido van Rossum7a122991999-04-13 04:07:32 +000091#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000092# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +000093#endif
94
Guido van Rossume7de2061999-03-24 17:24:33 +000095#ifdef HAVE_GETHOSTBYNAME_R
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000096# if defined(_AIX) || defined(__osf__)
97# define HAVE_GETHOSTBYNAME_R_3_ARG
98# elif defined(__sun) || defined(__sgi)
99# define HAVE_GETHOSTBYNAME_R_5_ARG
100# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000101/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000102# else
103# undef HAVE_GETHOSTBYNAME_R
104# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000105#endif
106
Guido van Rossum3baaa131999-03-22 21:44:51 +0000107#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000108# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000109#endif
110
111#ifdef USE_GETHOSTBYNAME_LOCK
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000112# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000113#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000114
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000115#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000116# include <types.h>
117# include <io.h>
118# include <sys/ioctl.h>
119# include <utils.h>
120# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000121#endif
122
123#if defined(PYOS_OS2)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000124# define INCL_DOS
125# define INCL_DOSERRORS
126# define INCL_NOPMAPI
127# include <os2.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000128#endif
129
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000130/* Generic includes */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131#include <sys/types.h>
Guido van Rossum81194471991-07-27 21:42:02 +0000132#include <signal.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000133
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000134/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000135#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000136#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000137
138/* Addressing includes */
139
Guido van Rossum6f489d91996-06-28 20:15:15 +0000140#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000141
142/* Non-MS WINDOWS includes */
143# include <netdb.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000144
Guido van Rossum9376b741999-09-15 22:01:40 +0000145/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000146# ifdef __BEOS__
147# include <net/netdb.h>
148# elif defined(PYOS_OS2) && defined(PYCC_VACPP)
149# include <netdb.h>
Tim Peters603c6832001-11-05 02:45:59 +0000150typedef size_t socklen_t;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000151# else
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152# include <arpa/inet.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000153# endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000154
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000155# ifndef RISCOS
156# include <fcntl.h>
157# else
158# include <sys/fcntl.h>
159# define NO_DUP
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000160int h_errno; /* not used */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161# endif
162
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000163#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000164
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000165/* MS_WINDOWS includes */
166# include <fcntl.h>
Guido van Rossum48a680c2001-03-02 06:34:14 +0000167
Jeremy Hylton22308652001-02-02 03:23:09 +0000168#endif
169
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000170#ifdef HAVE_STDDEF_H
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171# include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000172#endif
173
174#ifndef offsetof
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000175# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000176#endif
177
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000178#ifndef O_NDELAY
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# define O_NDELAY O_NONBLOCK /* For QNX only? */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000180#endif
181
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000182#include "addrinfo.h"
183
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000184#ifndef HAVE_INET_PTON
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000185int inet_pton (int af, const char *src, void *dst);
186const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000187#endif
188
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000189#ifdef __APPLE__
190/* On OS X, getaddrinfo returns no error indication of lookup
191 failure, so we must use the emulation instead of the libinfo
192 implementation. Unfortunately, performing an autoconf test
193 for this bug would require DNS access for the machine performing
194 the configuration, which is not acceptable. Therefore, we
195 determine the bug just by checking for __APPLE__. If this bug
196 gets ever fixed, perhaps checking for sys/version.h would be
197 appropriate, which is 10/0 on the system with the bug. */
198#undef HAVE_GETADDRINFO
199/* avoid clashes with the C library definition of the symbol. */
200#define getaddrinfo fake_getaddrinfo
201#endif
202
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000203/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000204#if !defined(HAVE_GETADDRINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000205#include "getaddrinfo.c"
206#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000207#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000208#include "getnameinfo.c"
209#endif
210
Guido van Rossumbcc20741998-08-04 22:53:56 +0000211#if defined(MS_WINDOWS) || defined(__BEOS__)
212/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000213/* seem to be a few differences in the API */
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000214#define SOCKETCLOSE closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000215#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000216#endif
217
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000218#ifdef MS_WIN32
219# define EAFNOSUPPORT WSAEAFNOSUPPORT
220# define snprintf _snprintf
221#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000222
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000223#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000224#define SOCKETCLOSE soclose
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000225#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000226#endif
227
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000228#ifndef SOCKETCLOSE
229#define SOCKETCLOSE close
230#endif
231
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000232/* XXX There's a problem here: *static* functions are not supposed to have
233 a Py prefix (or use CapitalizedWords). Later... */
234
Guido van Rossum30a685f1991-06-27 15:51:29 +0000235/* Global variable holding the exception type for errors detected
236 by this module (but not argument type or memory errors, etc.). */
237
Guido van Rossum73624e91994-10-10 17:59:00 +0000238static PyObject *PySocket_Error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000239static PyObject *PyH_Error;
240static PyObject *PyGAI_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000241
Guido van Rossum48a680c2001-03-02 06:34:14 +0000242#ifdef RISCOS
243/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */
244static int taskwindow;
245#endif
246
Tim Peters643a7fc2002-02-17 04:13:21 +0000247/* A forward reference to the socket type object.
248 The PySocketSock_Type variable contains pointers to various functions,
249 some of which call PySocketSock_New(), which uses PySocketSock_Type, so
250 there has to be a circular reference. */
251staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000252
Guido van Rossum30a685f1991-06-27 15:51:29 +0000253/* Convenience function to raise an error according to errno
254 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000255
Guido van Rossum73624e91994-10-10 17:59:00 +0000256static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000257PySocket_Err(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000258{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000259#ifdef MS_WINDOWS
Mark Hammond46a733d2000-07-24 01:45:11 +0000260 int err_no = WSAGetLastError();
261 if (err_no) {
262 static struct { int no; const char *msg; } *msgp, msgs[] = {
263 { WSAEINTR, "Interrupted system call" },
264 { WSAEBADF, "Bad file descriptor" },
265 { WSAEACCES, "Permission denied" },
266 { WSAEFAULT, "Bad address" },
267 { WSAEINVAL, "Invalid argument" },
268 { WSAEMFILE, "Too many open files" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000269 { WSAEWOULDBLOCK,
Mark Hammond46a733d2000-07-24 01:45:11 +0000270 "The socket operation could not complete "
271 "without blocking" },
272 { WSAEINPROGRESS, "Operation now in progress" },
273 { WSAEALREADY, "Operation already in progress" },
274 { WSAENOTSOCK, "Socket operation on non-socket" },
275 { WSAEDESTADDRREQ, "Destination address required" },
276 { WSAEMSGSIZE, "Message too long" },
277 { WSAEPROTOTYPE, "Protocol wrong type for socket" },
278 { WSAENOPROTOOPT, "Protocol not available" },
279 { WSAEPROTONOSUPPORT, "Protocol not supported" },
280 { WSAESOCKTNOSUPPORT, "Socket type not supported" },
281 { WSAEOPNOTSUPP, "Operation not supported" },
282 { WSAEPFNOSUPPORT, "Protocol family not supported" },
283 { WSAEAFNOSUPPORT, "Address family not supported" },
284 { WSAEADDRINUSE, "Address already in use" },
285 { WSAEADDRNOTAVAIL,
286 "Can't assign requested address" },
287 { WSAENETDOWN, "Network is down" },
288 { WSAENETUNREACH, "Network is unreachable" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000289 { WSAENETRESET,
Mark Hammond46a733d2000-07-24 01:45:11 +0000290 "Network dropped connection on reset" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000291 { WSAECONNABORTED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000292 "Software caused connection abort" },
293 { WSAECONNRESET, "Connection reset by peer" },
294 { WSAENOBUFS, "No buffer space available" },
295 { WSAEISCONN, "Socket is already connected" },
296 { WSAENOTCONN, "Socket is not connected" },
297 { WSAESHUTDOWN, "Can't send after socket shutdown" },
298 { WSAETOOMANYREFS,
299 "Too many references: can't splice" },
300 { WSAETIMEDOUT, "Operation timed out" },
301 { WSAECONNREFUSED, "Connection refused" },
302 { WSAELOOP, "Too many levels of symbolic links" },
303 { WSAENAMETOOLONG, "File name too long" },
304 { WSAEHOSTDOWN, "Host is down" },
305 { WSAEHOSTUNREACH, "No route to host" },
306 { WSAENOTEMPTY, "Directory not empty" },
307 { WSAEPROCLIM, "Too many processes" },
308 { WSAEUSERS, "Too many users" },
309 { WSAEDQUOT, "Disc quota exceeded" },
310 { WSAESTALE, "Stale NFS file handle" },
311 { WSAEREMOTE, "Too many levels of remote in path" },
312 { WSASYSNOTREADY,
313 "Network subsystem is unvailable" },
314 { WSAVERNOTSUPPORTED,
315 "WinSock version is not supported" },
Guido van Rossum48a680c2001-03-02 06:34:14 +0000316 { WSANOTINITIALISED,
Mark Hammond46a733d2000-07-24 01:45:11 +0000317 "Successful WSAStartup() not yet performed" },
318 { WSAEDISCON, "Graceful shutdown in progress" },
319 /* Resolver errors */
320 { WSAHOST_NOT_FOUND, "No such host is known" },
321 { WSATRY_AGAIN, "Host not found, or server failed" },
322 { WSANO_RECOVERY,
323 "Unexpected server error encountered" },
324 { WSANO_DATA, "Valid name without requested data" },
325 { WSANO_ADDRESS, "No address, look for MX record" },
326 { 0, NULL }
327 };
Guido van Rossum73624e91994-10-10 17:59:00 +0000328 PyObject *v;
Mark Hammond46a733d2000-07-24 01:45:11 +0000329 const char *msg = "winsock error";
Guido van Rossum48a680c2001-03-02 06:34:14 +0000330
Mark Hammond46a733d2000-07-24 01:45:11 +0000331 for (msgp = msgs; msgp->msg; msgp++) {
332 if (err_no == msgp->no) {
333 msg = msgp->msg;
334 break;
335 }
336 }
337
338 v = Py_BuildValue("(is)", err_no, msg);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000339 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000340 PyErr_SetObject(PySocket_Error, v);
341 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000342 }
343 return NULL;
344 }
345 else
346#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000347
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000348#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000349 if (sock_errno() != NO_ERROR) {
350 APIRET rc;
351 ULONG msglen;
352 char outbuf[100];
353 int myerrorcode = sock_errno();
354
355 /* Retrieve Socket-Related Error Message from MPTN.MSG File */
356 rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),
357 myerrorcode - SOCBASEERR + 26, "mptn.msg", &msglen);
358 if (rc == NO_ERROR) {
359 PyObject *v;
360
361 outbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
362 if (strlen(outbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
363 char *lastc = &outbuf[ strlen(outbuf)-1 ];
364 while (lastc > outbuf && isspace(*lastc))
365 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
366 }
367 v = Py_BuildValue("(is)", myerrorcode, outbuf);
368 if (v != NULL) {
369 PyErr_SetObject(PySocket_Error, v);
370 Py_DECREF(v);
371 }
372 return NULL;
373 }
374 }
375#endif
376
Guido van Rossum73624e91994-10-10 17:59:00 +0000377 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000378}
379
Guido van Rossum30a685f1991-06-27 15:51:29 +0000380
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000381static PyObject *
382PyH_Err(int h_error)
383{
384 PyObject *v;
385
386#ifdef HAVE_HSTRERROR
387 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
388#else
389 v = Py_BuildValue("(is)", h_error, "host not found");
390#endif
391 if (v != NULL) {
Martin v. Löwis864e9ff2001-08-04 22:32:03 +0000392 PyErr_SetObject(PyH_Error, v);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000393 Py_DECREF(v);
394 }
395
396 return NULL;
397}
398
399
400static PyObject *
401PyGAI_Err(int error)
402{
403 PyObject *v;
404
Martin v. Löwis272cb402002-03-01 08:31:07 +0000405#ifdef EAI_SYSTEM
406 /* EAI_SYSTEM is not available on Windows XP. */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000407 if (error == EAI_SYSTEM)
408 return PySocket_Err();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000409#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000410
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000411#ifdef HAVE_GAI_STRERROR
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000412 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000413#else
414 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
415#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000416 if (v != NULL) {
417 PyErr_SetObject(PyGAI_Error, v);
418 Py_DECREF(v);
419 }
420
421 return NULL;
422}
423
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000424/* Initialize a new socket object. */
425
426static void
427init_sockobject(PySocketSockObject *s,
428 SOCKET_T fd, int family, int type, int proto)
429{
430#ifdef RISCOS
431 int block = 1;
432#endif
433 s->sock_fd = fd;
434 s->sock_family = family;
435 s->sock_type = type;
436 s->sock_proto = proto;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000437 s->errorhandler = &PySocket_Err;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000438#ifdef RISCOS
439 if(taskwindow) {
440 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
441 }
442#endif
443}
444
445
Guido van Rossum30a685f1991-06-27 15:51:29 +0000446/* Create a new socket object.
447 This just creates the object and initializes it.
448 If the creation fails, return NULL and set an exception (implicit
449 in NEWOBJ()). */
450
Guido van Rossum73624e91994-10-10 17:59:00 +0000451static PySocketSockObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000452PySocketSock_New(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000453{
Guido van Rossum73624e91994-10-10 17:59:00 +0000454 PySocketSockObject *s;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000455 s = (PySocketSockObject *)
456 PyType_GenericNew(&PySocketSock_Type, NULL, NULL);
457 if (s != NULL)
458 init_sockobject(s, fd, family, type, proto);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000459 return s;
460}
461
Guido van Rossum30a685f1991-06-27 15:51:29 +0000462
Guido van Rossum48a680c2001-03-02 06:34:14 +0000463/* Lock to allow python interpreter to continue, but only allow one
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000464 thread to be in gethostbyname */
Guido van Rossum3baaa131999-03-22 21:44:51 +0000465#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +0000466PyThread_type_lock gethostbyname_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000467#endif
468
469
Guido van Rossum30a685f1991-06-27 15:51:29 +0000470/* Convert a string specifying a host name or one of a few symbolic
471 names to a numeric IP address. This usually calls gethostbyname()
472 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000473 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000474 an error occurred; then an exception is raised. */
475
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000476static int
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000477setipaddr(char* name, struct sockaddr * addr_ret, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000478{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000479 struct addrinfo hints, *res;
480 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000481
Guido van Rossuma376cc51996-12-05 23:43:35 +0000482 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000483 if (name[0] == '\0') {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000484 int siz;
485 memset(&hints, 0, sizeof(hints));
486 hints.ai_family = af;
487 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
488 hints.ai_flags = AI_PASSIVE;
489 error = getaddrinfo(NULL, "0", &hints, &res);
490 if (error) {
491 PyGAI_Err(error);
492 return -1;
493 }
494 switch (res->ai_family) {
495 case AF_INET:
496 siz = 4;
497 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000498#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000499 case AF_INET6:
500 siz = 16;
501 break;
502#endif
503 default:
504 freeaddrinfo(res);
505 PyErr_SetString(PySocket_Error,
506 "unsupported address family");
507 return -1;
508 }
509 if (res->ai_next) {
Martin v. Löwisf0b11d22001-11-07 08:31:03 +0000510 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000511 PyErr_SetString(PySocket_Error,
512 "wildcard resolved to multiple address");
513 return -1;
514 }
515 memcpy(addr_ret, res->ai_addr, res->ai_addrlen);
516 freeaddrinfo(res);
517 return siz;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000519 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000520 struct sockaddr_in *sin;
521 if (af != PF_INET && af != PF_UNSPEC) {
522 PyErr_SetString(PySocket_Error,
523 "address family mismatched");
524 return -1;
525 }
526 sin = (struct sockaddr_in *)addr_ret;
527 memset((void *) sin, '\0', sizeof(*sin));
528 sin->sin_family = AF_INET;
529#ifdef HAVE_SOCKADDR_SA_LEN
530 sin->sin_len = sizeof(*sin);
531#endif
532 sin->sin_addr.s_addr = INADDR_BROADCAST;
533 return sizeof(sin->sin_addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000534 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000535 memset(&hints, 0, sizeof(hints));
536 hints.ai_family = af;
537 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000538#if defined(__digital__) && defined(__unix__)
Martin v. Löwisb8fc9722001-10-24 17:35:46 +0000539 if (error == EAI_NONAME && af == AF_UNSPEC) {
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000540 /* On Tru64 V5.1, numeric-to-addr conversion
Martin v. Löwis861a65b2001-10-24 14:36:00 +0000541 fails if no address family is given. Assume IPv4 for now.*/
542 hints.ai_family = AF_INET;
543 error = getaddrinfo(name, NULL, &hints, &res);
544 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000545#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000546 if (error) {
547 PyGAI_Err(error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000548 return -1;
549 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550 memcpy((char *) addr_ret, res->ai_addr, res->ai_addrlen);
551 freeaddrinfo(res);
552 switch (addr_ret->sa_family) {
553 case AF_INET:
554 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000555#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556 case AF_INET6:
557 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000558#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559 default:
560 PyErr_SetString(PySocket_Error, "unknown address family");
561 return -1;
562 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563}
564
Guido van Rossum30a685f1991-06-27 15:51:29 +0000565
Guido van Rossum30a685f1991-06-27 15:51:29 +0000566/* Create a string object representing an IP address.
567 This is always a string of the form 'dd.dd.dd.dd' (with variable
568 size numbers). */
569
Guido van Rossum73624e91994-10-10 17:59:00 +0000570static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000571makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000572{
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000573 char buf[NI_MAXHOST];
574 int error;
575
576 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
577 NI_NUMERICHOST);
578 if (error) {
579 PyGAI_Err(error);
580 return NULL;
581 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000582 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000583}
584
585
586/* Create an object representing the given socket address,
587 suitable for passing it back to bind(), connect() etc.
588 The family field of the sockaddr structure is inspected
589 to determine what kind of address it really is. */
590
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000591/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000592static PyObject *
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000593makesockaddr(int sockfd, struct sockaddr *addr, int addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000594{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000595 if (addrlen == 0) {
596 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000597 Py_INCREF(Py_None);
598 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000599 }
600
Guido van Rossumbcc20741998-08-04 22:53:56 +0000601#ifdef __BEOS__
Guido van Rossum2c8bcb82000-04-25 21:34:53 +0000602 /* XXX: BeOS version of accept() doesn't set family correctly */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000603 addr->sa_family = AF_INET;
604#endif
605
Guido van Rossum30a685f1991-06-27 15:51:29 +0000606 switch (addr->sa_family) {
607
608 case AF_INET:
609 {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000610 struct sockaddr_in *a;
611 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
Barry Warsaw752300b1997-01-03 17:18:10 +0000612 PyObject *ret = NULL;
613 if (addrobj) {
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000614 a = (struct sockaddr_in *)addr;
Barry Warsaw752300b1997-01-03 17:18:10 +0000615 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
616 Py_DECREF(addrobj);
617 }
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000618 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000619 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000620
Guido van Rossumb6775db1994-08-01 11:34:53 +0000621#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000622 case AF_UNIX:
623 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000625 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000627#endif /* AF_UNIX */
628
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000629#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000630 case AF_INET6:
631 {
632 struct sockaddr_in6 *a;
633 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
634 PyObject *ret = NULL;
635 if (addrobj) {
636 a = (struct sockaddr_in6 *)addr;
637 ret = Py_BuildValue("Oiii", addrobj, ntohs(a->sin6_port),
638 a->sin6_flowinfo, a->sin6_scope_id);
639 Py_DECREF(addrobj);
640 }
641 return ret;
642 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000643#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +0000644
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000645#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000646 case AF_PACKET:
647 {
648 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
649 char *ifname = "";
650 struct ifreq ifr;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000651 /* need to look up interface name give index */
652 if (a->sll_ifindex) {
Jeremy Hylton22308652001-02-02 03:23:09 +0000653 ifr.ifr_ifindex = a->sll_ifindex;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000654 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
Jeremy Hylton22308652001-02-02 03:23:09 +0000655 ifname = ifr.ifr_name;
Jeremy Hylton22308652001-02-02 03:23:09 +0000656 }
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000657 return Py_BuildValue("shbhs#", ifname, ntohs(a->sll_protocol),
Guido van Rossum48a680c2001-03-02 06:34:14 +0000658 a->sll_pkttype, a->sll_hatype,
659 a->sll_addr, a->sll_halen);
Jeremy Hylton22308652001-02-02 03:23:09 +0000660 }
661#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000662
Guido van Rossum30a685f1991-06-27 15:51:29 +0000663 /* More cases here... */
664
665 default:
Guido van Rossumaa948df1997-05-07 17:41:48 +0000666 /* If we don't know the address family, don't raise an
667 exception -- return it as a tuple. */
668 return Py_BuildValue("is#",
669 addr->sa_family,
670 addr->sa_data,
671 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000672
Guido van Rossum30a685f1991-06-27 15:51:29 +0000673 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000674}
675
Guido van Rossum30a685f1991-06-27 15:51:29 +0000676
677/* Parse a socket address argument according to the socket object's
678 address family. Return 1 if the address was in the proper format,
679 0 of not. The address is returned through addr_ret, its length
680 through len_ret. */
681
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000682static int
Guido van Rossum48a680c2001-03-02 06:34:14 +0000683getsockaddrarg(PySocketSockObject *s, PyObject *args,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000684 struct sockaddr **addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000685{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000686 switch (s->sock_family) {
687
Guido van Rossumb6775db1994-08-01 11:34:53 +0000688#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000689 case AF_UNIX:
690 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000691 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000692 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000693 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000694 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum7e488981998-10-08 02:25:24 +0000695 if (!PyArg_Parse(args, "t#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000696 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000697 if (len > sizeof addr->sun_path) {
Barry Warsaw752300b1997-01-03 17:18:10 +0000698 PyErr_SetString(PySocket_Error,
699 "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000700 return 0;
701 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000702 addr->sun_family = s->sock_family;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000703 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000704 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000705 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000706 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000707 return 1;
708 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000709#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000710
Guido van Rossum30a685f1991-06-27 15:51:29 +0000711 case AF_INET:
712 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000713 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000714 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000715 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000716 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossume4dad902000-12-01 13:13:11 +0000717 if (!PyTuple_Check(args)) {
718 PyErr_Format(PyExc_TypeError,
719 "getsockaddrarg: AF_INET address must be tuple, not %.500s",
720 args->ob_type->tp_name);
721 return 0;
722 }
723 if (!PyArg_ParseTuple(args, "si:getsockaddrarg", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000724 return 0;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000725 if (setipaddr(host, (struct sockaddr *)addr, AF_INET) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000726 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000727 addr->sin_family = AF_INET;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000728 addr->sin_port = htons((short)port);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000729 *addr_ret = (struct sockaddr *) addr;
730 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731 return 1;
732 }
733
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000734#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000735 case AF_INET6:
736 {
737 struct sockaddr_in6* addr;
738 char *host;
739 int port, flowinfo, scope_id;
740 addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
741 flowinfo = scope_id = 0;
742 if (!PyArg_ParseTuple(args, "si|ii", &host, &port, &flowinfo,
743 &scope_id)) {
744 return 0;
745 }
746 if (setipaddr(host, (struct sockaddr *)addr, AF_INET6) < 0)
747 return 0;
748 addr->sin6_family = s->sock_family;
749 addr->sin6_port = htons((short)port);
750 addr->sin6_flowinfo = flowinfo;
751 addr->sin6_scope_id = scope_id;
752 *addr_ret = (struct sockaddr *) addr;
753 *len_ret = sizeof *addr;
754 return 1;
755 }
756#endif
757
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000758#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000759 case AF_PACKET:
760 {
761 struct sockaddr_ll* addr;
762 struct ifreq ifr;
763 char *interfaceName;
764 int protoNumber;
765 int hatype = 0;
766 int pkttype = 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000767 char *haddr;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000768
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000769 if (!PyArg_ParseTuple(args, "si|iis", &interfaceName,
770 &protoNumber, &pkttype, &hatype, &haddr))
Jeremy Hylton22308652001-02-02 03:23:09 +0000771 return 0;
772 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
773 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000774 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000775 s->errorhandler();
Jeremy Hylton22308652001-02-02 03:23:09 +0000776 return 0;
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000777 }
Jeremy Hylton22308652001-02-02 03:23:09 +0000778 addr = &(s->sock_addr.ll);
779 addr->sll_family = AF_PACKET;
780 addr->sll_protocol = htons((short)protoNumber);
781 addr->sll_ifindex = ifr.ifr_ifindex;
782 addr->sll_pkttype = pkttype;
783 addr->sll_hatype = hatype;
784 *addr_ret = (struct sockaddr *) addr;
785 *len_ret = sizeof *addr;
786 return 1;
787 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000788#endif
789
Guido van Rossum30a685f1991-06-27 15:51:29 +0000790 /* More cases here... */
791
792 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000793 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000794 return 0;
795
796 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000797}
798
Guido van Rossum30a685f1991-06-27 15:51:29 +0000799
Guido van Rossum48a680c2001-03-02 06:34:14 +0000800/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +0000801 Return 1 if the family is known, 0 otherwise. The length is returned
802 through len_ret. */
803
804static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +0000805getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000806{
807 switch (s->sock_family) {
808
Guido van Rossumb6775db1994-08-01 11:34:53 +0000809#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000810 case AF_UNIX:
811 {
812 *len_ret = sizeof (struct sockaddr_un);
813 return 1;
814 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000815#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000816
817 case AF_INET:
818 {
819 *len_ret = sizeof (struct sockaddr_in);
820 return 1;
821 }
822
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000823#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000824 case AF_INET6:
825 {
826 *len_ret = sizeof (struct sockaddr_in6);
827 return 1;
828 }
829#endif
830
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +0000831#ifdef HAVE_NETPACKET_PACKET_H
Jeremy Hylton22308652001-02-02 03:23:09 +0000832 case AF_PACKET:
833 {
834 *len_ret = sizeof (struct sockaddr_ll);
835 return 1;
836 }
837#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000838
Guido van Rossum710e1df1992-06-12 10:39:36 +0000839 /* More cases here... */
840
841 default:
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000842 PyErr_SetString(PySocket_Error, "getsockaddrlen: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000843 return 0;
844
845 }
846}
847
848
Guido van Rossum30a685f1991-06-27 15:51:29 +0000849/* s.accept() method */
850
Guido van Rossum73624e91994-10-10 17:59:00 +0000851static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000852PySocketSock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853{
854 char addrbuf[256];
Fred Drakea04eaad2000-06-30 02:46:07 +0000855 SOCKET_T newfd;
Guido van Rossumff3ab422000-04-24 15:16:03 +0000856 socklen_t addrlen;
Barry Warsaw752300b1997-01-03 17:18:10 +0000857 PyObject *sock = NULL;
858 PyObject *addr = NULL;
859 PyObject *res = NULL;
860
Guido van Rossum710e1df1992-06-12 10:39:36 +0000861 if (!getsockaddrlen(s, &addrlen))
862 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +0000863 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000864 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000865 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000866 Py_END_ALLOW_THREADS
Fred Drakea04eaad2000-06-30 02:46:07 +0000867#ifdef MS_WINDOWS
868 if (newfd == INVALID_SOCKET)
869#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000870 if (newfd < 0)
Fred Drakea04eaad2000-06-30 02:46:07 +0000871#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000872 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +0000873
Guido van Rossum30a685f1991-06-27 15:51:29 +0000874 /* Create the new object with unspecified family,
875 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000876 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000877 s->sock_family,
878 s->sock_type,
879 s->sock_proto);
Barry Warsaw752300b1997-01-03 17:18:10 +0000880 if (sock == NULL) {
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000881 SOCKETCLOSE(newfd);
Barry Warsaw752300b1997-01-03 17:18:10 +0000882 goto finally;
883 }
Guido van Rossum48a680c2001-03-02 06:34:14 +0000884 addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf,
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000885 addrlen);
886 if (addr == NULL)
Barry Warsaw752300b1997-01-03 17:18:10 +0000887 goto finally;
888
Jeremy Hyltondbfb6622001-02-02 19:55:17 +0000889 res = Py_BuildValue("OO", sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +0000890
891 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +0000892 Py_XDECREF(sock);
893 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000894 return res;
895}
896
Guido van Rossum82a5c661998-07-07 20:45:43 +0000897static char accept_doc[] =
898"accept() -> (socket object, address info)\n\
899\n\
900Wait for an incoming connection. Return a new socket representing the\n\
901connection, and the address of the client. For IP sockets, the address\n\
902info is a pair (hostaddr, port).";
903
Guido van Rossum30a685f1991-06-27 15:51:29 +0000904
Guido van Rossume4485b01994-09-07 14:32:49 +0000905/* s.setblocking(1 | 0) method */
906
Guido van Rossum73624e91994-10-10 17:59:00 +0000907static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000908PySocketSock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +0000909{
910 int block;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000911#ifndef RISCOS
Guido van Rossum644a12b1997-04-09 19:24:53 +0000912#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000913 int delay_flag;
Guido van Rossum644a12b1997-04-09 19:24:53 +0000914#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000915#endif
Jeremy Hyltonae0013d2001-10-11 16:36:35 +0000916 block = PyInt_AsLong(arg);
917 if (block == -1 && PyErr_Occurred())
Guido van Rossume4485b01994-09-07 14:32:49 +0000918 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000919 Py_BEGIN_ALLOW_THREADS
Guido van Rossumbcc20741998-08-04 22:53:56 +0000920#ifdef __BEOS__
921 block = !block;
922 setsockopt( s->sock_fd, SOL_SOCKET, SO_NONBLOCK,
923 (void *)(&block), sizeof( int ) );
924#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000925#ifndef RISCOS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000926#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +0000927#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000928 block = !block;
929 ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));
930#else /* !PYOS_OS2 */
Guido van Rossume4485b01994-09-07 14:32:49 +0000931 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
932 if (block)
933 delay_flag &= (~O_NDELAY);
934 else
935 delay_flag |= O_NDELAY;
936 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000937#endif /* !PYOS_OS2 */
938#else /* MS_WINDOWS */
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000939 block = !block;
940 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000941#endif /* MS_WINDOWS */
Guido van Rossumbcc20741998-08-04 22:53:56 +0000942#endif /* __BEOS__ */
Guido van Rossum48a680c2001-03-02 06:34:14 +0000943#endif /* RISCOS */
Guido van Rossum73624e91994-10-10 17:59:00 +0000944 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000945
Guido van Rossum73624e91994-10-10 17:59:00 +0000946 Py_INCREF(Py_None);
947 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000948}
Guido van Rossume4485b01994-09-07 14:32:49 +0000949
Guido van Rossum82a5c661998-07-07 20:45:43 +0000950static char setblocking_doc[] =
951"setblocking(flag)\n\
952\n\
953Set the socket to blocking (flag is true) or non-blocking (false).\n\
954This uses the FIONBIO ioctl with the O_NDELAY flag.";
955
Guido van Rossume4485b01994-09-07 14:32:49 +0000956
Guido van Rossum48a680c2001-03-02 06:34:14 +0000957#ifdef RISCOS
958/* s.sleeptaskw(1 | 0) method */
959
960static PyObject *
961PySocketSock_sleeptaskw(PySocketSockObject *s,PyObject *args)
962{
963 int block;
964 int delay_flag;
Neal Norwitz7e78acb2002-03-25 22:23:53 +0000965 if (!PyArg_Parse(args, "i", &block))
Guido van Rossum48a680c2001-03-02 06:34:14 +0000966 return NULL;
967 Py_BEGIN_ALLOW_THREADS
968 socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);
969 Py_END_ALLOW_THREADS
970
971 Py_INCREF(Py_None);
972 return Py_None;
973}
974static char sleeptaskw_doc[] =
975"sleeptaskw(flag)\n\
976\n\
977Allow sleeps in taskwindows.";
978#endif
979
980
Guido van Rossumaee08791992-09-08 09:05:33 +0000981/* s.setsockopt() method.
982 With an integer third argument, sets an integer option.
983 With a string third argument, sets an option from a buffer;
984 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000985
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +0000987PySocketSock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000988{
989 int level;
990 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000991 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000992 char *buf;
993 int buflen;
994 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000995
Guido van Rossum27fc3c02000-03-24 20:56:56 +0000996 if (PyArg_ParseTuple(args, "iii:setsockopt",
997 &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000998 buf = (char *) &flag;
999 buflen = sizeof flag;
1000 }
1001 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001002 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001003 if (!PyArg_ParseTuple(args, "iis#:setsockopt",
1004 &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +00001005 return NULL;
1006 }
Thomas Wouters334fb892000-07-25 12:56:38 +00001007 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001008 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001009 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001010 Py_INCREF(Py_None);
1011 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001012}
1013
Guido van Rossum82a5c661998-07-07 20:45:43 +00001014static char setsockopt_doc[] =
1015"setsockopt(level, option, value)\n\
1016\n\
1017Set a socket option. See the Unix manual for level and option.\n\
1018The value argument can either be an integer or a string.";
1019
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001020
Guido van Rossumaee08791992-09-08 09:05:33 +00001021/* s.getsockopt() method.
1022 With two arguments, retrieves an integer option.
1023 With a third integer argument, retrieves a string buffer of that size;
1024 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001025
Guido van Rossum73624e91994-10-10 17:59:00 +00001026static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001027PySocketSock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001028{
1029 int level;
1030 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001031 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001032 PyObject *buf;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001033 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001034
Guido van Rossumbcc20741998-08-04 22:53:56 +00001035#ifdef __BEOS__
Fred Drake564a6cc2001-05-11 20:12:26 +00001036 /* We have incomplete socket support. */
1037 PyErr_SetString(PySocket_Error, "getsockopt not supported");
Guido van Rossumbcc20741998-08-04 22:53:56 +00001038 return NULL;
1039#else
1040
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001041 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
1042 &level, &optname, &buflen))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001043 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001044
Guido van Rossumbe32c891996-06-20 16:25:29 +00001045 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +00001046 int flag = 0;
Guido van Rossumff3ab422000-04-24 15:16:03 +00001047 socklen_t flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001048 res = getsockopt(s->sock_fd, level, optname,
Thomas Wouters334fb892000-07-25 12:56:38 +00001049 (void *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +00001050 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001051 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001052 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +00001053 }
Guido van Rossumaee08791992-09-08 09:05:33 +00001054 if (buflen <= 0 || buflen > 1024) {
Barry Warsaw752300b1997-01-03 17:18:10 +00001055 PyErr_SetString(PySocket_Error,
1056 "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +00001057 return NULL;
1058 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001059 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001060 if (buf == NULL)
1061 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +00001062 res = getsockopt(s->sock_fd, level, optname,
Fred Drake564a6cc2001-05-11 20:12:26 +00001063 (void *)PyString_AS_STRING(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001064 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001065 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001066 return s->errorhandler();
Guido van Rossumaee08791992-09-08 09:05:33 +00001067 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001068 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +00001069 return buf;
Guido van Rossumbcc20741998-08-04 22:53:56 +00001070#endif /* __BEOS__ */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001071}
1072
Guido van Rossum82a5c661998-07-07 20:45:43 +00001073static char getsockopt_doc[] =
1074"getsockopt(level, option[, buffersize]) -> value\n\
1075\n\
1076Get a socket option. See the Unix manual for level and option.\n\
1077If a nonzero buffersize argument is given, the return value is a\n\
1078string of that length; otherwise it is an integer.";
1079
Guido van Rossum0e69587d1992-06-05 15:11:30 +00001080
Fred Drake728819a2000-07-01 03:40:12 +00001081/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001082
Guido van Rossum73624e91994-10-10 17:59:00 +00001083static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001084PySocketSock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001085{
1086 struct sockaddr *addr;
1087 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001088 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001089
Fred Drake728819a2000-07-01 03:40:12 +00001090 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001091 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001092 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001093 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001094 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001095 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001096 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001097 Py_INCREF(Py_None);
1098 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001099}
1100
Guido van Rossum82a5c661998-07-07 20:45:43 +00001101static char bind_doc[] =
1102"bind(address)\n\
1103\n\
1104Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00001105pair (host, port); the host must refer to the local host. For raw packet\n\
1106sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001107
Guido van Rossum30a685f1991-06-27 15:51:29 +00001108
1109/* s.close() method.
1110 Set the file descriptor to -1 so operations tried subsequently
1111 will surely fail. */
1112
Guido van Rossum73624e91994-10-10 17:59:00 +00001113static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001114PySocketSock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001115{
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001116 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001117
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001118 if ((fd = s->sock_fd) != -1) {
1119 s->sock_fd = -1;
Guido van Rossum08481461996-10-12 14:07:22 +00001120 Py_BEGIN_ALLOW_THREADS
Guido van Rossum20d3fc02000-12-18 22:23:44 +00001121 (void) SOCKETCLOSE(fd);
Guido van Rossum08481461996-10-12 14:07:22 +00001122 Py_END_ALLOW_THREADS
1123 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001124 Py_INCREF(Py_None);
1125 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001126}
1127
Guido van Rossum82a5c661998-07-07 20:45:43 +00001128static char close_doc[] =
1129"close()\n\
1130\n\
1131Close the socket. It cannot be used after this call.";
1132
Guido van Rossum30a685f1991-06-27 15:51:29 +00001133
Fred Drake728819a2000-07-01 03:40:12 +00001134/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135
Guido van Rossum73624e91994-10-10 17:59:00 +00001136static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001137PySocketSock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001138{
1139 struct sockaddr *addr;
1140 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001141 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001142
Fred Drake728819a2000-07-01 03:40:12 +00001143 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001144 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001145 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001146 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001147 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001148 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001149 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001150 Py_INCREF(Py_None);
1151 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001152}
1153
Guido van Rossum82a5c661998-07-07 20:45:43 +00001154static char connect_doc[] =
1155"connect(address)\n\
1156\n\
1157Connect the socket to a remote address. For IP sockets, the address\n\
1158is a pair (host, port).";
1159
Guido van Rossum30a685f1991-06-27 15:51:29 +00001160
Fred Drake728819a2000-07-01 03:40:12 +00001161/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001162
1163static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001164PySocketSock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001165{
1166 struct sockaddr *addr;
1167 int addrlen;
1168 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001169
Fred Drake728819a2000-07-01 03:40:12 +00001170 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001171 return NULL;
1172 Py_BEGIN_ALLOW_THREADS
1173 res = connect(s->sock_fd, addr, addrlen);
1174 Py_END_ALLOW_THREADS
Tim Petersc32410a2001-10-30 01:26:49 +00001175 if (res != 0) {
1176#ifdef MS_WINDOWS
1177 res = WSAGetLastError();
1178#else
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001179 res = errno;
Tim Petersc32410a2001-10-30 01:26:49 +00001180#endif
1181 }
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001182 return PyInt_FromLong((long) res);
1183}
1184
Guido van Rossum82a5c661998-07-07 20:45:43 +00001185static char connect_ex_doc[] =
1186"connect_ex(address)\n\
1187\n\
1188This is like connect(address), but returns an error code (the errno value)\n\
1189instead of raising an exception when an error occurs.";
1190
Guido van Rossumfc4255d1997-11-19 18:57:13 +00001191
Guido van Rossumed233a51992-06-23 09:07:03 +00001192/* s.fileno() method */
1193
Guido van Rossum73624e91994-10-10 17:59:00 +00001194static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001195PySocketSock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00001196{
Fred Drakea04eaad2000-06-30 02:46:07 +00001197#if SIZEOF_SOCKET_T <= SIZEOF_LONG
Guido van Rossum73624e91994-10-10 17:59:00 +00001198 return PyInt_FromLong((long) s->sock_fd);
Fred Drakea04eaad2000-06-30 02:46:07 +00001199#else
1200 return PyLong_FromLongLong((LONG_LONG)s->sock_fd);
1201#endif
Guido van Rossumed233a51992-06-23 09:07:03 +00001202}
1203
Guido van Rossum82a5c661998-07-07 20:45:43 +00001204static char fileno_doc[] =
1205"fileno() -> integer\n\
1206\n\
1207Return the integer file descriptor of the socket.";
1208
Guido van Rossumed233a51992-06-23 09:07:03 +00001209
Guido van Rossumbe32c891996-06-20 16:25:29 +00001210#ifndef NO_DUP
1211/* s.dup() method */
1212
1213static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001214PySocketSock_dup(PySocketSockObject *s)
Guido van Rossumbe32c891996-06-20 16:25:29 +00001215{
Fred Drakea04eaad2000-06-30 02:46:07 +00001216 SOCKET_T newfd;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001217 PyObject *sock;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001218
Guido van Rossumbe32c891996-06-20 16:25:29 +00001219 newfd = dup(s->sock_fd);
1220 if (newfd < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001221 return s->errorhandler();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001222 sock = (PyObject *) PySocketSock_New(newfd,
Barry Warsaw752300b1997-01-03 17:18:10 +00001223 s->sock_family,
1224 s->sock_type,
1225 s->sock_proto);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001226 if (sock == NULL)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001227 SOCKETCLOSE(newfd);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001228 return sock;
1229}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001230
1231static char dup_doc[] =
1232"dup() -> socket object\n\
1233\n\
1234Return a new socket object connected to the same system resource.";
1235
Guido van Rossumbe32c891996-06-20 16:25:29 +00001236#endif
1237
1238
Guido van Rossumc89705d1992-11-26 08:54:07 +00001239/* s.getsockname() method */
1240
Guido van Rossum73624e91994-10-10 17:59:00 +00001241static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001242PySocketSock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001243{
1244 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001245 int res;
1246 socklen_t addrlen;
1247
Guido van Rossumc89705d1992-11-26 08:54:07 +00001248 if (!getsockaddrlen(s, &addrlen))
1249 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +00001250 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001251 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001252 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001253 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001254 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001255 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001256 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001257}
1258
Guido van Rossum82a5c661998-07-07 20:45:43 +00001259static char getsockname_doc[] =
1260"getsockname() -> address info\n\
1261\n\
1262Return the address of the local endpoint. For IP sockets, the address\n\
1263info is a pair (hostaddr, port).";
1264
Guido van Rossumc89705d1992-11-26 08:54:07 +00001265
Guido van Rossumb6775db1994-08-01 11:34:53 +00001266#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001267/* s.getpeername() method */
1268
Guido van Rossum73624e91994-10-10 17:59:00 +00001269static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001270PySocketSock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001271{
1272 char addrbuf[256];
Guido van Rossumff3ab422000-04-24 15:16:03 +00001273 int res;
1274 socklen_t addrlen;
1275
Guido van Rossumc89705d1992-11-26 08:54:07 +00001276 if (!getsockaddrlen(s, &addrlen))
1277 return NULL;
Fred Drakefd168342001-05-09 19:11:33 +00001278 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001279 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001280 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001281 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +00001282 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001283 return s->errorhandler();
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001284 return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001285}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001286
1287static char getpeername_doc[] =
1288"getpeername() -> address info\n\
1289\n\
1290Return the address of the remote endpoint. For IP sockets, the address\n\
1291info is a pair (hostaddr, port).";
1292
Guido van Rossumb6775db1994-08-01 11:34:53 +00001293#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00001294
1295
Guido van Rossum30a685f1991-06-27 15:51:29 +00001296/* s.listen(n) method */
1297
Guido van Rossum73624e91994-10-10 17:59:00 +00001298static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001299PySocketSock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001300{
1301 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001302 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001303
1304 backlog = PyInt_AsLong(arg);
1305 if (backlog == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001306 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001307 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +00001308 if (backlog < 1)
1309 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001310 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +00001311 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001312 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001313 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001314 Py_INCREF(Py_None);
1315 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001316}
1317
Guido van Rossum82a5c661998-07-07 20:45:43 +00001318static char listen_doc[] =
1319"listen(backlog)\n\
1320\n\
1321Enable a server to accept connections. The backlog argument must be at\n\
1322least 1; it specifies the number of unaccepted connection that the system\n\
1323will allow before refusing new connections.";
1324
1325
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001326#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +00001327/* s.makefile(mode) method.
1328 Create a new open file object referring to a dupped version of
1329 the socket's file descriptor. (The dup() call is necessary so
1330 that the open file and socket objects may be closed independent
1331 of each other.)
1332 The mode argument specifies 'r' or 'w' passed to fdopen(). */
1333
Guido van Rossum73624e91994-10-10 17:59:00 +00001334static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001335PySocketSock_makefile(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001336{
Tim Petersdbd9ba62000-07-09 03:09:57 +00001337 extern int fclose(FILE *);
Guido van Rossum6b144911995-03-14 15:05:13 +00001338 char *mode = "r";
1339 int bufsize = -1;
Fred Drakea04eaad2000-06-30 02:46:07 +00001340#ifdef MS_WIN32
Tim Peters79248aa2001-08-29 21:37:10 +00001341 Py_intptr_t fd;
Fred Drakea04eaad2000-06-30 02:46:07 +00001342#else
Guido van Rossum30a685f1991-06-27 15:51:29 +00001343 int fd;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001344#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001345 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +00001346 PyObject *f;
1347
Guido van Rossum43713e52000-02-29 13:59:29 +00001348 if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001349 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001350#ifdef MS_WIN32
Guido van Rossum82a5c661998-07-07 20:45:43 +00001351 if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||
1352 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001353#else
Guido van Rossum82a5c661998-07-07 20:45:43 +00001354 if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001355#endif
Guido van Rossum82a5c661998-07-07 20:45:43 +00001356 {
Guido van Rossum6b144911995-03-14 15:05:13 +00001357 if (fd >= 0)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001358 SOCKETCLOSE(fd);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001359 return s->errorhandler();
Guido van Rossum6b144911995-03-14 15:05:13 +00001360 }
Jack Jansen6d8898b2002-03-25 15:32:01 +00001361#ifdef USE_GUSI2
1362 /* Workaround for bug in Metrowerks MSL vs. GUSI I/O library */
1363 if (strchr(mode, 'b') != NULL )
1364 bufsize = 0;
1365#endif
Guido van Rossum6b144911995-03-14 15:05:13 +00001366 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
1367 if (f != NULL)
1368 PyFile_SetBufSize(f, bufsize);
1369 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001370}
Guido van Rossum82a5c661998-07-07 20:45:43 +00001371
1372static char makefile_doc[] =
1373"makefile([mode[, buffersize]]) -> file object\n\
1374\n\
1375Return a regular file object corresponding to the socket.\n\
1376The mode and buffersize arguments are as for the built-in open() function.";
1377
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001378#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001379
Guido van Rossum48a680c2001-03-02 06:34:14 +00001380
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001381/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001382
Guido van Rossum73624e91994-10-10 17:59:00 +00001383static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001384PySocketSock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001385{
Guido van Rossumbe32c891996-06-20 16:25:29 +00001386 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001387 PyObject *buf;
Guido van Rossum43713e52000-02-29 13:59:29 +00001388 if (!PyArg_ParseTuple(args, "i|i:recv", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001389 return NULL;
Martin v. Löwisfba64e12001-11-19 10:41:26 +00001390 if (len < 0) {
1391 PyErr_SetString(PyExc_ValueError,
1392 "negative buffersize in connect");
1393 return NULL;
1394 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001395 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001396 if (buf == NULL)
1397 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001398 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton1ba6bad2001-08-20 19:06:36 +00001399 n = recv(s->sock_fd, PyString_AS_STRING(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001400 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001401 if (n < 0) {
1402 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001403 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001404 }
Tim Peters5de98422002-04-27 18:44:32 +00001405 if (n != len)
1406 _PyString_Resize(&buf, n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001407 return buf;
1408}
1409
Guido van Rossum82a5c661998-07-07 20:45:43 +00001410static char recv_doc[] =
1411"recv(buffersize[, flags]) -> data\n\
1412\n\
1413Receive up to buffersize bytes from the socket. For the optional flags\n\
1414argument, see the Unix manual. When no data is available, block until\n\
1415at least one byte is available or until the remote end is closed. When\n\
1416the remote end is closed and all data is read, return the empty string.";
1417
Guido van Rossum30a685f1991-06-27 15:51:29 +00001418
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001419/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001420
Guido van Rossum73624e91994-10-10 17:59:00 +00001421static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001422PySocketSock_recvfrom(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001423{
1424 char addrbuf[256];
Barry Warsaw752300b1997-01-03 17:18:10 +00001425 PyObject *buf = NULL;
1426 PyObject *addr = NULL;
1427 PyObject *ret = NULL;
1428
Guido van Rossumff3ab422000-04-24 15:16:03 +00001429 int len, n, flags = 0;
1430 socklen_t addrlen;
Guido van Rossum43713e52000-02-29 13:59:29 +00001431 if (!PyArg_ParseTuple(args, "i|i:recvfrom", &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001432 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001433 if (!getsockaddrlen(s, &addrlen))
1434 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001435 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +00001436 if (buf == NULL)
1437 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001438 Py_BEGIN_ALLOW_THREADS
Fred Drakefd168342001-05-09 19:11:33 +00001439 memset(addrbuf, 0, addrlen);
1440 n = recvfrom(s->sock_fd, PyString_AS_STRING(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +00001441#ifndef MS_WINDOWS
Andrew MacIntyreba43e872002-03-03 03:03:52 +00001442#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001443 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001444#else
Thomas Wouters334fb892000-07-25 12:56:38 +00001445 (void *)addrbuf, &addrlen
Guido van Rossum32c575d1997-12-02 20:37:32 +00001446#endif
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001447#else
Barry Warsaw752300b1997-01-03 17:18:10 +00001448 (struct sockaddr *)addrbuf, &addrlen
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001449#endif
Barry Warsaw752300b1997-01-03 17:18:10 +00001450 );
Guido van Rossum73624e91994-10-10 17:59:00 +00001451 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +00001452 if (n < 0) {
1453 Py_DECREF(buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001454 return s->errorhandler();
Guido van Rossum7c53b771995-09-13 18:39:47 +00001455 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +00001456 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001457 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001458
Jeremy Hyltondbfb6622001-02-02 19:55:17 +00001459 if (!(addr = makesockaddr(s->sock_fd, (struct sockaddr *)addrbuf, addrlen)))
Barry Warsaw752300b1997-01-03 17:18:10 +00001460 goto finally;
1461
Guido van Rossum73624e91994-10-10 17:59:00 +00001462 ret = Py_BuildValue("OO", buf, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00001463 finally:
Guido van Rossum73624e91994-10-10 17:59:00 +00001464 Py_XDECREF(addr);
1465 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001466 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001467}
1468
Guido van Rossum82a5c661998-07-07 20:45:43 +00001469static char recvfrom_doc[] =
1470"recvfrom(buffersize[, flags]) -> (data, address info)\n\
1471\n\
1472Like recv(buffersize, flags) but also return the sender's address info.";
1473
Guido van Rossum30a685f1991-06-27 15:51:29 +00001474
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001475/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001476
Guido van Rossum73624e91994-10-10 17:59:00 +00001477static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001478PySocketSock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001479{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001480 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001481 int len, n, flags = 0;
Guido van Rossum43713e52000-02-29 13:59:29 +00001482 if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags))
Guido van Rossumbe32c891996-06-20 16:25:29 +00001483 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001484 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001485 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +00001486 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001487 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001488 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001489 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001490}
1491
Guido van Rossum82a5c661998-07-07 20:45:43 +00001492static char send_doc[] =
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001493"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00001494\n\
1495Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001496argument, see the Unix manual. Return the number of bytes\n\
1497sent; this may be less than len(data) if the network is busy.";
1498
1499
1500/* s.sendall(data [,flags]) method */
1501
1502static PyObject *
1503PySocketSock_sendall(PySocketSockObject *s, PyObject *args)
1504{
1505 char *buf;
Martin v. Löwise6cc5b62002-02-16 23:13:54 +00001506 int len, n, flags = 0;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001507 if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags))
1508 return NULL;
1509 Py_BEGIN_ALLOW_THREADS
1510 do {
1511 n = send(s->sock_fd, buf, len, flags);
1512 if (n < 0)
1513 break;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001514 buf += n;
1515 len -= n;
1516 } while (len > 0);
1517 Py_END_ALLOW_THREADS
1518 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001519 return s->errorhandler();
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001520 Py_INCREF(Py_None);
1521 return Py_None;
1522}
1523
1524static char sendall_doc[] =
1525"sendall(data[, flags])\n\
1526\n\
1527Send a data string to the socket. For the optional flags\n\
1528argument, see the Unix manual. This calls send() repeatedly\n\
1529until all data is sent. If an error occurs, it's impossible\n\
1530to tell how much data has been sent.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00001531
Guido van Rossum30a685f1991-06-27 15:51:29 +00001532
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001533/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001534
Guido van Rossum73624e91994-10-10 17:59:00 +00001535static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001536PySocketSock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001537{
Guido van Rossum73624e91994-10-10 17:59:00 +00001538 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001539 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001540 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001541 int addrlen, len, n, flags;
1542 flags = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001543 if (!PyArg_ParseTuple(args, "s#O:sendto", &buf, &len, &addro)) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001544 PyErr_Clear();
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001545 if (!PyArg_ParseTuple(args, "s#iO:sendto",
1546 &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001547 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001548 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001549 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001550 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001551 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001552 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +00001553 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001554 if (n < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001555 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001556 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001557}
1558
Guido van Rossum82a5c661998-07-07 20:45:43 +00001559static char sendto_doc[] =
1560"sendto(data[, flags], address)\n\
1561\n\
1562Like send(data, flags) but allows specifying the destination address.\n\
1563For IP sockets, the address is a pair (hostaddr, port).";
1564
Guido van Rossum30a685f1991-06-27 15:51:29 +00001565
1566/* s.shutdown(how) method */
1567
Guido van Rossum73624e91994-10-10 17:59:00 +00001568static PyObject *
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001569PySocketSock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001570{
1571 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001572 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001573
1574 how = PyInt_AsLong(arg);
1575 if (how == -1 && PyErr_Occurred())
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001576 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001577 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001578 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +00001579 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001580 if (res < 0)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001581 return s->errorhandler();
Guido van Rossum73624e91994-10-10 17:59:00 +00001582 Py_INCREF(Py_None);
1583 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001584}
1585
Guido van Rossum82a5c661998-07-07 20:45:43 +00001586static char shutdown_doc[] =
1587"shutdown(flag)\n\
1588\n\
1589Shut down the reading side of the socket (flag == 0), the writing side\n\
1590of the socket (flag == 1), or both ends (flag == 2).";
1591
Guido van Rossum30a685f1991-06-27 15:51:29 +00001592
1593/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001594
Guido van Rossum73624e91994-10-10 17:59:00 +00001595static PyMethodDef PySocketSock_methods[] = {
Guido van Rossum17209fc2001-10-15 21:12:54 +00001596 {"accept", (PyCFunction)PySocketSock_accept, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001597 accept_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001598 {"bind", (PyCFunction)PySocketSock_bind, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001599 bind_doc},
Guido van Rossum17209fc2001-10-15 21:12:54 +00001600 {"close", (PyCFunction)PySocketSock_close, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001601 close_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001602 {"connect", (PyCFunction)PySocketSock_connect, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001603 connect_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001604 {"connect_ex", (PyCFunction)PySocketSock_connect_ex, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001605 connect_ex_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001606#ifndef NO_DUP
Guido van Rossum17209fc2001-10-15 21:12:54 +00001607 {"dup", (PyCFunction)PySocketSock_dup, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001608 dup_doc},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001609#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001610 {"fileno", (PyCFunction)PySocketSock_fileno, METH_NOARGS,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001611 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001612#ifdef HAVE_GETPEERNAME
Guido van Rossum17209fc2001-10-15 21:12:54 +00001613 {"getpeername", (PyCFunction)PySocketSock_getpeername,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001614 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00001615#endif
Guido van Rossum17209fc2001-10-15 21:12:54 +00001616 {"getsockname", (PyCFunction)PySocketSock_getsockname,
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001617 METH_NOARGS, getsockname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001618 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, METH_VARARGS,
1619 getsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001620 {"listen", (PyCFunction)PySocketSock_listen, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001621 listen_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001622#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00001623 {"makefile", (PyCFunction)PySocketSock_makefile, METH_VARARGS,
1624 makefile_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001625#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001626 {"recv", (PyCFunction)PySocketSock_recv, METH_VARARGS,
1627 recv_doc},
1628 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, METH_VARARGS,
1629 recvfrom_doc},
1630 {"send", (PyCFunction)PySocketSock_send, METH_VARARGS,
1631 send_doc},
Guido van Rossum9f7a5392001-10-26 03:25:00 +00001632 {"sendall", (PyCFunction)PySocketSock_sendall, METH_VARARGS,
1633 sendall_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00001634 {"sendto", (PyCFunction)PySocketSock_sendto, METH_VARARGS,
1635 sendto_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001636 {"setblocking", (PyCFunction)PySocketSock_setblocking, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001637 setblocking_doc},
1638 {"setsockopt", (PyCFunction)PySocketSock_setsockopt, METH_VARARGS,
1639 setsockopt_doc},
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00001640 {"shutdown", (PyCFunction)PySocketSock_shutdown, METH_O,
Guido van Rossum48a680c2001-03-02 06:34:14 +00001641 shutdown_doc},
1642#ifdef RISCOS
1643 {"sleeptaskw", (PyCFunction)PySocketSock_sleeptaskw, METH_VARARGS,
1644 sleeptaskw_doc},
1645#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001646 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001647};
1648
Guido van Rossum30a685f1991-06-27 15:51:29 +00001649
Guido van Rossum73624e91994-10-10 17:59:00 +00001650/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00001651 First close the file description. */
1652
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001653static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001654PySocketSock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001655{
Guido van Rossumfa972c92000-04-10 12:45:45 +00001656 if (s->sock_fd != -1)
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +00001657 (void) SOCKETCLOSE(s->sock_fd);
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001658 s->ob_type->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001659}
1660
Guido van Rossum30a685f1991-06-27 15:51:29 +00001661
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001662static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001663PySocketSock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001664{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001665 char buf[512];
Fred Drakea04eaad2000-06-30 02:46:07 +00001666#if SIZEOF_SOCKET_T > SIZEOF_LONG
1667 if (s->sock_fd > LONG_MAX) {
1668 /* this can occur on Win64, and actually there is a special
1669 ugly printf formatter for decimal pointer length integer
1670 printing, only bother if necessary*/
1671 PyErr_SetString(PyExc_OverflowError,
1672 "no printf formatter to display the socket descriptor in decimal");
1673 return NULL;
1674 }
1675#endif
Tim Peters885d4572001-11-28 20:27:42 +00001676 PyOS_snprintf(buf, sizeof(buf),
1677 "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",
1678 (long)s->sock_fd, s->sock_family,
1679 s->sock_type,
1680 s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001681 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001682}
1683
1684
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001685/* Create a new, uninitialized socket object. */
1686
1687static PyObject *
1688PySocketSock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1689{
1690 PyObject *new;
1691
1692 new = type->tp_alloc(type, 0);
Guido van Rossume1c478f2002-06-06 20:08:25 +00001693 if (new != NULL) {
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001694 ((PySocketSockObject *)new)->sock_fd = -1;
Guido van Rossume1c478f2002-06-06 20:08:25 +00001695 ((PySocketSockObject *)new)->errorhandler = &PySocket_Err;
1696 }
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001697 return new;
1698}
1699
1700
1701/* Initialize a new socket object. */
1702
1703/*ARGSUSED*/
1704static int
1705PySocketSock_init(PyObject *self, PyObject *args, PyObject *kwds)
1706{
1707 PySocketSockObject *s = (PySocketSockObject *)self;
1708 SOCKET_T fd;
1709 int family = AF_INET, type = SOCK_STREAM, proto = 0;
1710 static char *keywords[] = {"family", "type", "proto", 0};
1711
1712 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1713 "|iii:socket", keywords,
1714 &family, &type, &proto))
1715 return -1;
1716 Py_BEGIN_ALLOW_THREADS
1717 fd = socket(family, type, proto);
1718 Py_END_ALLOW_THREADS
1719#ifdef MS_WINDOWS
1720 if (fd == INVALID_SOCKET)
1721#else
1722 if (fd < 0)
1723#endif
1724 {
1725 PySocket_Err();
1726 return -1;
1727 }
1728 init_sockobject(s, fd, family, type, proto);
1729 /* From now on, ignore SIGPIPE and let the error checking
1730 do the work. */
1731#ifdef SIGPIPE
1732 (void) signal(SIGPIPE, SIG_IGN);
1733#endif
1734 return 0;
1735}
1736
1737
Guido van Rossumb6775db1994-08-01 11:34:53 +00001738/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001739
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001740static char socket_doc[] =
1741"socket([family[, type[, proto]]]) -> socket object\n\
1742\n\
1743Open a socket of the given type. The family argument specifies the\n\
1744address family; it defaults to AF_INET. The type argument specifies\n\
1745whether this is a stream (SOCK_STREAM, this is the default)\n\
1746or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
1747specifying the default protocol.\n\
1748\n\
1749A socket represents one endpoint of a network connection.\n\
1750\n\
1751Methods:\n\
1752\n\
1753accept() -- accept a connection, returning new socket and client address\n\
1754bind() -- bind the socket to a local address\n\
1755close() -- close the socket\n\
1756connect() -- connect the socket to a remote address\n\
1757connect_ex() -- connect, return an error code instead of an exception \n\
1758dup() -- return a new socket object identical to the current one (*)\n\
1759fileno() -- return underlying file descriptor\n\
1760getpeername() -- return remote address (*)\n\
1761getsockname() -- return local address\n\
1762getsockopt() -- get socket options\n\
1763listen() -- start listening for incoming connections\n\
Andrew M. Kuchling3072ecd2001-11-28 04:28:31 +00001764makefile() -- return a file object corresponding to the socket (*)\n\
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001765recv() -- receive data\n\
1766recvfrom() -- receive data and sender's address\n\
1767send() -- send data, may not send all of it\n\
1768sendall() -- send all data\n\
1769sendto() -- send data to a given address\n\
1770setblocking() -- set or clear the blocking I/O flag\n\
1771setsockopt() -- set socket options\n\
1772shutdown() -- shut down traffic in one or both directions\n\
1773\n\
1774(*) not available on all platforms!)";
1775
Guido van Rossum73624e91994-10-10 17:59:00 +00001776static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +00001777 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001778 0, /* ob_size */
Guido van Rossumca6dfa52001-10-28 12:31:33 +00001779 "_socket.socket", /* tp_name */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001780 sizeof(PySocketSockObject), /* tp_basicsize */
1781 0, /* tp_itemsize */
1782 (destructor)PySocketSock_dealloc, /* tp_dealloc */
1783 0, /* tp_print */
1784 0, /* tp_getattr */
1785 0, /* tp_setattr */
1786 0, /* tp_compare */
1787 (reprfunc)PySocketSock_repr, /* tp_repr */
1788 0, /* tp_as_number */
1789 0, /* tp_as_sequence */
1790 0, /* tp_as_mapping */
1791 0, /* tp_hash */
1792 0, /* tp_call */
1793 0, /* tp_str */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001794 0, /* set below */ /* tp_getattro */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001795 0, /* tp_setattro */
1796 0, /* tp_as_buffer */
1797 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1798 socket_doc, /* tp_doc */
1799 0, /* tp_traverse */
1800 0, /* tp_clear */
1801 0, /* tp_richcompare */
1802 0, /* tp_weaklistoffset */
1803 0, /* tp_iter */
1804 0, /* tp_iternext */
1805 PySocketSock_methods, /* tp_methods */
1806 0, /* tp_members */
1807 0, /* tp_getset */
1808 0, /* tp_base */
1809 0, /* tp_dict */
1810 0, /* tp_descr_get */
1811 0, /* tp_descr_set */
1812 0, /* tp_dictoffset */
1813 PySocketSock_init, /* tp_init */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001814 0, /* set below */ /* tp_alloc */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00001815 PySocketSock_new, /* tp_new */
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00001816 0, /* set below */ /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001817};
1818
Guido van Rossum30a685f1991-06-27 15:51:29 +00001819
Guido van Rossum81194471991-07-27 21:42:02 +00001820/* Python interface to gethostname(). */
1821
1822/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001823static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001824PySocket_gethostname(PyObject *self, PyObject *args)
Guido van Rossum81194471991-07-27 21:42:02 +00001825{
1826 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001827 int res;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001828 if (!PyArg_ParseTuple(args, ":gethostname"))
Guido van Rossum81194471991-07-27 21:42:02 +00001829 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001830 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001831 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001832 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001833 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001834 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001835 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001836 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001837}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001838
Guido van Rossum82a5c661998-07-07 20:45:43 +00001839static char gethostname_doc[] =
1840"gethostname() -> string\n\
1841\n\
1842Return the current host name.";
1843
Guido van Rossumff4949e1992-08-05 19:58:53 +00001844
Guido van Rossum30a685f1991-06-27 15:51:29 +00001845/* Python interface to gethostbyname(name). */
1846
1847/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001848static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001849PySocket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001850{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001851 char *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001852 struct sockaddr_storage addrbuf;
1853
Guido van Rossum27fc3c02000-03-24 20:56:56 +00001854 if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001855 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001856 if (setipaddr(name, (struct sockaddr *)&addrbuf, AF_INET) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001857 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001858 return makeipaddr((struct sockaddr *)&addrbuf,
1859 sizeof(struct sockaddr_in));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001860}
1861
Guido van Rossum82a5c661998-07-07 20:45:43 +00001862static char gethostbyname_doc[] =
1863"gethostbyname(host) -> address\n\
1864\n\
1865Return the IP address (a string of the form '255.255.255.255') for a host.";
1866
1867
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001868/* Convenience function common to gethostbyname_ex and gethostbyaddr */
1869
1870static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001871gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001872{
1873 char **pch;
1874 PyObject *rtn_tuple = (PyObject *)NULL;
1875 PyObject *name_list = (PyObject *)NULL;
1876 PyObject *addr_list = (PyObject *)NULL;
1877 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001878
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001879 if (h == NULL) {
Guido van Rossum48a680c2001-03-02 06:34:14 +00001880 /* Let's get real error message to return */
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001881#ifndef RISCOS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001882 PyH_Err(h_errno);
Guido van Rossume2ae77b2001-10-24 20:42:55 +00001883#else
1884 PyErr_SetString(PySocket_Error, "host not found");
1885#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001886 return NULL;
1887 }
1888 if (h->h_addrtype != af) {
1889#ifdef HAVE_STRERROR
1890 /* Let's get real error message to return */
1891 PyErr_SetString(PySocket_Error, (char *)strerror(EAFNOSUPPORT));
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001892#else
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001893 PyErr_SetString(PySocket_Error,
1894 "Address family not supported by protocol family");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001895#endif
1896 return NULL;
1897 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001898 switch (af) {
1899 case AF_INET:
1900 if (alen < sizeof(struct sockaddr_in))
1901 return NULL;
1902 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001903#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001904 case AF_INET6:
1905 if (alen < sizeof(struct sockaddr_in6))
1906 return NULL;
1907 break;
1908#endif
1909 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001910 if ((name_list = PyList_New(0)) == NULL)
1911 goto err;
1912 if ((addr_list = PyList_New(0)) == NULL)
1913 goto err;
1914 for (pch = h->h_aliases; *pch != NULL; pch++) {
1915 int status;
1916 tmp = PyString_FromString(*pch);
1917 if (tmp == NULL)
1918 goto err;
1919 status = PyList_Append(name_list, tmp);
1920 Py_DECREF(tmp);
1921 if (status)
1922 goto err;
1923 }
1924 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1925 int status;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001926 switch (af) {
1927 case AF_INET:
1928 {
1929 struct sockaddr_in sin;
1930 memset(&sin, 0, sizeof(sin));
1931 sin.sin_family = af;
1932#ifdef HAVE_SOCKADDR_SA_LEN
1933 sin.sin_len = sizeof(sin);
1934#endif
1935 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
1936 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
1937 if (pch == h->h_addr_list && alen >= sizeof(sin))
1938 memcpy((char *) addr, &sin, sizeof(sin));
1939 break;
1940 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001941#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001942 case AF_INET6:
1943 {
1944 struct sockaddr_in6 sin6;
1945 memset(&sin6, 0, sizeof(sin6));
1946 sin6.sin6_family = af;
1947#ifdef HAVE_SOCKADDR_SA_LEN
1948 sin6.sin6_len = sizeof(sin6);
1949#endif
1950 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
1951 tmp = makeipaddr((struct sockaddr *)&sin6,
1952 sizeof(sin6));
1953 if (pch == h->h_addr_list && alen >= sizeof(sin6))
1954 memcpy((char *) addr, &sin6, sizeof(sin6));
1955 break;
1956 }
1957#endif
1958 default: /* can't happen */
1959 PyErr_SetString(PySocket_Error,
1960 "unsupported address family");
1961 return NULL;
1962 }
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001963 if (tmp == NULL)
1964 goto err;
1965 status = PyList_Append(addr_list, tmp);
1966 Py_DECREF(tmp);
1967 if (status)
1968 goto err;
1969 }
1970 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1971 err:
1972 Py_XDECREF(name_list);
1973 Py_XDECREF(addr_list);
1974 return rtn_tuple;
1975}
1976
1977
1978/* Python interface to gethostbyname_ex(name). */
1979
1980/*ARGSUSED*/
1981static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00001982PySocket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001983{
1984 char *name;
1985 struct hostent *h;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001986 struct sockaddr_storage addr;
Martin v. Löwis9db2f572001-07-23 01:30:10 +00001987 struct sockaddr *sa;
Guido van Rossum955becc1999-03-22 20:14:53 +00001988 PyObject *ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001989#ifdef HAVE_GETHOSTBYNAME_R
1990 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001991#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
1992 struct hostent_data data;
1993#else
Guido van Rossum7d896ab1998-08-04 22:16:43 +00001994 char buf[16384];
1995 int buf_len = (sizeof buf) - 1;
1996 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00001997#endif
1998#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00001999 int result;
2000#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002001#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002002
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002003 if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002004 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002005 if (setipaddr(name, (struct sockaddr *)&addr, PF_INET) < 0)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002006 return NULL;
2007 Py_BEGIN_ALLOW_THREADS
2008#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002009#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002010 result = gethostbyname_r(name, &hp_allocated, buf, buf_len, &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002011#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002012 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002013#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002014 memset((void *) &data, '\0', sizeof(data));
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002015 result = gethostbyname_r(name, &hp_allocated, &data);
2016 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002017#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002018#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002019#ifdef USE_GETHOSTBYNAME_LOCK
2020 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002021#endif
2022 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002023#endif /* HAVE_GETHOSTBYNAME_R */
2024 Py_END_ALLOW_THREADS
Martin v. Löwis9db2f572001-07-23 01:30:10 +00002025 /* Some C libraries would require addr.__ss_family instead of addr.ss_family.
2026 Therefore, we cast the sockaddr_storage into sockaddr to access sa_family. */
2027 sa = (struct sockaddr*)&addr;
2028 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002029#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum955becc1999-03-22 20:14:53 +00002030 PyThread_release_lock(gethostbyname_lock);
2031#endif
2032 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00002033}
2034
2035static char ghbn_ex_doc[] =
2036"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
2037\n\
2038Return the true host name, a list of aliases, and a list of IP addresses,\n\
2039for a host. The host argument is a string giving a host name or IP number.";
2040
2041
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002042/* Python interface to gethostbyaddr(IP). */
2043
2044/*ARGSUSED*/
2045static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002046PySocket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002047{
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002048#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002049 struct sockaddr_storage addr;
2050#else
Guido van Rossum48a680c2001-03-02 06:34:14 +00002051 struct sockaddr_in addr;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002052#endif
2053 struct sockaddr *sa = (struct sockaddr *)&addr;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002054 char *ip_num;
2055 struct hostent *h;
Guido van Rossum3baaa131999-03-22 21:44:51 +00002056 PyObject *ret;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002057#ifdef HAVE_GETHOSTBYNAME_R
2058 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002059#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
2060 struct hostent_data data;
2061#else
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002062 char buf[16384];
2063 int buf_len = (sizeof buf) - 1;
2064 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002065#endif
2066#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002067 int result;
2068#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002069#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002070 char *ap;
2071 int al;
2072 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002073
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002074 if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002075 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002076 af = PF_UNSPEC;
2077 if (setipaddr(ip_num, sa, af) < 0)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002078 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002079 af = sa->sa_family;
2080 ap = NULL;
2081 al = 0;
2082 switch (af) {
2083 case AF_INET:
2084 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
2085 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
2086 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002087#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002088 case AF_INET6:
2089 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
2090 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
2091 break;
2092#endif
2093 default:
2094 PyErr_SetString(PySocket_Error, "unsupported address family");
2095 return NULL;
2096 }
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002097 Py_BEGIN_ALLOW_THREADS
2098#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002099#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002100 result = gethostbyaddr_r(ap, al, af,
2101 &hp_allocated, buf, buf_len,
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002102 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002103#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002104 h = gethostbyaddr_r(ap, al, af,
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002105 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002106#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Guido van Rossume7de2061999-03-24 17:24:33 +00002107 memset((void *) &data, '\0', sizeof(data));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002108 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00002109 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00002110#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002111#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00002112#ifdef USE_GETHOSTBYNAME_LOCK
2113 PyThread_acquire_lock(gethostbyname_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002114#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002115 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00002116#endif /* HAVE_GETHOSTBYNAME_R */
2117 Py_END_ALLOW_THREADS
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002118 ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00002119#ifdef USE_GETHOSTBYNAME_LOCK
2120 PyThread_release_lock(gethostbyname_lock);
2121#endif
2122 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00002123}
2124
Guido van Rossum82a5c661998-07-07 20:45:43 +00002125static char gethostbyaddr_doc[] =
2126"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
2127\n\
2128Return the true host name, a list of aliases, and a list of IP addresses,\n\
2129for a host. The host argument is a string giving a host name or IP number.";
2130
Guido van Rossum30a685f1991-06-27 15:51:29 +00002131
2132/* Python interface to getservbyname(name).
2133 This only returns the port number, since the other info is already
2134 known or not useful (like the list of aliases). */
2135
2136/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002137static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002138PySocket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002139{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002140 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002141 struct servent *sp;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002142 if (!PyArg_ParseTuple(args, "ss:getservbyname", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00002143 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00002144 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002145 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00002146 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00002147 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00002148 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00002149 return NULL;
2150 }
Guido van Rossum73624e91994-10-10 17:59:00 +00002151 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00002152}
2153
Guido van Rossum82a5c661998-07-07 20:45:43 +00002154static char getservbyname_doc[] =
2155"getservbyname(servicename, protocolname) -> integer\n\
2156\n\
2157Return a port number from a service name and protocol name.\n\
2158The protocol name should be 'tcp' or 'udp'.";
2159
Guido van Rossum30a685f1991-06-27 15:51:29 +00002160
Guido van Rossum3901d851996-12-19 16:35:04 +00002161/* Python interface to getprotobyname(name).
2162 This only returns the protocol number, since the other info is
2163 already known or not useful (like the list of aliases). */
2164
2165/*ARGSUSED*/
2166static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002167PySocket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00002168{
2169 char *name;
2170 struct protoent *sp;
Guido van Rossumbcc20741998-08-04 22:53:56 +00002171#ifdef __BEOS__
2172/* Not available in BeOS yet. - [cjh] */
2173 PyErr_SetString( PySocket_Error, "getprotobyname not supported" );
2174 return NULL;
2175#else
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002176 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
Guido van Rossum3901d851996-12-19 16:35:04 +00002177 return NULL;
2178 Py_BEGIN_ALLOW_THREADS
2179 sp = getprotobyname(name);
2180 Py_END_ALLOW_THREADS
2181 if (sp == NULL) {
2182 PyErr_SetString(PySocket_Error, "protocol not found");
2183 return NULL;
2184 }
2185 return PyInt_FromLong((long) sp->p_proto);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002186#endif
Guido van Rossum3901d851996-12-19 16:35:04 +00002187}
2188
Guido van Rossum82a5c661998-07-07 20:45:43 +00002189static char getprotobyname_doc[] =
2190"getprotobyname(name) -> integer\n\
2191\n\
2192Return the protocol number for the named protocol. (Rarely used.)";
2193
Guido van Rossum3901d851996-12-19 16:35:04 +00002194
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002195#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002196/* Create a socket object from a numeric file description.
2197 Useful e.g. if stdin is a socket.
2198 Additional arguments as for socket(). */
2199
2200/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00002201static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002202PySocket_fromfd(PyObject *self, PyObject *args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002203{
Guido van Rossum73624e91994-10-10 17:59:00 +00002204 PySocketSockObject *s;
Fred Drakea04eaad2000-06-30 02:46:07 +00002205 SOCKET_T fd;
2206 int family, type, proto = 0;
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002207 if (!PyArg_ParseTuple(args, "iii|i:fromfd",
2208 &fd, &family, &type, &proto))
Guido van Rossumbe32c891996-06-20 16:25:29 +00002209 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00002210 /* Dup the fd so it and the socket can be closed independently */
2211 fd = dup(fd);
2212 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00002213 return PySocket_Err();
2214 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002215 /* From now on, ignore SIGPIPE and let the error checking
2216 do the work. */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002217#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002218 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002219#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00002220 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002221}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002222
2223static char fromfd_doc[] =
2224"fromfd(fd, family, type[, proto]) -> socket object\n\
2225\n\
2226Create a socket object from the given file descriptor.\n\
2227The remaining arguments are the same as for socket().";
2228
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002229#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00002230
Guido van Rossum82a5c661998-07-07 20:45:43 +00002231
Guido van Rossum006bf911996-06-12 04:04:55 +00002232static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002233PySocket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002234{
2235 int x1, x2;
2236
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002237 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002238 return NULL;
2239 }
2240 x2 = (int)ntohs((short)x1);
2241 return PyInt_FromLong(x2);
2242}
2243
Guido van Rossum82a5c661998-07-07 20:45:43 +00002244static char ntohs_doc[] =
2245"ntohs(integer) -> integer\n\
2246\n\
2247Convert a 16-bit integer from network to host byte order.";
2248
2249
Guido van Rossum006bf911996-06-12 04:04:55 +00002250static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002251PySocket_ntohl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002252{
2253 int x1, x2;
2254
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002255 if (!PyArg_ParseTuple(args, "i:ntohl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002256 return NULL;
2257 }
2258 x2 = ntohl(x1);
2259 return PyInt_FromLong(x2);
2260}
2261
Guido van Rossum82a5c661998-07-07 20:45:43 +00002262static char ntohl_doc[] =
2263"ntohl(integer) -> integer\n\
2264\n\
2265Convert a 32-bit integer from network to host byte order.";
2266
2267
Guido van Rossum006bf911996-06-12 04:04:55 +00002268static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002269PySocket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002270{
2271 int x1, x2;
2272
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002273 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002274 return NULL;
2275 }
2276 x2 = (int)htons((short)x1);
2277 return PyInt_FromLong(x2);
2278}
2279
Guido van Rossum82a5c661998-07-07 20:45:43 +00002280static char htons_doc[] =
2281"htons(integer) -> integer\n\
2282\n\
2283Convert a 16-bit integer from host to network byte order.";
2284
2285
Guido van Rossum006bf911996-06-12 04:04:55 +00002286static PyObject *
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002287PySocket_htonl(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00002288{
2289 int x1, x2;
2290
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002291 if (!PyArg_ParseTuple(args, "i:htonl", &x1)) {
Guido van Rossum006bf911996-06-12 04:04:55 +00002292 return NULL;
2293 }
2294 x2 = htonl(x1);
2295 return PyInt_FromLong(x2);
2296}
2297
Guido van Rossum82a5c661998-07-07 20:45:43 +00002298static char htonl_doc[] =
2299"htonl(integer) -> integer\n\
2300\n\
2301Convert a 32-bit integer from host to network byte order.";
2302
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002303/*
2304 * socket.inet_aton() and socket.inet_ntoa() functions
2305 *
2306 * written 20 Aug 1999 by Ben Gertzfield <che@debian.org> <- blame him!
2307 *
2308 */
2309
Guido van Rossum48a680c2001-03-02 06:34:14 +00002310static char inet_aton_doc[] =
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002311"inet_aton(string) -> packed 32-bit IP representation\n\
2312\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002313Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002314binary format used in low-level network functions.";
2315
2316static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002317PySocket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002318{
Guido van Rossuma2e48551999-09-09 15:42:59 +00002319#ifndef INADDR_NONE
2320#define INADDR_NONE (-1)
2321#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002322
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002323 /* Have to use inet_addr() instead */
2324 char *ip_addr;
Fred Drakee5065292001-07-19 21:16:41 +00002325 unsigned long packed_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002326
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002327 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr)) {
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002328 return NULL;
2329 }
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002330 packed_addr = inet_addr(ip_addr);
2331
2332 if (packed_addr == INADDR_NONE) { /* invalid address */
2333 PyErr_SetString(PySocket_Error,
2334 "illegal IP address string passed to inet_aton");
2335 return NULL;
2336 }
2337
2338 return PyString_FromStringAndSize((char *) &packed_addr,
2339 sizeof(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002340}
2341
Guido van Rossum48a680c2001-03-02 06:34:14 +00002342static char inet_ntoa_doc[] =
Fred Drakee0661342000-03-07 14:05:16 +00002343"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002344\n\
2345Convert an IP address from 32-bit packed binary format to string format";
2346
2347static PyObject*
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002348PySocket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002349{
2350 char *packed_str;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00002351 int addr_len;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002352 struct in_addr packed_addr;
2353
Guido van Rossum27fc3c02000-03-24 20:56:56 +00002354 if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002355 return NULL;
2356 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00002357
Guido van Rossum5c9eb211999-08-20 18:21:51 +00002358 if (addr_len != sizeof(packed_addr)) {
2359 PyErr_SetString(PySocket_Error,
2360 "packed IP wrong length for inet_ntoa");
2361 return NULL;
2362 }
2363
2364 memcpy(&packed_addr, packed_str, addr_len);
2365
2366 return PyString_FromString(inet_ntoa(packed_addr));
2367}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002368
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002369/* Python interface to getaddrinfo(host, port). */
2370
2371/*ARGSUSED*/
2372static PyObject *
2373PySocket_getaddrinfo(PyObject *self, PyObject *args)
2374{
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002375 struct addrinfo hints, *res;
2376 struct addrinfo *res0 = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002377 PyObject *pobj = (PyObject *)NULL;
Martin v. Löwisf65b1a12001-08-12 09:28:40 +00002378 char pbuf[30];
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002379 char *hptr, *pptr;
2380 int family, socktype, protocol, flags;
2381 int error;
2382 PyObject *all = (PyObject *)NULL;
2383 PyObject *single = (PyObject *)NULL;
2384
2385 family = socktype = protocol = flags = 0;
2386 family = PF_UNSPEC;
2387 if (!PyArg_ParseTuple(args, "zO|iiii:getaddrinfo",
2388 &hptr, &pobj, &family, &socktype,
2389 &protocol, &flags)) {
2390 return NULL;
2391 }
2392 if (PyInt_Check(pobj)) {
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002393 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", PyInt_AsLong(pobj));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002394 pptr = pbuf;
2395 } else if (PyString_Check(pobj)) {
2396 pptr = PyString_AsString(pobj);
2397 } else if (pobj == Py_None) {
2398 pptr = (char *)NULL;
2399 } else {
2400 PyErr_SetString(PySocket_Error, "Int or String expected");
2401 return NULL;
2402 }
2403 memset(&hints, 0, sizeof(hints));
2404 hints.ai_family = family;
2405 hints.ai_socktype = socktype;
2406 hints.ai_protocol = protocol;
2407 hints.ai_flags = flags;
2408 error = getaddrinfo(hptr, pptr, &hints, &res0);
2409 if (error) {
2410 PyGAI_Err(error);
2411 return NULL;
2412 }
2413
2414 if ((all = PyList_New(0)) == NULL)
2415 goto err;
2416 for (res = res0; res; res = res->ai_next) {
Guido van Rossum716aac02001-10-12 18:59:27 +00002417 PyObject *addr =
2418 makesockaddr(-1, res->ai_addr, res->ai_addrlen);
2419 if (addr == NULL)
2420 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002421 single = Py_BuildValue("iiisO", res->ai_family,
2422 res->ai_socktype, res->ai_protocol,
2423 res->ai_canonname ? res->ai_canonname : "",
Guido van Rossum716aac02001-10-12 18:59:27 +00002424 addr);
2425 Py_DECREF(addr);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002426 if (single == NULL)
2427 goto err;
2428
2429 if (PyList_Append(all, single))
2430 goto err;
2431 Py_XDECREF(single);
2432 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002433 return all;
2434 err:
2435 Py_XDECREF(single);
2436 Py_XDECREF(all);
Martin v. Löwisf0b11d22001-11-07 08:31:03 +00002437 if (res0)
2438 freeaddrinfo(res0);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002439 return (PyObject *)NULL;
2440}
2441
2442static char getaddrinfo_doc[] =
2443"socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
2444 --> List of (family, socktype, proto, canonname, sockaddr)\n\
2445\n\
2446Resolve host and port into addrinfo struct.";
2447
2448/* Python interface to getnameinfo(sa, flags). */
2449
2450/*ARGSUSED*/
2451static PyObject *
2452PySocket_getnameinfo(PyObject *self, PyObject *args)
2453{
2454 PyObject *sa = (PyObject *)NULL;
2455 int flags;
2456 char *hostp;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002457 int port, flowinfo, scope_id;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002458 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
2459 struct addrinfo hints, *res = NULL;
2460 int error;
2461 PyObject *ret = (PyObject *)NULL;
2462
2463 flags = flowinfo = scope_id = 0;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002464 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002465 return NULL;
Martin v. Löwis06b1d212001-11-02 23:34:52 +00002466 if (!PyArg_ParseTuple(sa, "si|ii", &hostp, &port, &flowinfo, &scope_id))
2467 return NULL;
Marc-André Lemburg03d1b182001-07-31 18:05:33 +00002468 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002469 memset(&hints, 0, sizeof(hints));
2470 hints.ai_family = PF_UNSPEC;
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002471 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002472 error = getaddrinfo(hostp, pbuf, &hints, &res);
2473 if (error) {
2474 PyGAI_Err(error);
2475 goto fail;
2476 }
2477 if (res->ai_next) {
2478 PyErr_SetString(PySocket_Error,
2479 "sockaddr resolved to multiple addresses");
2480 goto fail;
2481 }
2482 switch (res->ai_family) {
2483 case AF_INET:
2484 {
2485 char *t1;
2486 int t2;
2487 if (PyArg_ParseTuple(sa, "si", &t1, &t2) == 0) {
2488 PyErr_SetString(PySocket_Error,
2489 "IPv4 sockaddr must be 2 tuple");
2490 goto fail;
2491 }
2492 break;
2493 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002494#ifdef ENABLE_IPV6
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002495 case AF_INET6:
2496 {
2497 struct sockaddr_in6 *sin6;
2498 sin6 = (struct sockaddr_in6 *)res->ai_addr;
2499 sin6->sin6_flowinfo = flowinfo;
2500 sin6->sin6_scope_id = scope_id;
2501 break;
2502 }
2503#endif
2504 }
2505 error = getnameinfo(res->ai_addr, res->ai_addrlen,
2506 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
2507 if (error) {
2508 PyGAI_Err(error);
2509 goto fail;
2510 }
2511 ret = Py_BuildValue("ss", hbuf, pbuf);
2512
2513fail:
2514 if (res)
2515 freeaddrinfo(res);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002516 return ret;
2517}
2518
2519static char getnameinfo_doc[] =
2520"socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
2521\n\
2522Get host and port for a sockaddr.";
2523
Guido van Rossum30a685f1991-06-27 15:51:29 +00002524/* List of functions exported by this module. */
2525
Guido van Rossum73624e91994-10-10 17:59:00 +00002526static PyMethodDef PySocket_methods[] = {
Guido van Rossum48a680c2001-03-02 06:34:14 +00002527 {"gethostbyname", PySocket_gethostbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002528 METH_VARARGS, gethostbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002529 {"gethostbyname_ex", PySocket_gethostbyname_ex,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002530 METH_VARARGS, ghbn_ex_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002531 {"gethostbyaddr", PySocket_gethostbyaddr,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002532 METH_VARARGS, gethostbyaddr_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002533 {"gethostname", PySocket_gethostname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002534 METH_VARARGS, gethostname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002535 {"getservbyname", PySocket_getservbyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002536 METH_VARARGS, getservbyname_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002537 {"getprotobyname", PySocket_getprotobyname,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002538 METH_VARARGS,getprotobyname_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002539#ifndef NO_DUP
Guido van Rossum48a680c2001-03-02 06:34:14 +00002540 {"fromfd", PySocket_fromfd,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002541 METH_VARARGS, fromfd_doc},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002542#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002543 {"ntohs", PySocket_ntohs,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002544 METH_VARARGS, ntohs_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002545 {"ntohl", PySocket_ntohl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002546 METH_VARARGS, ntohl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002547 {"htons", PySocket_htons,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002548 METH_VARARGS, htons_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002549 {"htonl", PySocket_htonl,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002550 METH_VARARGS, htonl_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002551 {"inet_aton", PySocket_inet_aton,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002552 METH_VARARGS, inet_aton_doc},
Guido van Rossum48a680c2001-03-02 06:34:14 +00002553 {"inet_ntoa", PySocket_inet_ntoa,
Andrew M. Kuchlinge365fb82000-08-03 02:06:16 +00002554 METH_VARARGS, inet_ntoa_doc},
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002555 {"getaddrinfo", PySocket_getaddrinfo,
2556 METH_VARARGS, getaddrinfo_doc},
2557 {"getnameinfo", PySocket_getnameinfo,
2558 METH_VARARGS, getnameinfo_doc},
Guido van Rossum30a685f1991-06-27 15:51:29 +00002559 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002560};
2561
Guido van Rossum30a685f1991-06-27 15:51:29 +00002562
2563/* Convenience routine to export an integer value.
Barry Warsaw752300b1997-01-03 17:18:10 +00002564 *
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002565 * Errors are silently ignored, for better or for worse...
Barry Warsaw752300b1997-01-03 17:18:10 +00002566 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002567static void
Fredrik Lundh3c5d43d2000-07-09 15:09:56 +00002568insint(PyObject *d, char *name, int value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002569{
Guido van Rossum73624e91994-10-10 17:59:00 +00002570 PyObject *v = PyInt_FromLong((long) value);
Barry Warsaw752300b1997-01-03 17:18:10 +00002571 if (!v || PyDict_SetItemString(d, name, v))
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002572 PyErr_Clear();
Barry Warsaw752300b1997-01-03 17:18:10 +00002573
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002574 Py_XDECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002575}
2576
Guido van Rossum30a685f1991-06-27 15:51:29 +00002577
Guido van Rossum8d665e61996-06-26 18:22:49 +00002578#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002579
2580/* Additional initialization and cleanup for NT/Windows */
2581
2582static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002583NTcleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002584{
2585 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00002586}
2587
2588static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002589NTinit(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00002590{
2591 WSADATA WSAData;
2592 int ret;
2593 char buf[100];
2594 ret = WSAStartup(0x0101, &WSAData);
2595 switch (ret) {
2596 case 0: /* no error */
2597 atexit(NTcleanup);
2598 return 1;
2599 case WSASYSNOTREADY:
2600 PyErr_SetString(PyExc_ImportError,
2601 "WSAStartup failed: network not ready");
2602 break;
2603 case WSAVERNOTSUPPORTED:
2604 case WSAEINVAL:
2605 PyErr_SetString(PyExc_ImportError,
2606 "WSAStartup failed: requested version not supported");
2607 break;
2608 default:
Tim Peters885d4572001-11-28 20:27:42 +00002609 PyOS_snprintf(buf, sizeof(buf),
2610 "WSAStartup failed: error code %d", ret);
Guido van Rossumbe32c891996-06-20 16:25:29 +00002611 PyErr_SetString(PyExc_ImportError, buf);
2612 break;
2613 }
2614 return 0;
2615}
2616
Guido van Rossum8d665e61996-06-26 18:22:49 +00002617#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00002618
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002619#if defined(PYOS_OS2)
2620
2621/* Additional initialization and cleanup for OS/2 */
2622
2623static void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002624OS2cleanup(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002625{
2626 /* No cleanup is necessary for OS/2 Sockets */
2627}
2628
2629static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002630OS2init(void)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002631{
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002632#if !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002633 char reason[64];
2634 int rc = sock_init();
2635
2636 if (rc == 0) {
Guido van Rossum32c575d1997-12-02 20:37:32 +00002637 atexit(OS2cleanup);
2638 return 1; /* Indicate Success */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002639 }
2640
Tim Peters75cdad52001-11-28 22:07:30 +00002641 PyOS_snprintf(reason, sizeof(reason),
2642 "OS/2 TCP/IP Error# %d", sock_errno());
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002643 PyErr_SetString(PyExc_ImportError, reason);
2644
Guido van Rossum32c575d1997-12-02 20:37:32 +00002645 return 0; /* Indicate Failure */
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002646#else
2647 /* no need to initialise sockets with GCC/EMX */
2648 return 1;
2649#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002650}
2651
2652#endif /* PYOS_OS2 */
2653
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002654/* C API table - always add new things to the end for binary
2655 compatibility. */
2656static
2657PySocketModule_APIObject PySocketModuleAPI =
2658{
2659 &PySocketSock_Type,
2660};
2661
Guido van Rossum30a685f1991-06-27 15:51:29 +00002662/* Initialize this module.
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002663 * This is called when the first 'import socket' is done,
2664 * via a table in config.c, if config.c is compiled with USE_SOCKET
2665 * defined.
2666 *
2667 * For MS_WINDOWS (which means any Windows variant), this module
2668 * is actually called "_socket", and there's a wrapper "socket.py"
2669 * which implements some missing functionality (such as makefile(),
2670 * dup() and fromfd()). The import of "_socket" may fail with an
2671 * ImportError exception if initialization of WINSOCK fails. When
2672 * WINSOCK is initialized succesfully, a call to WSACleanup() is
2673 * scheduled to be made at exit time.
2674 *
2675 * For OS/2, this module is also called "_socket" and uses a wrapper
2676 * "socket.py" which implements that functionality that is missing
2677 * when PC operating systems don't put socket descriptors in the
2678 * operating system's filesystem layer.
2679 */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002680
Guido van Rossum82a5c661998-07-07 20:45:43 +00002681static char module_doc[] =
Fred Drakea136d492000-08-16 14:18:30 +00002682"Implementation module for socket operations. See the socket module\n\
2683for documentation.";
Guido van Rossum82a5c661998-07-07 20:45:43 +00002684
Guido van Rossum3886bb61998-12-04 18:50:17 +00002685DL_EXPORT(void)
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00002686init_socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002687{
Fred Drake4baedc12002-04-01 14:53:37 +00002688 PyObject *m;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002689#ifdef RISCOS
2690 _kernel_swi_regs r;
2691 r.r[0]=0;
2692 _kernel_swi(0x43380, &r, &r);
2693 taskwindow = r.r[0];
2694#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002695#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00002696 if (!NTinit())
2697 return;
Guido van Rossumbe32c891996-06-20 16:25:29 +00002698#else
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002699#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002700 if (!OS2init())
2701 return;
Andrew MacIntyreba43e872002-03-03 03:03:52 +00002702#endif /* PYOS_OS2 */
Fred Drakea136d492000-08-16 14:18:30 +00002703#endif /* MS_WINDOWS */
Guido van Rossum48a680c2001-03-02 06:34:14 +00002704#endif /* RISCOS */
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002705 PySocketSock_Type.ob_type = &PyType_Type;
Michael W. Hudson03f96bd2001-11-09 10:06:23 +00002706 PySocketSock_Type.tp_getattro = PyObject_GenericGetAttr;
2707 PySocketSock_Type.tp_alloc = PyType_GenericAlloc;
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00002708 PySocketSock_Type.tp_free = PyObject_Del;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002709 m = Py_InitModule3(PySocket_MODULE_NAME,
2710 PySocket_methods,
2711 module_doc);
Fred Drake4baedc12002-04-01 14:53:37 +00002712
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002713 PySocket_Error = PyErr_NewException("socket.error", NULL, NULL);
2714 if (PySocket_Error == NULL)
2715 return;
Fred Drake4baedc12002-04-01 14:53:37 +00002716 Py_INCREF(PySocket_Error);
2717 PyModule_AddObject(m, "error", PySocket_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002718 PyH_Error = PyErr_NewException("socket.herror", PySocket_Error, NULL);
2719 if (PyH_Error == NULL)
2720 return;
Fred Drake4baedc12002-04-01 14:53:37 +00002721 Py_INCREF(PyH_Error);
2722 PyModule_AddObject(m, "herror", PyH_Error);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002723 PyGAI_Error = PyErr_NewException("socket.gaierror", PySocket_Error,
2724 NULL);
2725 if (PyGAI_Error == NULL)
2726 return;
Fred Drake4baedc12002-04-01 14:53:37 +00002727 Py_INCREF(PyGAI_Error);
2728 PyModule_AddObject(m, "gaierror", PyGAI_Error);
2729 Py_INCREF((PyObject *)&PySocketSock_Type);
2730 if (PyModule_AddObject(m, "SocketType",
2731 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002732 return;
Fred Drake4baedc12002-04-01 14:53:37 +00002733 Py_INCREF((PyObject *)&PySocketSock_Type);
2734 if (PyModule_AddObject(m, "socket",
2735 (PyObject *)&PySocketSock_Type) != 0)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00002736 return;
Guido van Rossum09be4091999-08-09 14:40:40 +00002737
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002738 /* Export C API */
Fred Drake4baedc12002-04-01 14:53:37 +00002739 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002740 PyCObject_FromVoidPtr((void *)&PySocketModuleAPI, NULL)
2741 ) != 0)
2742 return;
2743
Guido van Rossum09be4091999-08-09 14:40:40 +00002744 /* Address families (we only support AF_INET and AF_UNIX) */
2745#ifdef AF_UNSPEC
Fred Drake4baedc12002-04-01 14:53:37 +00002746 PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00002747#endif
Fred Drake4baedc12002-04-01 14:53:37 +00002748 PyModule_AddIntConstant(m, "AF_INET", AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002749#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00002750 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002751#endif /* AF_INET6 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002752#ifdef AF_UNIX
Fred Drake4baedc12002-04-01 14:53:37 +00002753 PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002754#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002755#ifdef AF_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00002756 /* Amateur Radio AX.25 */
2757 PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00002758#endif
2759#ifdef AF_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00002760 PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00002761#endif
2762#ifdef AF_APPLETALK
Fred Drake4baedc12002-04-01 14:53:37 +00002763 /* Appletalk DDP */
2764 PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00002765#endif
2766#ifdef AF_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00002767 /* Amateur radio NetROM */
2768 PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00002769#endif
2770#ifdef AF_BRIDGE
Fred Drake4baedc12002-04-01 14:53:37 +00002771 /* Multiprotocol bridge */
2772 PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00002773#endif
2774#ifdef AF_AAL5
Fred Drake4baedc12002-04-01 14:53:37 +00002775 /* Reserved for Werner's ATM */
2776 PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00002777#endif
2778#ifdef AF_X25
Fred Drake4baedc12002-04-01 14:53:37 +00002779 /* Reserved for X.25 project */
2780 PyModule_AddIntConstant(m, "AF_X25", AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00002781#endif
2782#ifdef AF_INET6
Fred Drake4baedc12002-04-01 14:53:37 +00002783 PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00002784#endif
2785#ifdef AF_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00002786 /* Amateur Radio X.25 PLP */
2787 PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00002788#endif
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002789#ifdef HAVE_NETPACKET_PACKET_H
Fred Drake4baedc12002-04-01 14:53:37 +00002790 PyModule_AddIntConstant(m, "AF_PACKET", AF_PACKET);
2791 PyModule_AddIntConstant(m, "PF_PACKET", PF_PACKET);
2792 PyModule_AddIntConstant(m, "PACKET_HOST", PACKET_HOST);
2793 PyModule_AddIntConstant(m, "PACKET_BROADCAST", PACKET_BROADCAST);
2794 PyModule_AddIntConstant(m, "PACKET_MULTICAST", PACKET_MULTICAST);
2795 PyModule_AddIntConstant(m, "PACKET_OTHERHOST", PACKET_OTHERHOST);
2796 PyModule_AddIntConstant(m, "PACKET_OUTGOING", PACKET_OUTGOING);
2797 PyModule_AddIntConstant(m, "PACKET_LOOPBACK", PACKET_LOOPBACK);
2798 PyModule_AddIntConstant(m, "PACKET_FASTROUTE", PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00002799#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002800
2801 /* Socket types */
Fred Drake4baedc12002-04-01 14:53:37 +00002802 PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);
2803 PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002804#ifndef __BEOS__
2805/* We have incomplete socket support. */
Fred Drake4baedc12002-04-01 14:53:37 +00002806 PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);
2807 PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);
2808 PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00002809#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002810
2811#ifdef SO_DEBUG
Fred Drake4baedc12002-04-01 14:53:37 +00002812 PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002813#endif
2814#ifdef SO_ACCEPTCONN
Fred Drake4baedc12002-04-01 14:53:37 +00002815 PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002816#endif
2817#ifdef SO_REUSEADDR
Fred Drake4baedc12002-04-01 14:53:37 +00002818 PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002819#endif
2820#ifdef SO_KEEPALIVE
Fred Drake4baedc12002-04-01 14:53:37 +00002821 PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002822#endif
2823#ifdef SO_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00002824 PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002825#endif
2826#ifdef SO_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00002827 PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002828#endif
2829#ifdef SO_USELOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00002830 PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002831#endif
2832#ifdef SO_LINGER
Fred Drake4baedc12002-04-01 14:53:37 +00002833 PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002834#endif
2835#ifdef SO_OOBINLINE
Fred Drake4baedc12002-04-01 14:53:37 +00002836 PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002837#endif
2838#ifdef SO_REUSEPORT
Fred Drake4baedc12002-04-01 14:53:37 +00002839 PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002840#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002841#ifdef SO_SNDBUF
Fred Drake4baedc12002-04-01 14:53:37 +00002842 PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002843#endif
2844#ifdef SO_RCVBUF
Fred Drake4baedc12002-04-01 14:53:37 +00002845 PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002846#endif
2847#ifdef SO_SNDLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00002848 PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002849#endif
2850#ifdef SO_RCVLOWAT
Fred Drake4baedc12002-04-01 14:53:37 +00002851 PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002852#endif
2853#ifdef SO_SNDTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00002854 PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002855#endif
2856#ifdef SO_RCVTIMEO
Fred Drake4baedc12002-04-01 14:53:37 +00002857 PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002858#endif
2859#ifdef SO_ERROR
Fred Drake4baedc12002-04-01 14:53:37 +00002860 PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002861#endif
2862#ifdef SO_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00002863 PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002864#endif
2865
2866 /* Maximum number of connections for "listen" */
2867#ifdef SOMAXCONN
Fred Drake4baedc12002-04-01 14:53:37 +00002868 PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002869#else
Fred Drake4baedc12002-04-01 14:53:37 +00002870 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002871#endif
2872
2873 /* Flags for send, recv */
2874#ifdef MSG_OOB
Fred Drake4baedc12002-04-01 14:53:37 +00002875 PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002876#endif
2877#ifdef MSG_PEEK
Fred Drake4baedc12002-04-01 14:53:37 +00002878 PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002879#endif
2880#ifdef MSG_DONTROUTE
Fred Drake4baedc12002-04-01 14:53:37 +00002881 PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002882#endif
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002883#ifdef MSG_DONTWAIT
Fred Drake4baedc12002-04-01 14:53:37 +00002884 PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00002885#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002886#ifdef MSG_EOR
Fred Drake4baedc12002-04-01 14:53:37 +00002887 PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002888#endif
2889#ifdef MSG_TRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00002890 PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002891#endif
2892#ifdef MSG_CTRUNC
Fred Drake4baedc12002-04-01 14:53:37 +00002893 PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002894#endif
2895#ifdef MSG_WAITALL
Fred Drake4baedc12002-04-01 14:53:37 +00002896 PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002897#endif
2898#ifdef MSG_BTAG
Fred Drake4baedc12002-04-01 14:53:37 +00002899 PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002900#endif
2901#ifdef MSG_ETAG
Fred Drake4baedc12002-04-01 14:53:37 +00002902 PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002903#endif
2904
2905 /* Protocol level and numbers, usable for [gs]etsockopt */
2906#ifdef SOL_SOCKET
Fred Drake4baedc12002-04-01 14:53:37 +00002907 PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002908#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00002909#ifdef SOL_IP
Fred Drake4baedc12002-04-01 14:53:37 +00002910 PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00002911#else
Fred Drake4baedc12002-04-01 14:53:37 +00002912 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00002913#endif
2914#ifdef SOL_IPX
Fred Drake4baedc12002-04-01 14:53:37 +00002915 PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00002916#endif
2917#ifdef SOL_AX25
Fred Drake4baedc12002-04-01 14:53:37 +00002918 PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00002919#endif
2920#ifdef SOL_ATALK
Fred Drake4baedc12002-04-01 14:53:37 +00002921 PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00002922#endif
2923#ifdef SOL_NETROM
Fred Drake4baedc12002-04-01 14:53:37 +00002924 PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00002925#endif
2926#ifdef SOL_ROSE
Fred Drake4baedc12002-04-01 14:53:37 +00002927 PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00002928#endif
2929#ifdef SOL_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00002930 PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00002931#else
Fred Drake4baedc12002-04-01 14:53:37 +00002932 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00002933#endif
2934#ifdef SOL_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00002935 PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00002936#else
Fred Drake4baedc12002-04-01 14:53:37 +00002937 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00002938#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002939#ifdef IPPROTO_IP
Fred Drake4baedc12002-04-01 14:53:37 +00002940 PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00002941#else
Fred Drake4baedc12002-04-01 14:53:37 +00002942 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002943#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002944#ifdef IPPROTO_HOPOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00002945 PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002946#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002947#ifdef IPPROTO_ICMP
Fred Drake4baedc12002-04-01 14:53:37 +00002948 PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00002949#else
Fred Drake4baedc12002-04-01 14:53:37 +00002950 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002951#endif
2952#ifdef IPPROTO_IGMP
Fred Drake4baedc12002-04-01 14:53:37 +00002953 PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002954#endif
2955#ifdef IPPROTO_GGP
Fred Drake4baedc12002-04-01 14:53:37 +00002956 PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002957#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002958#ifdef IPPROTO_IPV4
Fred Drake4baedc12002-04-01 14:53:37 +00002959 PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002960#endif
2961#ifdef IPPROTO_IPIP
Fred Drake4baedc12002-04-01 14:53:37 +00002962 PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002963#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002964#ifdef IPPROTO_TCP
Fred Drake4baedc12002-04-01 14:53:37 +00002965 PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00002966#else
Fred Drake4baedc12002-04-01 14:53:37 +00002967 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002968#endif
2969#ifdef IPPROTO_EGP
Fred Drake4baedc12002-04-01 14:53:37 +00002970 PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002971#endif
2972#ifdef IPPROTO_PUP
Fred Drake4baedc12002-04-01 14:53:37 +00002973 PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002974#endif
2975#ifdef IPPROTO_UDP
Fred Drake4baedc12002-04-01 14:53:37 +00002976 PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00002977#else
Fred Drake4baedc12002-04-01 14:53:37 +00002978 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002979#endif
2980#ifdef IPPROTO_IDP
Fred Drake4baedc12002-04-01 14:53:37 +00002981 PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002982#endif
2983#ifdef IPPROTO_HELLO
Fred Drake4baedc12002-04-01 14:53:37 +00002984 PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002985#endif
2986#ifdef IPPROTO_ND
Fred Drake4baedc12002-04-01 14:53:37 +00002987 PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002988#endif
2989#ifdef IPPROTO_TP
Fred Drake4baedc12002-04-01 14:53:37 +00002990 PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00002991#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002992#ifdef IPPROTO_IPV6
Fred Drake4baedc12002-04-01 14:53:37 +00002993 PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002994#endif
2995#ifdef IPPROTO_ROUTING
Fred Drake4baedc12002-04-01 14:53:37 +00002996 PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00002997#endif
2998#ifdef IPPROTO_FRAGMENT
Fred Drake4baedc12002-04-01 14:53:37 +00002999 PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003000#endif
3001#ifdef IPPROTO_RSVP
Fred Drake4baedc12002-04-01 14:53:37 +00003002 PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003003#endif
3004#ifdef IPPROTO_GRE
Fred Drake4baedc12002-04-01 14:53:37 +00003005 PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003006#endif
3007#ifdef IPPROTO_ESP
Fred Drake4baedc12002-04-01 14:53:37 +00003008 PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003009#endif
3010#ifdef IPPROTO_AH
Fred Drake4baedc12002-04-01 14:53:37 +00003011 PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003012#endif
3013#ifdef IPPROTO_MOBILE
Fred Drake4baedc12002-04-01 14:53:37 +00003014 PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003015#endif
3016#ifdef IPPROTO_ICMPV6
Fred Drake4baedc12002-04-01 14:53:37 +00003017 PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003018#endif
3019#ifdef IPPROTO_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003020 PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003021#endif
3022#ifdef IPPROTO_DSTOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003023 PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003024#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003025#ifdef IPPROTO_XTP
Fred Drake4baedc12002-04-01 14:53:37 +00003026 PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003027#endif
3028#ifdef IPPROTO_EON
Fred Drake4baedc12002-04-01 14:53:37 +00003029 PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003030#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003031#ifdef IPPROTO_PIM
Fred Drake4baedc12002-04-01 14:53:37 +00003032 PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003033#endif
3034#ifdef IPPROTO_IPCOMP
Fred Drake4baedc12002-04-01 14:53:37 +00003035 PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003036#endif
3037#ifdef IPPROTO_VRRP
Fred Drake4baedc12002-04-01 14:53:37 +00003038 PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003039#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003040#ifdef IPPROTO_BIP
Fred Drake4baedc12002-04-01 14:53:37 +00003041 PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003042#endif
3043/**/
3044#ifdef IPPROTO_RAW
Fred Drake4baedc12002-04-01 14:53:37 +00003045 PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00003046#else
Fred Drake4baedc12002-04-01 14:53:37 +00003047 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003048#endif
3049#ifdef IPPROTO_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003050 PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003051#endif
3052
3053 /* Some port configuration */
3054#ifdef IPPORT_RESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003055 PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003056#else
Fred Drake4baedc12002-04-01 14:53:37 +00003057 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003058#endif
3059#ifdef IPPORT_USERRESERVED
Fred Drake4baedc12002-04-01 14:53:37 +00003060 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003061#else
Fred Drake4baedc12002-04-01 14:53:37 +00003062 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003063#endif
3064
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003065 /* Some reserved IP v.4 addresses */
3066#ifdef INADDR_ANY
Fred Drake4baedc12002-04-01 14:53:37 +00003067 PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003068#else
Fred Drake4baedc12002-04-01 14:53:37 +00003069 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003070#endif
3071#ifdef INADDR_BROADCAST
Fred Drake4baedc12002-04-01 14:53:37 +00003072 PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003073#else
Fred Drake4baedc12002-04-01 14:53:37 +00003074 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003075#endif
3076#ifdef INADDR_LOOPBACK
Fred Drake4baedc12002-04-01 14:53:37 +00003077 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003078#else
Fred Drake4baedc12002-04-01 14:53:37 +00003079 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003080#endif
3081#ifdef INADDR_UNSPEC_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003082 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003083#else
Fred Drake4baedc12002-04-01 14:53:37 +00003084 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003085#endif
3086#ifdef INADDR_ALLHOSTS_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003087 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
3088 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003089#else
Fred Drake4baedc12002-04-01 14:53:37 +00003090 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003091#endif
3092#ifdef INADDR_MAX_LOCAL_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003093 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",
3094 INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003095#else
Fred Drake4baedc12002-04-01 14:53:37 +00003096 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003097#endif
3098#ifdef INADDR_NONE
Fred Drake4baedc12002-04-01 14:53:37 +00003099 PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003100#else
Fred Drake4baedc12002-04-01 14:53:37 +00003101 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00003102#endif
3103
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003104 /* IPv4 [gs]etsockopt options */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003105#ifdef IP_OPTIONS
Fred Drake4baedc12002-04-01 14:53:37 +00003106 PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003107#endif
3108#ifdef IP_HDRINCL
Fred Drake4baedc12002-04-01 14:53:37 +00003109 PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003110#endif
3111#ifdef IP_TOS
Fred Drake4baedc12002-04-01 14:53:37 +00003112 PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003113#endif
3114#ifdef IP_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003115 PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003116#endif
3117#ifdef IP_RECVOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003118 PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003119#endif
3120#ifdef IP_RECVRETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003121 PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003122#endif
3123#ifdef IP_RECVDSTADDR
Fred Drake4baedc12002-04-01 14:53:37 +00003124 PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003125#endif
3126#ifdef IP_RETOPTS
Fred Drake4baedc12002-04-01 14:53:37 +00003127 PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003128#endif
3129#ifdef IP_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003130 PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003131#endif
3132#ifdef IP_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003133 PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003134#endif
3135#ifdef IP_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003136 PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003137#endif
3138#ifdef IP_ADD_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003139 PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003140#endif
3141#ifdef IP_DROP_MEMBERSHIP
Fred Drake4baedc12002-04-01 14:53:37 +00003142 PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00003143#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00003144#ifdef IP_DEFAULT_MULTICAST_TTL
Fred Drake4baedc12002-04-01 14:53:37 +00003145 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",
3146 IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00003147#endif
3148#ifdef IP_DEFAULT_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003149 PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",
3150 IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00003151#endif
3152#ifdef IP_MAX_MEMBERSHIPS
Fred Drake4baedc12002-04-01 14:53:37 +00003153 PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00003154#endif
3155
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003156 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
3157#ifdef IPV6_JOIN_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003158 PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003159#endif
3160#ifdef IPV6_LEAVE_GROUP
Fred Drake4baedc12002-04-01 14:53:37 +00003161 PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003162#endif
3163#ifdef IPV6_MULTICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003164 PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003165#endif
3166#ifdef IPV6_MULTICAST_IF
Fred Drake4baedc12002-04-01 14:53:37 +00003167 PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003168#endif
3169#ifdef IPV6_MULTICAST_LOOP
Fred Drake4baedc12002-04-01 14:53:37 +00003170 PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003171#endif
3172#ifdef IPV6_UNICAST_HOPS
Fred Drake4baedc12002-04-01 14:53:37 +00003173 PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00003174#endif
3175
Guido van Rossum09be4091999-08-09 14:40:40 +00003176 /* TCP options */
3177#ifdef TCP_NODELAY
Fred Drake4baedc12002-04-01 14:53:37 +00003178 PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00003179#endif
3180#ifdef TCP_MAXSEG
Fred Drake4baedc12002-04-01 14:53:37 +00003181 PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00003182#endif
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003183#ifdef TCP_CORK
Fred Drake4baedc12002-04-01 14:53:37 +00003184 PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003185#endif
3186#ifdef TCP_KEEPIDLE
Fred Drake4baedc12002-04-01 14:53:37 +00003187 PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003188#endif
3189#ifdef TCP_KEEPINTVL
Fred Drake4baedc12002-04-01 14:53:37 +00003190 PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003191#endif
3192#ifdef TCP_KEEPCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003193 PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003194#endif
3195#ifdef TCP_SYNCNT
Fred Drake4baedc12002-04-01 14:53:37 +00003196 PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003197#endif
3198#ifdef TCP_LINGER2
Fred Drake4baedc12002-04-01 14:53:37 +00003199 PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003200#endif
3201#ifdef TCP_DEFER_ACCEPT
Fred Drake4baedc12002-04-01 14:53:37 +00003202 PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003203#endif
3204#ifdef TCP_WINDOW_CLAMP
Fred Drake4baedc12002-04-01 14:53:37 +00003205 PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003206#endif
3207#ifdef TCP_INFO
Fred Drake4baedc12002-04-01 14:53:37 +00003208 PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003209#endif
3210#ifdef TCP_QUICKACK
Fred Drake4baedc12002-04-01 14:53:37 +00003211 PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00003212#endif
3213
Guido van Rossum09be4091999-08-09 14:40:40 +00003214
3215 /* IPX options */
3216#ifdef IPX_TYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003217 PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00003218#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003219
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003220 /* get{addr,name}info parameters */
3221#ifdef EAI_ADDRFAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003222 PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003223#endif
3224#ifdef EAI_AGAIN
Fred Drake4baedc12002-04-01 14:53:37 +00003225 PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003226#endif
3227#ifdef EAI_BADFLAGS
Fred Drake4baedc12002-04-01 14:53:37 +00003228 PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003229#endif
3230#ifdef EAI_FAIL
Fred Drake4baedc12002-04-01 14:53:37 +00003231 PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003232#endif
3233#ifdef EAI_FAMILY
Fred Drake4baedc12002-04-01 14:53:37 +00003234 PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003235#endif
3236#ifdef EAI_MEMORY
Fred Drake4baedc12002-04-01 14:53:37 +00003237 PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003238#endif
3239#ifdef EAI_NODATA
Fred Drake4baedc12002-04-01 14:53:37 +00003240 PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003241#endif
3242#ifdef EAI_NONAME
Fred Drake4baedc12002-04-01 14:53:37 +00003243 PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003244#endif
3245#ifdef EAI_SERVICE
Fred Drake4baedc12002-04-01 14:53:37 +00003246 PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003247#endif
3248#ifdef EAI_SOCKTYPE
Fred Drake4baedc12002-04-01 14:53:37 +00003249 PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003250#endif
3251#ifdef EAI_SYSTEM
Fred Drake4baedc12002-04-01 14:53:37 +00003252 PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003253#endif
3254#ifdef EAI_BADHINTS
Fred Drake4baedc12002-04-01 14:53:37 +00003255 PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003256#endif
3257#ifdef EAI_PROTOCOL
Fred Drake4baedc12002-04-01 14:53:37 +00003258 PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003259#endif
3260#ifdef EAI_MAX
Fred Drake4baedc12002-04-01 14:53:37 +00003261 PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003262#endif
3263#ifdef AI_PASSIVE
Fred Drake4baedc12002-04-01 14:53:37 +00003264 PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003265#endif
3266#ifdef AI_CANONNAME
Fred Drake4baedc12002-04-01 14:53:37 +00003267 PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003268#endif
3269#ifdef AI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003270 PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003271#endif
3272#ifdef AI_MASK
Fred Drake4baedc12002-04-01 14:53:37 +00003273 PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003274#endif
3275#ifdef AI_ALL
Fred Drake4baedc12002-04-01 14:53:37 +00003276 PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003277#endif
3278#ifdef AI_V4MAPPED_CFG
Fred Drake4baedc12002-04-01 14:53:37 +00003279 PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003280#endif
3281#ifdef AI_ADDRCONFIG
Fred Drake4baedc12002-04-01 14:53:37 +00003282 PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003283#endif
3284#ifdef AI_V4MAPPED
Fred Drake4baedc12002-04-01 14:53:37 +00003285 PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003286#endif
3287#ifdef AI_DEFAULT
Fred Drake4baedc12002-04-01 14:53:37 +00003288 PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003289#endif
3290#ifdef NI_MAXHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003291 PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003292#endif
3293#ifdef NI_MAXSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003294 PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003295#endif
3296#ifdef NI_NOFQDN
Fred Drake4baedc12002-04-01 14:53:37 +00003297 PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003298#endif
3299#ifdef NI_NUMERICHOST
Fred Drake4baedc12002-04-01 14:53:37 +00003300 PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003301#endif
3302#ifdef NI_NAMEREQD
Fred Drake4baedc12002-04-01 14:53:37 +00003303 PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003304#endif
3305#ifdef NI_NUMERICSERV
Fred Drake4baedc12002-04-01 14:53:37 +00003306 PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003307#endif
3308#ifdef NI_DGRAM
Fred Drake4baedc12002-04-01 14:53:37 +00003309 PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00003310#endif
3311
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003312 /* Initialize gethostbyname lock */
Guido van Rossum3baaa131999-03-22 21:44:51 +00003313#ifdef USE_GETHOSTBYNAME_LOCK
Guido van Rossum65d5b571998-12-21 19:32:43 +00003314 gethostbyname_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00003315#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003316}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003317
3318/* Simplistic emulation code for inet_pton that only works for IPv4 */
3319#ifndef HAVE_INET_PTON
Martin v. Löwisa2ca1ae2001-06-24 21:35:43 +00003320int
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003321inet_pton (int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003322{
3323 if(af == AF_INET){
3324 long packed_addr;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003325 packed_addr = inet_addr(src);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003326 if (packed_addr == INADDR_NONE)
3327 return 0;
3328 memcpy(dst, &packed_addr, 4);
3329 return 1;
3330 }
3331 /* Should set errno to EAFNOSUPPORT */
3332 return -1;
3333}
3334
Martin v. Löwisc925b1532001-07-21 09:42:15 +00003335const char *
3336inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00003337{
3338 if (af == AF_INET) {
3339 struct in_addr packed_addr;
3340 if (size < 16)
3341 /* Should set errno to ENOSPC. */
3342 return NULL;
3343 memcpy(&packed_addr, src, sizeof(packed_addr));
3344 return strncpy(dst, inet_ntoa(packed_addr), size);
3345 }
3346 /* Should set errno to EAFNOSUPPORT */
3347 return NULL;
3348}
3349#endif