blob: 981787272635c876e62a00dbae99783e87c7ff35 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum6574b3e1991-06-25 21:36:08 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum6574b3e1991-06-25 21:36:08 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000029
30******************************************************************/
31
32/* Socket module */
33
34/*
35This module provides an interface to Berkeley socket IPC.
36
37Limitations:
38
Guido van Rossum30a685f1991-06-27 15:51:29 +000039- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000040- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000041- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000042
Guido van Rossum27e177d1995-03-16 15:43:47 +000043Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044
Guido van Rossum27e177d1995-03-16 15:43:47 +000045- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000046- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000047- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000049- socket.getprotobyname(protocolname) --> protocol number
Guido van Rossum27e177d1995-03-16 15:43:47 +000050- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000051- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000052- socket.ntohs(16 bit value) --> new int object
53- socket.ntohl(32 bit value) --> new int object
54- socket.htons(16 bit value) --> new int object
55- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000056- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000057- an Internet socket address is a pair (hostname, port)
58 where hostname can be anything recognized by gethostbyname()
59 (including the dd.dd.dd.dd notation) and port is in host byte order
60- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000061- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000062
Guido van Rossum30a685f1991-06-27 15:51:29 +000063Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000064
Guido van Rossum81194471991-07-27 21:42:02 +000065- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- s.bind(sockaddr) --> None
67- s.close() --> None
68- s.connect(sockaddr) --> None
69- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000070- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000071- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000072- s.getsockname() --> sockaddr
73- s.getsockopt(level, optname[, buflen]) --> int or string
74- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000075- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000076- s.recv(buflen [,flags]) --> string
77- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000078- s.send(string [,flags]) --> nbytes
79- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000080- s.setblocking(0 | 1) --> None
81- s.setsockopt(level, optname, value) --> None
82- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000083- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000084
Guido van Rossum6574b3e1991-06-25 21:36:08 +000085*/
86
Guido van Rossum73624e91994-10-10 17:59:00 +000087#include "Python.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000088
Guido van Rossuma376cc51996-12-05 23:43:35 +000089#ifdef HAVE_UNISTD_H
90#include <unistd.h>
91#endif
92
Guido van Rossumfb4130d1996-12-10 15:17:08 +000093#ifndef MS_WINDOWS
94extern int gethostname(); /* For Solaris, at least */
95#endif
96
Guido van Rossumb6775db1994-08-01 11:34:53 +000097#include <sys/types.h>
98#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000099
Guido van Rossum81194471991-07-27 21:42:02 +0000100#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +0000101#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000102#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000103#include <sys/socket.h>
104#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +0000105#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000106#else
107#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000108#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000109#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000110#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000111#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000112#else
113#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +0000114#endif
115
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000116#ifndef O_NDELAY
117#define O_NDELAY O_NONBLOCK /* For QNX only? */
118#endif
119
Jack Jansen508537b1996-02-14 15:57:45 +0000120#ifdef USE_GUSI
121/* fdopen() isn't declared in stdio.h (sigh) */
122#include <GUSI.h>
123#endif
124
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000125
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000126/* Here we have some hacks to choose between K&R or ANSI style function
127 definitions. For NT to build this as an extension module (ie, DLL)
128 it must be compiled by the C++ compiler, as it takes the address of
129 a static data item exported from the main Python DLL.
130*/
Guido van Rossum8d665e61996-06-26 18:22:49 +0000131#ifdef MS_WINDOWS
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000132/* seem to be a few differences in the API */
133#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000134#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000135#define FORCE_ANSI_FUNC_DEFS
136#endif
137
138#ifdef FORCE_ANSI_FUNC_DEFS
139#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
140fnname( arg1type arg1name )
141
142#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
143fnname( arg1type arg1name, arg2type arg2name )
144
145#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
146fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
147
148#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
149fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
150
151#else /* !FORCE_ANSI_FN_DEFS */
152#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
153fnname( arg1name ) \
154 arg1type arg1name;
155
156#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
157fnname( arg1name, arg2name ) \
158 arg1type arg1name; \
159 arg2type arg2name;
160
161#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
162fnname( arg1name, arg2name, arg3name ) \
163 arg1type arg1name; \
164 arg2type arg2name; \
165 arg3type arg3name;
166
167#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
168fnname( arg1name, arg2name, arg3name, arg4name ) \
169 arg1type arg1name; \
170 arg2type arg2name; \
171 arg3type arg3name; \
172 arg4type arg4name;
173
174#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000175
176/* Global variable holding the exception type for errors detected
177 by this module (but not argument type or memory errors, etc.). */
178
Guido van Rossum73624e91994-10-10 17:59:00 +0000179static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000180
181
182/* Convenience function to raise an error according to errno
183 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000184
Guido van Rossum73624e91994-10-10 17:59:00 +0000185static PyObject *
186PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000187{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000188#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000189 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000190 PyObject *v;
191 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000192 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000193 PyErr_SetObject(PySocket_Error, v);
194 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000195 }
196 return NULL;
197 }
198 else
199#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000200 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000201}
202
Guido van Rossum30a685f1991-06-27 15:51:29 +0000203
204/* The object holding a socket. It holds some extra information,
205 like the address family, which is used to decode socket address
206 arguments properly. */
207
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000208typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000209 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000210 int sock_fd; /* Socket file descriptor */
211 int sock_family; /* Address family, e.g., AF_INET */
212 int sock_type; /* Socket type, e.g., SOCK_STREAM */
213 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000214 union sock_addr {
215 struct sockaddr_in in;
216#ifdef AF_UNIX
217 struct sockaddr_un un;
218#endif
219 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000220} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000221
Guido van Rossum30a685f1991-06-27 15:51:29 +0000222
223/* A forward reference to the Socktype type object.
224 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000225 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000226 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000227
Guido van Rossum73624e91994-10-10 17:59:00 +0000228staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000229
Guido van Rossum30a685f1991-06-27 15:51:29 +0000230
231/* Create a new socket object.
232 This just creates the object and initializes it.
233 If the creation fails, return NULL and set an exception (implicit
234 in NEWOBJ()). */
235
Guido van Rossum73624e91994-10-10 17:59:00 +0000236static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000237BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000238{
Guido van Rossum73624e91994-10-10 17:59:00 +0000239 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000240 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000241 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000242 if (s != NULL) {
243 s->sock_fd = fd;
244 s->sock_family = family;
245 s->sock_type = type;
246 s->sock_proto = proto;
247 }
248 return s;
249}
250
Guido van Rossum30a685f1991-06-27 15:51:29 +0000251
252/* Convert a string specifying a host name or one of a few symbolic
253 names to a numeric IP address. This usually calls gethostbyname()
254 to do the work; the names "" and "<broadcast>" are special.
255 Return the length (should always be 4 bytes), or negative if
256 an error occurred; then an exception is raised. */
257
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000258static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000259BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000260{
261 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000262 int d1, d2, d3, d4;
263 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000264#ifdef HAVE_GETHOSTBYNAME_R
265 struct hostent hp_allocated;
266 char buf[1001];
267 int buf_len = (sizeof buf) - 1;
268 int errnop;
269#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000270
Guido van Rossuma376cc51996-12-05 23:43:35 +0000271 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
Guido van Rossum30a685f1991-06-27 15:51:29 +0000272 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000273 addr_ret->sin_addr.s_addr = INADDR_ANY;
274 return 4;
275 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000276 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000277 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
278 return 4;
279 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000280 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
281 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
282 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
283 addr_ret->sin_addr.s_addr = htonl(
284 ((long) d1 << 24) | ((long) d2 << 16) |
285 ((long) d3 << 8) | ((long) d4 << 0));
286 return 4;
287 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000288#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000289 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000290 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000291 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000292#else /* not HAVE_GETHOSTBYNAME_R */
293 hp = gethostbyname(name);
294#endif /* HAVE_GETHOSTBYNAME_R */
295
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000296 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000297#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298 /* Let's get real error message to return */
299 extern int h_errno;
300 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
301#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000302 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000303#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000304 return -1;
305 }
306 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
307 return hp->h_length;
308}
309
Guido van Rossum30a685f1991-06-27 15:51:29 +0000310
Guido van Rossum30a685f1991-06-27 15:51:29 +0000311/* Create a string object representing an IP address.
312 This is always a string of the form 'dd.dd.dd.dd' (with variable
313 size numbers). */
314
Guido van Rossum73624e91994-10-10 17:59:00 +0000315static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000316BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000317{
318 long x = ntohl(addr->sin_addr.s_addr);
319 char buf[100];
320 sprintf(buf, "%d.%d.%d.%d",
321 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
322 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000323 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000324}
325
326
327/* Create an object representing the given socket address,
328 suitable for passing it back to bind(), connect() etc.
329 The family field of the sockaddr structure is inspected
330 to determine what kind of address it really is. */
331
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000332/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000333static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000334BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000335{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000336 if (addrlen == 0) {
337 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000338 Py_INCREF(Py_None);
339 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000340 }
341
Guido van Rossum30a685f1991-06-27 15:51:29 +0000342 switch (addr->sa_family) {
343
344 case AF_INET:
345 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000346 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000347 PyObject *addr = makeipaddr(a);
348 PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
349 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000350 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000351 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000352
Guido van Rossumb6775db1994-08-01 11:34:53 +0000353#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000354 case AF_UNIX:
355 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000356 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000357 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000358 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000359#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000360
361 /* More cases here... */
362
363 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000364 PyErr_SetString(PySocket_Error, "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000365 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000366
Guido van Rossum30a685f1991-06-27 15:51:29 +0000367 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000368}
369
Guido van Rossum30a685f1991-06-27 15:51:29 +0000370
371/* Parse a socket address argument according to the socket object's
372 address family. Return 1 if the address was in the proper format,
373 0 of not. The address is returned through addr_ret, its length
374 through len_ret. */
375
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000376static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000377BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000378getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000379{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000380 switch (s->sock_family) {
381
Guido van Rossumb6775db1994-08-01 11:34:53 +0000382#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000383 case AF_UNIX:
384 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000385 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000386 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000387 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000388 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000389 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000390 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000391 if (len > sizeof addr->sun_path) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000392 PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000393 return 0;
394 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000395 addr->sun_family = AF_UNIX;
396 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000397 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000398 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000399 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000400 return 1;
401 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000402#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000403
Guido van Rossum30a685f1991-06-27 15:51:29 +0000404 case AF_INET:
405 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000406 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000407 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000408 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000409 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000410 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000411 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000412 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000413 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000414 addr->sin_family = AF_INET;
415 addr->sin_port = htons(port);
416 *addr_ret = (struct sockaddr *) addr;
417 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000418 return 1;
419 }
420
Guido van Rossum30a685f1991-06-27 15:51:29 +0000421 /* More cases here... */
422
423 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000424 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000425 return 0;
426
427 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000428}
429
Guido van Rossum30a685f1991-06-27 15:51:29 +0000430
Guido van Rossum710e1df1992-06-12 10:39:36 +0000431/* Get the address length according to the socket object's address family.
432 Return 1 if the family is known, 0 otherwise. The length is returned
433 through len_ret. */
434
435static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000436BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000437{
438 switch (s->sock_family) {
439
Guido van Rossumb6775db1994-08-01 11:34:53 +0000440#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000441 case AF_UNIX:
442 {
443 *len_ret = sizeof (struct sockaddr_un);
444 return 1;
445 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000446#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000447
448 case AF_INET:
449 {
450 *len_ret = sizeof (struct sockaddr_in);
451 return 1;
452 }
453
454 /* More cases here... */
455
456 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000457 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000458 return 0;
459
460 }
461}
462
463
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464/* s.accept() method */
465
Guido van Rossum73624e91994-10-10 17:59:00 +0000466static PyObject *
467BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000468{
469 char addrbuf[256];
470 int addrlen, newfd;
Guido van Rossum73624e91994-10-10 17:59:00 +0000471 PyObject *sock, *addr, *res;
472 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000473 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000474 if (!getsockaddrlen(s, &addrlen))
475 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000476 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000477 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000478 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000479 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000480 return PySocket_Err();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000481 /* Create the new object with unspecified family,
482 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000483 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000484 s->sock_family,
485 s->sock_type,
486 s->sock_proto);
487 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000488 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000489 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000490 res = Py_BuildValue("OO", sock, addr);
491 Py_XDECREF(sock);
492 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000493 return res;
494}
495
Guido van Rossum30a685f1991-06-27 15:51:29 +0000496
Guido van Rossume4485b01994-09-07 14:32:49 +0000497/* s.setblocking(1 | 0) method */
498
Guido van Rossum73624e91994-10-10 17:59:00 +0000499static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000500BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000501{
502 int block;
503 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000504 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000505 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000506 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000507#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000508 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
509 if (block)
510 delay_flag &= (~O_NDELAY);
511 else
512 delay_flag |= O_NDELAY;
513 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000514#else
515 block = !block;
516 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
517#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000518 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000519
Guido van Rossum73624e91994-10-10 17:59:00 +0000520 Py_INCREF(Py_None);
521 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000522}
Guido van Rossume4485b01994-09-07 14:32:49 +0000523
524
Guido van Rossumaee08791992-09-08 09:05:33 +0000525/* s.setsockopt() method.
526 With an integer third argument, sets an integer option.
527 With a string third argument, sets an option from a buffer;
528 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000529
Guido van Rossum73624e91994-10-10 17:59:00 +0000530static PyObject *
531BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000532{
533 int level;
534 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000535 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000536 char *buf;
537 int buflen;
538 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000539
Guido van Rossum73624e91994-10-10 17:59:00 +0000540 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000541 buf = (char *) &flag;
542 buflen = sizeof flag;
543 }
544 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000545 PyErr_Clear();
546 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000547 return NULL;
548 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000549 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000550 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000551 return PySocket_Err();
552 Py_INCREF(Py_None);
553 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000554}
555
556
Guido van Rossumaee08791992-09-08 09:05:33 +0000557/* s.getsockopt() method.
558 With two arguments, retrieves an integer option.
559 With a third integer argument, retrieves a string buffer of that size;
560 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000561
Guido van Rossum73624e91994-10-10 17:59:00 +0000562static PyObject *
563BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000564{
565 int level;
566 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000567 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000568 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000569 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000570
Guido van Rossumbe32c891996-06-20 16:25:29 +0000571 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
572 return NULL;
573
574 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000575 int flag = 0;
576 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000577 res = getsockopt(s->sock_fd, level, optname,
578 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000579 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000580 return PySocket_Err();
581 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000582 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000583 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000584 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000585 return NULL;
586 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000587 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000588 if (buf == NULL)
589 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000590 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000591 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000592 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000593 Py_DECREF(buf);
594 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000595 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000596 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000597 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000598}
599
600
Guido van Rossum30a685f1991-06-27 15:51:29 +0000601/* s.bind(sockaddr) method */
602
Guido van Rossum73624e91994-10-10 17:59:00 +0000603static PyObject *
604BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000605{
606 struct sockaddr *addr;
607 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000608 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000609 if (!getsockaddrarg(s, args, &addr, &addrlen))
610 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000612 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000614 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000615 return PySocket_Err();
616 Py_INCREF(Py_None);
617 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000618}
619
Guido van Rossum30a685f1991-06-27 15:51:29 +0000620
621/* s.close() method.
622 Set the file descriptor to -1 so operations tried subsequently
623 will surely fail. */
624
Guido van Rossum73624e91994-10-10 17:59:00 +0000625static PyObject *
626BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627{
Guido van Rossum73624e91994-10-10 17:59:00 +0000628 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629 return NULL;
Guido van Rossum08481461996-10-12 14:07:22 +0000630 if (s->sock_fd != -1) {
631 Py_BEGIN_ALLOW_THREADS
632 (void) close(s->sock_fd);
633 Py_END_ALLOW_THREADS
634 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000635 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000636 Py_INCREF(Py_None);
637 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000638}
639
Guido van Rossum30a685f1991-06-27 15:51:29 +0000640
641/* s.connect(sockaddr) method */
642
Guido van Rossum73624e91994-10-10 17:59:00 +0000643static PyObject *
644BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000645{
646 struct sockaddr *addr;
647 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000648 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000649 if (!getsockaddrarg(s, args, &addr, &addrlen))
650 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000651 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000652 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000653 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000654 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000655 return PySocket_Err();
656 Py_INCREF(Py_None);
657 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000658}
659
Guido van Rossum30a685f1991-06-27 15:51:29 +0000660
Guido van Rossumed233a51992-06-23 09:07:03 +0000661/* s.fileno() method */
662
Guido van Rossum73624e91994-10-10 17:59:00 +0000663static PyObject *
664BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000665{
Guido van Rossum73624e91994-10-10 17:59:00 +0000666 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000667 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000668 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000669}
670
671
Guido van Rossumbe32c891996-06-20 16:25:29 +0000672#ifndef NO_DUP
673/* s.dup() method */
674
675static PyObject *
676BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
677{
678 int newfd;
679 PyObject *sock;
680 if (!PyArg_NoArgs(args))
681 return NULL;
682 newfd = dup(s->sock_fd);
683 if (newfd < 0)
684 return PySocket_Err();
685 sock = (PyObject *) PySocketSock_New(newfd,
686 s->sock_family,
687 s->sock_type,
688 s->sock_proto);
689 if (sock == NULL)
690 close(newfd);
691 return sock;
692}
693#endif
694
695
Guido van Rossumc89705d1992-11-26 08:54:07 +0000696/* s.getsockname() method */
697
Guido van Rossum73624e91994-10-10 17:59:00 +0000698static PyObject *
699BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000700{
701 char addrbuf[256];
702 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000703 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000704 return NULL;
705 if (!getsockaddrlen(s, &addrlen))
706 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000707 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000708 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000709 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000710 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000711 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000712 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000713 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
714}
715
716
Guido van Rossumb6775db1994-08-01 11:34:53 +0000717#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000718/* s.getpeername() method */
719
Guido van Rossum73624e91994-10-10 17:59:00 +0000720static PyObject *
721BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000722{
723 char addrbuf[256];
724 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000725 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000726 return NULL;
727 if (!getsockaddrlen(s, &addrlen))
728 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000729 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000730 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000731 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000732 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000733 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000734 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
735}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000736#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000737
738
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739/* s.listen(n) method */
740
Guido van Rossum73624e91994-10-10 17:59:00 +0000741static PyObject *
742BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000743{
744 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000745 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000746 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000747 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000748 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000749 if (backlog < 1)
750 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000751 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000752 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000753 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000754 return PySocket_Err();
755 Py_INCREF(Py_None);
756 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000757}
758
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000759#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000760/* s.makefile(mode) method.
761 Create a new open file object referring to a dupped version of
762 the socket's file descriptor. (The dup() call is necessary so
763 that the open file and socket objects may be closed independent
764 of each other.)
765 The mode argument specifies 'r' or 'w' passed to fdopen(). */
766
Guido van Rossum73624e91994-10-10 17:59:00 +0000767static PyObject *
768BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000770 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000771 char *mode = "r";
772 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000773 int fd;
774 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000775 PyObject *f;
776
777 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +0000779#ifdef MS_WIN32
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000780 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
781 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
782#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000784 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000785#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000786 if (fd >= 0)
787 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000788 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000789 }
790 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
791 if (f != NULL)
792 PyFile_SetBufSize(f, bufsize);
793 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000794}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000795#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000796
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000797/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798
Guido van Rossum73624e91994-10-10 17:59:00 +0000799static PyObject *
800BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000801{
Guido van Rossumbe32c891996-06-20 16:25:29 +0000802 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000803 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000804 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
805 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807 if (buf == NULL)
808 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000809 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000810 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000811 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000812 if (n < 0) {
813 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000814 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000815 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000816 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000817 return NULL;
818 return buf;
819}
820
Guido van Rossum30a685f1991-06-27 15:51:29 +0000821
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000822/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823
Guido van Rossum73624e91994-10-10 17:59:00 +0000824static PyObject *
825BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826{
827 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000828 PyObject *buf, *addr, *ret;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000829 int addrlen, len, n, flags = 0;
830 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
831 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000832 if (!getsockaddrlen(s, &addrlen))
833 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000834 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000835 if (buf == NULL)
836 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000837 Py_BEGIN_ALLOW_THREADS
838 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +0000839#ifndef MS_WINDOWS
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000840 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000841#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000842 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000843#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000844 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000845 if (n < 0) {
846 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000847 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000848 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000849 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000850 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000851 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000852 ret = Py_BuildValue("OO", buf, addr);
853 Py_XDECREF(addr);
854 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000855 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000856}
857
Guido van Rossum30a685f1991-06-27 15:51:29 +0000858
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000859/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000860
Guido van Rossum73624e91994-10-10 17:59:00 +0000861static PyObject *
862BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000863{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000864 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000865 int len, n, flags = 0;
866 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
867 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000868 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000869 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000870 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000871 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 return PySocket_Err();
873 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000874}
875
876
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000877/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000878
Guido van Rossum73624e91994-10-10 17:59:00 +0000879static PyObject *
880BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000881{
Guido van Rossum73624e91994-10-10 17:59:00 +0000882 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000883 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000884 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000885 int addrlen, len, n, flags;
886 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000887 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
888 PyErr_Clear();
889 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000890 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000891 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000892 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000893 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000894 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000895 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000896 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000898 return PySocket_Err();
899 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000900}
901
Guido van Rossum30a685f1991-06-27 15:51:29 +0000902
903/* s.shutdown(how) method */
904
Guido van Rossum73624e91994-10-10 17:59:00 +0000905static PyObject *
906BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000907{
908 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000909 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000911 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000912 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000913 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000914 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000915 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000916 return PySocket_Err();
917 Py_INCREF(Py_None);
918 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919}
920
Guido van Rossum30a685f1991-06-27 15:51:29 +0000921
922/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000923
Guido van Rossum73624e91994-10-10 17:59:00 +0000924static PyMethodDef PySocketSock_methods[] = {
925 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000926 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000927 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000928 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000929 {"bind", (PyCFunction)PySocketSock_bind},
930 {"close", (PyCFunction)PySocketSock_close},
931 {"connect", (PyCFunction)PySocketSock_connect},
932 {"fileno", (PyCFunction)PySocketSock_fileno},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000933#ifndef NO_DUP
934 {"dup", (PyCFunction)PySocketSock_dup},
935#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000936 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000937#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000939#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000940 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000941#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000942 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000943#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +0000944 {"recv", (PyCFunction)PySocketSock_recv, 1},
945 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1},
946 {"send", (PyCFunction)PySocketSock_send, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000947 {"sendto", (PyCFunction)PySocketSock_sendto},
948 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000949 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000950};
951
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952
Guido van Rossum73624e91994-10-10 17:59:00 +0000953/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000954 First close the file description. */
955
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000956static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000957BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000958{
959 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000960 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000961}
962
Guido van Rossum30a685f1991-06-27 15:51:29 +0000963
964/* Return a socket object's named attribute. */
965
Guido van Rossum73624e91994-10-10 17:59:00 +0000966static PyObject *
967BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000968{
Guido van Rossum73624e91994-10-10 17:59:00 +0000969 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970}
971
Guido van Rossum30a685f1991-06-27 15:51:29 +0000972
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000973static PyObject *
974BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
975{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000976 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000977 sprintf(buf,
978 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
979 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +0000980 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000981}
982
983
Guido van Rossumb6775db1994-08-01 11:34:53 +0000984/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000985
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +0000987 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000988 0,
989 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000990 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000991 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000992 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000993 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000994 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000995 0, /*tp_setattr*/
996 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000997 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000998 0, /*tp_as_number*/
999 0, /*tp_as_sequence*/
1000 0, /*tp_as_mapping*/
1001};
1002
Guido van Rossum30a685f1991-06-27 15:51:29 +00001003
Guido van Rossum81194471991-07-27 21:42:02 +00001004/* Python interface to gethostname(). */
1005
1006/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001007static PyObject *
1008BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +00001009{
1010 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +00001011 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +00001012 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +00001013 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001014 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001015 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001016 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001017 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001018 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001019 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001020 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001021}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001022
1023
Guido van Rossum30a685f1991-06-27 15:51:29 +00001024/* Python interface to gethostbyname(name). */
1025
1026/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001027static PyObject *
1028BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001029{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001030 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001031 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001032 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001033 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001034 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001035 return NULL;
1036 return makeipaddr(&addrbuf);
1037}
1038
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001039/* Python interface to gethostbyaddr(IP). */
1040
1041/*ARGSUSED*/
1042static PyObject *
1043BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1044{
1045 struct sockaddr_in addr;
1046 char *ip_num;
1047 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001048 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001049 PyObject *rtn_tuple = (PyObject *)NULL;
1050 PyObject *name_list = (PyObject *)NULL;
1051 PyObject *addr_list = (PyObject *)NULL;
1052 PyObject *tmp;
1053
1054 if (!PyArg_Parse(args, "s", &ip_num))
1055 return NULL;
1056 if (setipaddr(ip_num, &addr) < 0)
1057 return NULL;
1058 h = gethostbyaddr((char *)&addr.sin_addr,
1059 sizeof(addr.sin_addr),
1060 AF_INET);
1061 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001062#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001063 /* Let's get real error message to return */
1064 extern int h_errno;
1065 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1066#else
1067 PyErr_SetString(PySocket_Error, "host not found");
1068#endif
1069 return NULL;
1070 }
1071 if ((name_list = PyList_New(0)) == NULL)
1072 goto err;
1073 if ((addr_list = PyList_New(0)) == NULL)
1074 goto err;
1075 for (pch = h->h_aliases; *pch != NULL; pch++) {
1076 tmp = PyString_FromString(*pch);
1077 if (tmp == NULL)
1078 goto err;
1079 PyList_Append(name_list, tmp);
1080 Py_DECREF(tmp);
1081 }
1082 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1083 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1084 tmp = makeipaddr(&addr);
1085 if (tmp == NULL)
1086 goto err;
1087 PyList_Append(addr_list, tmp);
1088 Py_DECREF(tmp);
1089 }
1090 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1091 err:
1092 Py_XDECREF(name_list);
1093 Py_XDECREF(addr_list);
1094 return rtn_tuple;
1095}
1096
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097
1098/* Python interface to getservbyname(name).
1099 This only returns the port number, since the other info is already
1100 known or not useful (like the list of aliases). */
1101
1102/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001103static PyObject *
1104BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001105{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001106 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001107 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001108 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001109 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001110 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001111 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001112 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001113 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001114 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001115 return NULL;
1116 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001117 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001118}
1119
1120
Guido van Rossum3901d851996-12-19 16:35:04 +00001121/* Python interface to getprotobyname(name).
1122 This only returns the protocol number, since the other info is
1123 already known or not useful (like the list of aliases). */
1124
1125/*ARGSUSED*/
1126static PyObject *
1127BUILD_FUNC_DEF_2(PySocket_getprotobyname,PyObject *,self, PyObject *,args)
1128{
1129 char *name;
1130 struct protoent *sp;
1131 if (!PyArg_Parse(args, "s", &name))
1132 return NULL;
1133 Py_BEGIN_ALLOW_THREADS
1134 sp = getprotobyname(name);
1135 Py_END_ALLOW_THREADS
1136 if (sp == NULL) {
1137 PyErr_SetString(PySocket_Error, "protocol not found");
1138 return NULL;
1139 }
1140 return PyInt_FromLong((long) sp->p_proto);
1141}
1142
1143
Guido van Rossum30a685f1991-06-27 15:51:29 +00001144/* Python interface to socket(family, type, proto).
1145 The third (protocol) argument is optional.
1146 Return a new socket object. */
1147
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001148/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001149static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001150BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001151{
Guido van Rossum73624e91994-10-10 17:59:00 +00001152 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001153#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001154 SOCKET fd;
1155#else
1156 int fd;
1157#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001158 int family, type, proto = 0;
1159 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1160 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001161 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001162 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001163 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001164#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001165 if (fd == INVALID_SOCKET)
1166#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001167 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001168#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001169 return PySocket_Err();
1170 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001171 /* If the object can't be created, don't forget to close the
1172 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001173 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001174 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001175 /* From now on, ignore SIGPIPE and let the error checking
1176 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001177#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001178 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001179#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001180 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001181}
1182
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001183#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001184/* Create a socket object from a numeric file description.
1185 Useful e.g. if stdin is a socket.
1186 Additional arguments as for socket(). */
1187
1188/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001189static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001190BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001191{
Guido van Rossum73624e91994-10-10 17:59:00 +00001192 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001193 int fd, family, type, proto = 0;
1194 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1195 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001196 /* Dup the fd so it and the socket can be closed independently */
1197 fd = dup(fd);
1198 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001199 return PySocket_Err();
1200 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001201 /* From now on, ignore SIGPIPE and let the error checking
1202 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001203#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001204 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001205#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001206 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001207}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001208#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001209
Guido van Rossum006bf911996-06-12 04:04:55 +00001210static PyObject *
1211BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1212{
1213 int x1, x2;
1214
1215 if (!PyArg_Parse(args, "i", &x1)) {
1216 return NULL;
1217 }
1218 x2 = (int)ntohs((short)x1);
1219 return PyInt_FromLong(x2);
1220}
1221
1222static PyObject *
1223BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1224{
1225 int x1, x2;
1226
1227 if (!PyArg_Parse(args, "i", &x1)) {
1228 return NULL;
1229 }
1230 x2 = ntohl(x1);
1231 return PyInt_FromLong(x2);
1232}
1233
1234static PyObject *
1235BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1236{
1237 int x1, x2;
1238
1239 if (!PyArg_Parse(args, "i", &x1)) {
1240 return NULL;
1241 }
1242 x2 = (int)htons((short)x1);
1243 return PyInt_FromLong(x2);
1244}
1245
1246static PyObject *
1247BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1248{
1249 int x1, x2;
1250
1251 if (!PyArg_Parse(args, "i", &x1)) {
1252 return NULL;
1253 }
1254 x2 = htonl(x1);
1255 return PyInt_FromLong(x2);
1256}
1257
Guido van Rossum30a685f1991-06-27 15:51:29 +00001258/* List of functions exported by this module. */
1259
Guido van Rossum73624e91994-10-10 17:59:00 +00001260static PyMethodDef PySocket_methods[] = {
1261 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001262 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001263 {"gethostname", PySocket_gethostname},
1264 {"getservbyname", PySocket_getservbyname},
Guido van Rossum3901d851996-12-19 16:35:04 +00001265 {"getprotobyname", PySocket_getprotobyname},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001266 {"socket", PySocket_socket, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001267#ifndef NO_DUP
Guido van Rossumbe32c891996-06-20 16:25:29 +00001268 {"fromfd", PySocket_fromfd, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001269#endif
Guido van Rossum006bf911996-06-12 04:04:55 +00001270 {"ntohs", PySocket_ntohs},
1271 {"ntohl", PySocket_ntohl},
1272 {"htons", PySocket_htons},
1273 {"htonl", PySocket_htonl},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001274 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001275};
1276
Guido van Rossum30a685f1991-06-27 15:51:29 +00001277
1278/* Convenience routine to export an integer value.
1279 For simplicity, errors (which are unlikely anyway) are ignored. */
1280
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001281static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001282BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001283{
Guido van Rossum73624e91994-10-10 17:59:00 +00001284 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001285 if (v == NULL) {
1286 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001287 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001288 }
1289 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001290 PyDict_SetItemString(d, name, v);
1291 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001292 }
1293}
1294
Guido van Rossum30a685f1991-06-27 15:51:29 +00001295
Guido van Rossum8d665e61996-06-26 18:22:49 +00001296#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001297
1298/* Additional initialization and cleanup for NT/Windows */
1299
1300static void
1301NTcleanup()
1302{
1303 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001304}
1305
1306static int
1307NTinit()
1308{
1309 WSADATA WSAData;
1310 int ret;
1311 char buf[100];
1312 ret = WSAStartup(0x0101, &WSAData);
1313 switch (ret) {
1314 case 0: /* no error */
1315 atexit(NTcleanup);
1316 return 1;
1317 case WSASYSNOTREADY:
1318 PyErr_SetString(PyExc_ImportError,
1319 "WSAStartup failed: network not ready");
1320 break;
1321 case WSAVERNOTSUPPORTED:
1322 case WSAEINVAL:
1323 PyErr_SetString(PyExc_ImportError,
1324 "WSAStartup failed: requested version not supported");
1325 break;
1326 default:
1327 sprintf(buf, "WSAStartup failed: error code %d", ret);
1328 PyErr_SetString(PyExc_ImportError, buf);
1329 break;
1330 }
1331 return 0;
1332}
1333
Guido van Rossum8d665e61996-06-26 18:22:49 +00001334#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001335
1336
Guido van Rossum30a685f1991-06-27 15:51:29 +00001337/* Initialize this module.
1338 This is called when the first 'import socket' is done,
1339 via a table in config.c, if config.c is compiled with USE_SOCKET
Guido van Rossumbe32c891996-06-20 16:25:29 +00001340 defined.
1341
Guido van Rossum8d665e61996-06-26 18:22:49 +00001342 For MS_WINDOWS (which means any Windows variant), this module
Guido van Rossumbe32c891996-06-20 16:25:29 +00001343 is actually called "_socket", and there's a wrapper "socket.py"
1344 which implements some missing functionality (such as makefile(),
1345 dup() and fromfd()). The import of "_socket" may fail with an
1346 ImportError exception if initialization of WINSOCK fails. When
1347 WINSOCK is initialized succesfully, a call to WSACleanup() is
1348 scheduled to be made at exit time. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001349
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001350void
Guido van Rossum8d665e61996-06-26 18:22:49 +00001351#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001352init_socket()
1353#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001354initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001355#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001356{
Guido van Rossum73624e91994-10-10 17:59:00 +00001357 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001358#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001359 if (!NTinit())
1360 return;
1361 m = Py_InitModule("_socket", PySocket_methods);
1362#else
Guido van Rossum73624e91994-10-10 17:59:00 +00001363 m = Py_InitModule("socket", PySocket_methods);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001364#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001365 d = PyModule_GetDict(m);
1366 PySocket_Error = PyString_FromString("socket.error");
1367 if (PySocket_Error == NULL ||
1368 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1369 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001370 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001371#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001372 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001373#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001374 insint(d, "SOCK_STREAM", SOCK_STREAM);
1375 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1376 insint(d, "SOCK_RAW", SOCK_RAW);
1377 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1378 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001379
1380#ifdef SO_DEBUG
1381 insint(d, "SO_DEBUG", SO_DEBUG);
1382#endif
1383#ifdef SO_ACCEPTCONN
1384 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1385#endif
1386#ifdef SO_REUSEADDR
1387 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1388#endif
1389#ifdef SO_KEEPALIVE
1390 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1391#endif
1392#ifdef SO_DONTROUTE
1393 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1394#endif
1395#ifdef SO_BROADCAST
1396 insint(d, "SO_BROADCAST", SO_BROADCAST);
1397#endif
1398#ifdef SO_USELOOPBACK
1399 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1400#endif
1401#ifdef SO_LINGER
1402 insint(d, "SO_LINGER", SO_LINGER);
1403#endif
1404#ifdef SO_OOBINLINE
1405 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1406#endif
1407#ifdef SO_REUSEPORT
1408 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1409#endif
1410
1411#ifdef SO_SNDBUF
1412 insint(d, "SO_SNDBUF", SO_SNDBUF);
1413#endif
1414#ifdef SO_RCVBUF
1415 insint(d, "SO_RCVBUF", SO_RCVBUF);
1416#endif
1417#ifdef SO_SNDLOWAT
1418 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1419#endif
1420#ifdef SO_RCVLOWAT
1421 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1422#endif
1423#ifdef SO_SNDTIMEO
1424 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1425#endif
1426#ifdef SO_RCVTIMEO
1427 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1428#endif
1429#ifdef SO_ERROR
1430 insint(d, "SO_ERROR", SO_ERROR);
1431#endif
1432#ifdef SO_TYPE
1433 insint(d, "SO_TYPE", SO_TYPE);
1434#endif
1435
1436 /* Maximum number of connections for "listen" */
1437#ifdef SOMAXCONN
1438 insint(d, "SOMAXCONN", SOMAXCONN);
1439#else
1440 insint(d, "SOMAXCONN", 5); /* Common value */
1441#endif
1442
1443 /* Flags for send, recv */
1444#ifdef MSG_OOB
1445 insint(d, "MSG_OOB", MSG_OOB);
1446#endif
1447#ifdef MSG_PEEK
1448 insint(d, "MSG_PEEK", MSG_PEEK);
1449#endif
1450#ifdef MSG_DONTROUTE
1451 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1452#endif
1453#ifdef MSG_EOR
1454 insint(d, "MSG_EOR", MSG_EOR);
1455#endif
1456#ifdef MSG_TRUNC
1457 insint(d, "MSG_TRUNC", MSG_TRUNC);
1458#endif
1459#ifdef MSG_CTRUNC
1460 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1461#endif
1462#ifdef MSG_WAITALL
1463 insint(d, "MSG_WAITALL", MSG_WAITALL);
1464#endif
1465#ifdef MSG_BTAG
1466 insint(d, "MSG_BTAG", MSG_BTAG);
1467#endif
1468#ifdef MSG_ETAG
1469 insint(d, "MSG_ETAG", MSG_ETAG);
1470#endif
1471
1472 /* Protocol level and numbers, usable for [gs]etsockopt */
1473#ifdef SOL_SOCKET
1474 insint(d, "SOL_SOCKET", SOL_SOCKET);
1475#endif
1476#ifdef IPPROTO_IP
1477 insint(d, "IPPROTO_IP", IPPROTO_IP);
1478#endif
1479#ifdef IPPROTO_ICMP
1480 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1481#endif
1482#ifdef IPPROTO_IGMP
1483 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1484#endif
1485#ifdef IPPROTO_GGP
1486 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1487#endif
1488#ifdef IPPROTO_TCP
1489 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1490#endif
1491#ifdef IPPROTO_EGP
1492 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1493#endif
1494#ifdef IPPROTO_PUP
1495 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1496#endif
1497#ifdef IPPROTO_UDP
1498 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1499#endif
1500#ifdef IPPROTO_IDP
1501 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1502#endif
1503#ifdef IPPROTO_HELLO
1504 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1505#endif
1506#ifdef IPPROTO_ND
1507 insint(d, "IPPROTO_ND", IPPROTO_ND);
1508#endif
1509#ifdef IPPROTO_TP
1510 insint(d, "IPPROTO_TP", IPPROTO_TP);
1511#endif
1512#ifdef IPPROTO_XTP
1513 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1514#endif
1515#ifdef IPPROTO_EON
1516 insint(d, "IPPROTO_EON", IPPROTO_EON);
1517#endif
1518#ifdef IPPROTO_BIP
1519 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1520#endif
1521/**/
1522#ifdef IPPROTO_RAW
1523 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1524#endif
1525#ifdef IPPROTO_MAX
1526 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1527#endif
1528
1529 /* Some port configuration */
1530#ifdef IPPORT_RESERVED
1531 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1532#else
1533 insint(d, "IPPORT_RESERVED", 1024);
1534#endif
1535#ifdef IPPORT_USERRESERVED
1536 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1537#else
1538 insint(d, "IPPORT_USERRESERVED", 5000);
1539#endif
1540
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001541 /* Some reserved IP v.4 addresses */
1542#ifdef INADDR_ANY
1543 insint(d, "INADDR_ANY", INADDR_ANY);
1544#else
1545 insint(d, "INADDR_ANY", 0x00000000);
1546#endif
1547#ifdef INADDR_BROADCAST
1548 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1549#else
1550 insint(d, "INADDR_BROADCAST", 0xffffffff);
1551#endif
1552#ifdef INADDR_LOOPBACK
1553 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1554#else
1555 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1556#endif
1557#ifdef INADDR_UNSPEC_GROUP
1558 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1559#else
1560 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1561#endif
1562#ifdef INADDR_ALLHOSTS_GROUP
1563 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1564#else
1565 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1566#endif
1567#ifdef INADDR_MAX_LOCAL_GROUP
1568 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1569#else
1570 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1571#endif
1572#ifdef INADDR_NONE
1573 insint(d, "INADDR_NONE", INADDR_NONE);
1574#else
1575 insint(d, "INADDR_NONE", 0xffffffff);
1576#endif
1577
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001578 /* IP [gs]etsockopt options */
1579#ifdef IP_OPTIONS
1580 insint(d, "IP_OPTIONS", IP_OPTIONS);
1581#endif
1582#ifdef IP_HDRINCL
1583 insint(d, "IP_HDRINCL", IP_HDRINCL);
1584#endif
1585#ifdef IP_TOS
1586 insint(d, "IP_TOS", IP_TOS);
1587#endif
1588#ifdef IP_TTL
1589 insint(d, "IP_TTL", IP_TTL);
1590#endif
1591#ifdef IP_RECVOPTS
1592 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1593#endif
1594#ifdef IP_RECVRETOPTS
1595 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1596#endif
1597#ifdef IP_RECVDSTADDR
1598 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1599#endif
1600#ifdef IP_RETOPTS
1601 insint(d, "IP_RETOPTS", IP_RETOPTS);
1602#endif
1603#ifdef IP_MULTICAST_IF
1604 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1605#endif
1606#ifdef IP_MULTICAST_TTL
1607 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1608#endif
1609#ifdef IP_MULTICAST_LOOP
1610 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1611#endif
1612#ifdef IP_ADD_MEMBERSHIP
1613 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1614#endif
1615#ifdef IP_DROP_MEMBERSHIP
1616 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1617#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001618}