blob: ffe6b446bc875c42b5a0856985f5edc71d0a0dbe [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Socket module */
26
27/*
28This module provides an interface to Berkeley socket IPC.
29
30Limitations:
31
Guido van Rossum30a685f1991-06-27 15:51:29 +000032- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000033- no read/write operations (use send/recv or makefile instead)
Guido van Rossumbe32c891996-06-20 16:25:29 +000034- additional restrictions apply on Windows
Guido van Rossum6574b3e1991-06-25 21:36:08 +000035
Guido van Rossum27e177d1995-03-16 15:43:47 +000036Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000037
Guido van Rossum27e177d1995-03-16 15:43:47 +000038- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000039- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000040- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000041- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
42- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000043- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum006bf911996-06-12 04:04:55 +000044- socket.ntohs(16 bit value) --> new int object
45- socket.ntohl(32 bit value) --> new int object
46- socket.htons(16 bit value) --> new int object
47- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000049- an Internet socket address is a pair (hostname, port)
50 where hostname can be anything recognized by gethostbyname()
51 (including the dd.dd.dd.dd notation) and port is in host byte order
52- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000053- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000054
Guido van Rossum30a685f1991-06-27 15:51:29 +000055Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000056
Guido van Rossum81194471991-07-27 21:42:02 +000057- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000058- s.bind(sockaddr) --> None
59- s.close() --> None
60- s.connect(sockaddr) --> None
61- s.fileno() --> file descriptor
Guido van Rossumbe32c891996-06-20 16:25:29 +000062- s.dup() --> same as socket.fromfd(os.dup(s.fileno(), ...)
Guido van Rossumc89705d1992-11-26 08:54:07 +000063- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000064- s.getsockname() --> sockaddr
65- s.getsockopt(level, optname[, buflen]) --> int or string
66- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000067- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000068- s.recv(buflen [,flags]) --> string
69- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000070- s.send(string [,flags]) --> nbytes
71- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000072- s.setblocking(0 | 1) --> None
73- s.setsockopt(level, optname, value) --> None
74- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000075- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077*/
78
Guido van Rossum73624e91994-10-10 17:59:00 +000079#include "Python.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000080
Guido van Rossumb6775db1994-08-01 11:34:53 +000081#include <sys/types.h>
82#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000083
Guido van Rossum81194471991-07-27 21:42:02 +000084#include <signal.h>
Guido van Rossum6f489d91996-06-28 20:15:15 +000085#ifndef MS_WINDOWS
Guido van Rossumb6775db1994-08-01 11:34:53 +000086#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000087#include <sys/socket.h>
88#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +000089#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000090#else
91#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +000092#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000093#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000094#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +000095#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000096#else
97#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +000098#endif
99
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000100#ifndef O_NDELAY
101#define O_NDELAY O_NONBLOCK /* For QNX only? */
102#endif
103
Jack Jansen508537b1996-02-14 15:57:45 +0000104#ifdef USE_GUSI
105/* fdopen() isn't declared in stdio.h (sigh) */
106#include <GUSI.h>
107#endif
108
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000109
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000110/* Here we have some hacks to choose between K&R or ANSI style function
111 definitions. For NT to build this as an extension module (ie, DLL)
112 it must be compiled by the C++ compiler, as it takes the address of
113 a static data item exported from the main Python DLL.
114*/
Guido van Rossum8d665e61996-06-26 18:22:49 +0000115#ifdef MS_WINDOWS
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000116/* seem to be a few differences in the API */
117#define close closesocket
Guido van Rossumbe32c891996-06-20 16:25:29 +0000118#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000119#define FORCE_ANSI_FUNC_DEFS
120#endif
121
122#ifdef FORCE_ANSI_FUNC_DEFS
123#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
124fnname( arg1type arg1name )
125
126#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
127fnname( arg1type arg1name, arg2type arg2name )
128
129#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
130fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
131
132#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
133fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
134
135#else /* !FORCE_ANSI_FN_DEFS */
136#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
137fnname( arg1name ) \
138 arg1type arg1name;
139
140#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
141fnname( arg1name, arg2name ) \
142 arg1type arg1name; \
143 arg2type arg2name;
144
145#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
146fnname( arg1name, arg2name, arg3name ) \
147 arg1type arg1name; \
148 arg2type arg2name; \
149 arg3type arg3name;
150
151#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
152fnname( arg1name, arg2name, arg3name, arg4name ) \
153 arg1type arg1name; \
154 arg2type arg2name; \
155 arg3type arg3name; \
156 arg4type arg4name;
157
158#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000159
160/* Global variable holding the exception type for errors detected
161 by this module (but not argument type or memory errors, etc.). */
162
Guido van Rossum73624e91994-10-10 17:59:00 +0000163static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000164
165
166/* Convenience function to raise an error according to errno
167 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000168
Guido van Rossum73624e91994-10-10 17:59:00 +0000169static PyObject *
170PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000171{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000172#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000173 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000174 PyObject *v;
175 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000176 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000177 PyErr_SetObject(PySocket_Error, v);
178 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000179 }
180 return NULL;
181 }
182 else
183#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000184 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000185}
186
Guido van Rossum30a685f1991-06-27 15:51:29 +0000187
188/* The object holding a socket. It holds some extra information,
189 like the address family, which is used to decode socket address
190 arguments properly. */
191
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000192typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000193 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000194 int sock_fd; /* Socket file descriptor */
195 int sock_family; /* Address family, e.g., AF_INET */
196 int sock_type; /* Socket type, e.g., SOCK_STREAM */
197 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000198 union sock_addr {
199 struct sockaddr_in in;
200#ifdef AF_UNIX
201 struct sockaddr_un un;
202#endif
203 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000204} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000205
Guido van Rossum30a685f1991-06-27 15:51:29 +0000206
207/* A forward reference to the Socktype type object.
208 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000209 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000210 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000211
Guido van Rossum73624e91994-10-10 17:59:00 +0000212staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000213
Guido van Rossum30a685f1991-06-27 15:51:29 +0000214
215/* Create a new socket object.
216 This just creates the object and initializes it.
217 If the creation fails, return NULL and set an exception (implicit
218 in NEWOBJ()). */
219
Guido van Rossum73624e91994-10-10 17:59:00 +0000220static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000221BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000222{
Guido van Rossum73624e91994-10-10 17:59:00 +0000223 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000224 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000225 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000226 if (s != NULL) {
227 s->sock_fd = fd;
228 s->sock_family = family;
229 s->sock_type = type;
230 s->sock_proto = proto;
231 }
232 return s;
233}
234
Guido van Rossum30a685f1991-06-27 15:51:29 +0000235
236/* Convert a string specifying a host name or one of a few symbolic
237 names to a numeric IP address. This usually calls gethostbyname()
238 to do the work; the names "" and "<broadcast>" are special.
239 Return the length (should always be 4 bytes), or negative if
240 an error occurred; then an exception is raised. */
241
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000242static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000243BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000244{
245 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000246 int d1, d2, d3, d4;
247 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000248#ifdef HAVE_GETHOSTBYNAME_R
249 struct hostent hp_allocated;
250 char buf[1001];
251 int buf_len = (sizeof buf) - 1;
252 int errnop;
253#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000254
Guido van Rossum30a685f1991-06-27 15:51:29 +0000255 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000256 addr_ret->sin_addr.s_addr = INADDR_ANY;
257 return 4;
258 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000259 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000260 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
261 return 4;
262 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000263 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
264 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
265 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
266 addr_ret->sin_addr.s_addr = htonl(
267 ((long) d1 << 24) | ((long) d2 << 16) |
268 ((long) d3 << 8) | ((long) d4 << 0));
269 return 4;
270 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000271#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000272 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000273 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000274 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000275#else /* not HAVE_GETHOSTBYNAME_R */
276 hp = gethostbyname(name);
277#endif /* HAVE_GETHOSTBYNAME_R */
278
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000279 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000280#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000281 /* Let's get real error message to return */
282 extern int h_errno;
283 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
284#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000285 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000286#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000287 return -1;
288 }
289 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
290 return hp->h_length;
291}
292
Guido van Rossum30a685f1991-06-27 15:51:29 +0000293
Guido van Rossum30a685f1991-06-27 15:51:29 +0000294/* Create a string object representing an IP address.
295 This is always a string of the form 'dd.dd.dd.dd' (with variable
296 size numbers). */
297
Guido van Rossum73624e91994-10-10 17:59:00 +0000298static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000299BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000300{
301 long x = ntohl(addr->sin_addr.s_addr);
302 char buf[100];
303 sprintf(buf, "%d.%d.%d.%d",
304 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
305 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000306 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000307}
308
309
310/* Create an object representing the given socket address,
311 suitable for passing it back to bind(), connect() etc.
312 The family field of the sockaddr structure is inspected
313 to determine what kind of address it really is. */
314
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000315/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000316static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000317BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000318{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000319 if (addrlen == 0) {
320 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000321 Py_INCREF(Py_None);
322 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000323 }
324
Guido van Rossum30a685f1991-06-27 15:51:29 +0000325 switch (addr->sa_family) {
326
327 case AF_INET:
328 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000329 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000330 PyObject *addr = makeipaddr(a);
331 PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
332 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000333 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000334 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000335
Guido van Rossumb6775db1994-08-01 11:34:53 +0000336#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000337 case AF_UNIX:
338 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000339 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000340 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000341 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000342#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000343
344 /* More cases here... */
345
346 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000347 PyErr_SetString(PySocket_Error, "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000348 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000349
Guido van Rossum30a685f1991-06-27 15:51:29 +0000350 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000351}
352
Guido van Rossum30a685f1991-06-27 15:51:29 +0000353
354/* Parse a socket address argument according to the socket object's
355 address family. Return 1 if the address was in the proper format,
356 0 of not. The address is returned through addr_ret, its length
357 through len_ret. */
358
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000359static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000360BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000361getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000362{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000363 switch (s->sock_family) {
364
Guido van Rossumb6775db1994-08-01 11:34:53 +0000365#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000366 case AF_UNIX:
367 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000368 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000369 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000370 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000371 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000372 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000373 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000374 if (len > sizeof addr->sun_path) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000375 PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000376 return 0;
377 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000378 addr->sun_family = AF_UNIX;
379 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000380 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000381 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000382 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000383 return 1;
384 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000385#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000386
Guido van Rossum30a685f1991-06-27 15:51:29 +0000387 case AF_INET:
388 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000389 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000390 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000391 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000392 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000393 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000394 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000395 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000396 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000397 addr->sin_family = AF_INET;
398 addr->sin_port = htons(port);
399 *addr_ret = (struct sockaddr *) addr;
400 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000401 return 1;
402 }
403
Guido van Rossum30a685f1991-06-27 15:51:29 +0000404 /* More cases here... */
405
406 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000407 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000408 return 0;
409
410 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000411}
412
Guido van Rossum30a685f1991-06-27 15:51:29 +0000413
Guido van Rossum710e1df1992-06-12 10:39:36 +0000414/* Get the address length according to the socket object's address family.
415 Return 1 if the family is known, 0 otherwise. The length is returned
416 through len_ret. */
417
418static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000419BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000420{
421 switch (s->sock_family) {
422
Guido van Rossumb6775db1994-08-01 11:34:53 +0000423#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000424 case AF_UNIX:
425 {
426 *len_ret = sizeof (struct sockaddr_un);
427 return 1;
428 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000429#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000430
431 case AF_INET:
432 {
433 *len_ret = sizeof (struct sockaddr_in);
434 return 1;
435 }
436
437 /* More cases here... */
438
439 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000440 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000441 return 0;
442
443 }
444}
445
446
Guido van Rossum30a685f1991-06-27 15:51:29 +0000447/* s.accept() method */
448
Guido van Rossum73624e91994-10-10 17:59:00 +0000449static PyObject *
450BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000451{
452 char addrbuf[256];
453 int addrlen, newfd;
Guido van Rossum73624e91994-10-10 17:59:00 +0000454 PyObject *sock, *addr, *res;
455 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000456 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000457 if (!getsockaddrlen(s, &addrlen))
458 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000459 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000460 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000461 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000462 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000463 return PySocket_Err();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000464 /* Create the new object with unspecified family,
465 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000466 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000467 s->sock_family,
468 s->sock_type,
469 s->sock_proto);
470 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000471 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000472 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000473 res = Py_BuildValue("OO", sock, addr);
474 Py_XDECREF(sock);
475 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000476 return res;
477}
478
Guido van Rossum30a685f1991-06-27 15:51:29 +0000479
Guido van Rossume4485b01994-09-07 14:32:49 +0000480/* s.setblocking(1 | 0) method */
481
Guido van Rossum73624e91994-10-10 17:59:00 +0000482static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000483BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000484{
485 int block;
486 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000487 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000488 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000489 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +0000490#ifndef MS_WINDOWS
Guido van Rossume4485b01994-09-07 14:32:49 +0000491 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
492 if (block)
493 delay_flag &= (~O_NDELAY);
494 else
495 delay_flag |= O_NDELAY;
496 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000497#else
498 block = !block;
499 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
500#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000501 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000502
Guido van Rossum73624e91994-10-10 17:59:00 +0000503 Py_INCREF(Py_None);
504 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000505}
Guido van Rossume4485b01994-09-07 14:32:49 +0000506
507
Guido van Rossumaee08791992-09-08 09:05:33 +0000508/* s.setsockopt() method.
509 With an integer third argument, sets an integer option.
510 With a string third argument, sets an option from a buffer;
511 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000512
Guido van Rossum73624e91994-10-10 17:59:00 +0000513static PyObject *
514BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000515{
516 int level;
517 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000518 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000519 char *buf;
520 int buflen;
521 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000522
Guido van Rossum73624e91994-10-10 17:59:00 +0000523 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000524 buf = (char *) &flag;
525 buflen = sizeof flag;
526 }
527 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000528 PyErr_Clear();
529 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000530 return NULL;
531 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000532 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000533 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000534 return PySocket_Err();
535 Py_INCREF(Py_None);
536 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000537}
538
539
Guido van Rossumaee08791992-09-08 09:05:33 +0000540/* s.getsockopt() method.
541 With two arguments, retrieves an integer option.
542 With a third integer argument, retrieves a string buffer of that size;
543 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000544
Guido van Rossum73624e91994-10-10 17:59:00 +0000545static PyObject *
546BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000547{
548 int level;
549 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000550 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000551 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000552 int buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000553
Guido van Rossumbe32c891996-06-20 16:25:29 +0000554 if (!PyArg_ParseTuple(args, "ii|i", &level, &optname, &buflen))
555 return NULL;
556
557 if (buflen == 0) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000558 int flag = 0;
559 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000560 res = getsockopt(s->sock_fd, level, optname,
561 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000562 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000563 return PySocket_Err();
564 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000565 }
Guido van Rossumaee08791992-09-08 09:05:33 +0000566 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000567 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000568 return NULL;
569 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000570 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000571 if (buf == NULL)
572 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000573 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000574 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000575 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000576 Py_DECREF(buf);
577 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000578 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000579 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000580 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000581}
582
583
Guido van Rossum30a685f1991-06-27 15:51:29 +0000584/* s.bind(sockaddr) method */
585
Guido van Rossum73624e91994-10-10 17:59:00 +0000586static PyObject *
587BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000588{
589 struct sockaddr *addr;
590 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000591 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000592 if (!getsockaddrarg(s, args, &addr, &addrlen))
593 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000594 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000595 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000596 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000597 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000598 return PySocket_Err();
599 Py_INCREF(Py_None);
600 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000601}
602
Guido van Rossum30a685f1991-06-27 15:51:29 +0000603
604/* s.close() method.
605 Set the file descriptor to -1 so operations tried subsequently
606 will surely fail. */
607
Guido van Rossum73624e91994-10-10 17:59:00 +0000608static PyObject *
609BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000610{
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000612 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000614 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000615 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000616 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000617 Py_INCREF(Py_None);
618 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000619}
620
Guido van Rossum30a685f1991-06-27 15:51:29 +0000621
622/* s.connect(sockaddr) method */
623
Guido van Rossum73624e91994-10-10 17:59:00 +0000624static PyObject *
625BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626{
627 struct sockaddr *addr;
628 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000629 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000630 if (!getsockaddrarg(s, args, &addr, &addrlen))
631 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000632 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000633 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000634 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000635 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000636 return PySocket_Err();
637 Py_INCREF(Py_None);
638 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000639}
640
Guido van Rossum30a685f1991-06-27 15:51:29 +0000641
Guido van Rossumed233a51992-06-23 09:07:03 +0000642/* s.fileno() method */
643
Guido van Rossum73624e91994-10-10 17:59:00 +0000644static PyObject *
645BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000646{
Guido van Rossum73624e91994-10-10 17:59:00 +0000647 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000648 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000649 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000650}
651
652
Guido van Rossumbe32c891996-06-20 16:25:29 +0000653#ifndef NO_DUP
654/* s.dup() method */
655
656static PyObject *
657BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
658{
659 int newfd;
660 PyObject *sock;
661 if (!PyArg_NoArgs(args))
662 return NULL;
663 newfd = dup(s->sock_fd);
664 if (newfd < 0)
665 return PySocket_Err();
666 sock = (PyObject *) PySocketSock_New(newfd,
667 s->sock_family,
668 s->sock_type,
669 s->sock_proto);
670 if (sock == NULL)
671 close(newfd);
672 return sock;
673}
674#endif
675
676
Guido van Rossumc89705d1992-11-26 08:54:07 +0000677/* s.getsockname() method */
678
Guido van Rossum73624e91994-10-10 17:59:00 +0000679static PyObject *
680BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000681{
682 char addrbuf[256];
683 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000684 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000685 return NULL;
686 if (!getsockaddrlen(s, &addrlen))
687 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000688 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000689 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000690 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000691 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000692 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000693 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000694 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
695}
696
697
Guido van Rossumb6775db1994-08-01 11:34:53 +0000698#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000699/* s.getpeername() method */
700
Guido van Rossum73624e91994-10-10 17:59:00 +0000701static PyObject *
702BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000703{
704 char addrbuf[256];
705 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000706 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000707 return NULL;
708 if (!getsockaddrlen(s, &addrlen))
709 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000710 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000711 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000712 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000713 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000714 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000715 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
716}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000717#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000718
719
Guido van Rossum30a685f1991-06-27 15:51:29 +0000720/* s.listen(n) method */
721
Guido van Rossum73624e91994-10-10 17:59:00 +0000722static PyObject *
723BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000724{
725 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000726 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000727 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000728 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000729 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000730 if (backlog < 1)
731 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000732 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000733 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000734 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000735 return PySocket_Err();
736 Py_INCREF(Py_None);
737 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000738}
739
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000740#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000741/* s.makefile(mode) method.
742 Create a new open file object referring to a dupped version of
743 the socket's file descriptor. (The dup() call is necessary so
744 that the open file and socket objects may be closed independent
745 of each other.)
746 The mode argument specifies 'r' or 'w' passed to fdopen(). */
747
Guido van Rossum73624e91994-10-10 17:59:00 +0000748static PyObject *
749BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000750{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000751 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000752 char *mode = "r";
753 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754 int fd;
755 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000756 PyObject *f;
757
758 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000759 return NULL;
Guido van Rossum8d665e61996-06-26 18:22:49 +0000760#ifdef MS_WIN32
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000761 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
762 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
763#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000765 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000766#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000767 if (fd >= 0)
768 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000769 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000770 }
771 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
772 if (f != NULL)
773 PyFile_SetBufSize(f, bufsize);
774 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000775}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000776#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000777
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000778/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779
Guido van Rossum73624e91994-10-10 17:59:00 +0000780static PyObject *
781BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782{
Guido van Rossumbe32c891996-06-20 16:25:29 +0000783 int len, n, flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000784 PyObject *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000785 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
786 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000787 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788 if (buf == NULL)
789 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000790 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000791 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000792 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000793 if (n < 0) {
794 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000795 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000796 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000797 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000798 return NULL;
799 return buf;
800}
801
Guido van Rossum30a685f1991-06-27 15:51:29 +0000802
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000803/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000804
Guido van Rossum73624e91994-10-10 17:59:00 +0000805static PyObject *
806BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807{
808 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000809 PyObject *buf, *addr, *ret;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000810 int addrlen, len, n, flags = 0;
811 if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
812 return NULL;
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000813 if (!getsockaddrlen(s, &addrlen))
814 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000815 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000816 if (buf == NULL)
817 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000818 Py_BEGIN_ALLOW_THREADS
819 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum8d665e61996-06-26 18:22:49 +0000820#ifndef MS_WINDOWS
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000821 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000822#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000823 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000824#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000825 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000826 if (n < 0) {
827 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000828 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000829 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000830 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000832 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000833 ret = Py_BuildValue("OO", buf, addr);
834 Py_XDECREF(addr);
835 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000836 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000837}
838
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000840/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841
Guido van Rossum73624e91994-10-10 17:59:00 +0000842static PyObject *
843BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000845 char *buf;
Guido van Rossumbe32c891996-06-20 16:25:29 +0000846 int len, n, flags = 0;
847 if (!PyArg_ParseTuple(args, "s#|i", &buf, &len, &flags))
848 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000849 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000850 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000851 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000852 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000853 return PySocket_Err();
854 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000855}
856
857
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000858/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000859
Guido van Rossum73624e91994-10-10 17:59:00 +0000860static PyObject *
861BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000862{
Guido van Rossum73624e91994-10-10 17:59:00 +0000863 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000864 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000865 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000866 int addrlen, len, n, flags;
867 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000868 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
869 PyErr_Clear();
870 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000871 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000872 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000873 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000875 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000876 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000877 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000878 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000879 return PySocket_Err();
880 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000881}
882
Guido van Rossum30a685f1991-06-27 15:51:29 +0000883
884/* s.shutdown(how) method */
885
Guido van Rossum73624e91994-10-10 17:59:00 +0000886static PyObject *
887BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000888{
889 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000890 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000891 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000892 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000893 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000894 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000895 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000896 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000897 return PySocket_Err();
898 Py_INCREF(Py_None);
899 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000900}
901
Guido van Rossum30a685f1991-06-27 15:51:29 +0000902
903/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000904
Guido van Rossum73624e91994-10-10 17:59:00 +0000905static PyMethodDef PySocketSock_methods[] = {
906 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000907 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000908 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000909 {"getsockopt", (PyCFunction)PySocketSock_getsockopt, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 {"bind", (PyCFunction)PySocketSock_bind},
911 {"close", (PyCFunction)PySocketSock_close},
912 {"connect", (PyCFunction)PySocketSock_connect},
913 {"fileno", (PyCFunction)PySocketSock_fileno},
Guido van Rossumbe32c891996-06-20 16:25:29 +0000914#ifndef NO_DUP
915 {"dup", (PyCFunction)PySocketSock_dup},
916#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000917 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000918#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000919 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000920#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000921 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000922#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000923 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000924#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +0000925 {"recv", (PyCFunction)PySocketSock_recv, 1},
926 {"recvfrom", (PyCFunction)PySocketSock_recvfrom, 1},
927 {"send", (PyCFunction)PySocketSock_send, 1},
Guido van Rossum73624e91994-10-10 17:59:00 +0000928 {"sendto", (PyCFunction)PySocketSock_sendto},
929 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000930 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931};
932
Guido van Rossum30a685f1991-06-27 15:51:29 +0000933
Guido van Rossum73624e91994-10-10 17:59:00 +0000934/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935 First close the file description. */
936
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000938BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939{
940 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000941 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942}
943
Guido van Rossum30a685f1991-06-27 15:51:29 +0000944
945/* Return a socket object's named attribute. */
946
Guido van Rossum73624e91994-10-10 17:59:00 +0000947static PyObject *
948BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000949{
Guido van Rossum73624e91994-10-10 17:59:00 +0000950 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951}
952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000954static PyObject *
955BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
956{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000957 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000958 sprintf(buf,
959 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
960 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +0000961 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000962}
963
964
Guido van Rossumb6775db1994-08-01 11:34:53 +0000965/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000966
Guido van Rossum73624e91994-10-10 17:59:00 +0000967static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +0000968 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000969 0,
970 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000973 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000974 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000975 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000976 0, /*tp_setattr*/
977 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000978 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000979 0, /*tp_as_number*/
980 0, /*tp_as_sequence*/
981 0, /*tp_as_mapping*/
982};
983
Guido van Rossum30a685f1991-06-27 15:51:29 +0000984
Guido van Rossum81194471991-07-27 21:42:02 +0000985/* Python interface to gethostname(). */
986
987/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000988static PyObject *
989BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000990{
991 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000992 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000993 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +0000994 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000996 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +0000997 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000998 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000999 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001000 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001001 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001002}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001003
1004
Guido van Rossum30a685f1991-06-27 15:51:29 +00001005/* Python interface to gethostbyname(name). */
1006
1007/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001008static PyObject *
1009BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001010{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001011 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001012 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001013 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001014 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001015 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001016 return NULL;
1017 return makeipaddr(&addrbuf);
1018}
1019
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001020/* Python interface to gethostbyaddr(IP). */
1021
1022/*ARGSUSED*/
1023static PyObject *
1024BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1025{
1026 struct sockaddr_in addr;
1027 char *ip_num;
1028 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001029 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001030 PyObject *rtn_tuple = (PyObject *)NULL;
1031 PyObject *name_list = (PyObject *)NULL;
1032 PyObject *addr_list = (PyObject *)NULL;
1033 PyObject *tmp;
1034
1035 if (!PyArg_Parse(args, "s", &ip_num))
1036 return NULL;
1037 if (setipaddr(ip_num, &addr) < 0)
1038 return NULL;
1039 h = gethostbyaddr((char *)&addr.sin_addr,
1040 sizeof(addr.sin_addr),
1041 AF_INET);
1042 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001043#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001044 /* Let's get real error message to return */
1045 extern int h_errno;
1046 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1047#else
1048 PyErr_SetString(PySocket_Error, "host not found");
1049#endif
1050 return NULL;
1051 }
1052 if ((name_list = PyList_New(0)) == NULL)
1053 goto err;
1054 if ((addr_list = PyList_New(0)) == NULL)
1055 goto err;
1056 for (pch = h->h_aliases; *pch != NULL; pch++) {
1057 tmp = PyString_FromString(*pch);
1058 if (tmp == NULL)
1059 goto err;
1060 PyList_Append(name_list, tmp);
1061 Py_DECREF(tmp);
1062 }
1063 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1064 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1065 tmp = makeipaddr(&addr);
1066 if (tmp == NULL)
1067 goto err;
1068 PyList_Append(addr_list, tmp);
1069 Py_DECREF(tmp);
1070 }
1071 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1072 err:
1073 Py_XDECREF(name_list);
1074 Py_XDECREF(addr_list);
1075 return rtn_tuple;
1076}
1077
Guido van Rossum30a685f1991-06-27 15:51:29 +00001078
1079/* Python interface to getservbyname(name).
1080 This only returns the port number, since the other info is already
1081 known or not useful (like the list of aliases). */
1082
1083/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001084static PyObject *
1085BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001086{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001087 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001088 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001089 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001090 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001091 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001092 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001093 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001094 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001095 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001096 return NULL;
1097 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001098 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001099}
1100
1101
1102/* Python interface to socket(family, type, proto).
1103 The third (protocol) argument is optional.
1104 Return a new socket object. */
1105
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001106/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001107static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001108BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001109{
Guido van Rossum73624e91994-10-10 17:59:00 +00001110 PySocketSockObject *s;
Guido van Rossum6f489d91996-06-28 20:15:15 +00001111#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001112 SOCKET fd;
1113#else
1114 int fd;
1115#endif
Guido van Rossumbe32c891996-06-20 16:25:29 +00001116 int family, type, proto = 0;
1117 if (!PyArg_ParseTuple(args, "ii|i", &family, &type, &proto))
1118 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001119 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001120 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001121 Py_END_ALLOW_THREADS
Guido van Rossum6f489d91996-06-28 20:15:15 +00001122#ifdef MS_WINDOWS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001123 if (fd == INVALID_SOCKET)
1124#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001125 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001126#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001127 return PySocket_Err();
1128 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001129 /* If the object can't be created, don't forget to close the
1130 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001131 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001132 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001133 /* From now on, ignore SIGPIPE and let the error checking
1134 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001135#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001136 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001137#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001138 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001139}
1140
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001141#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001142/* Create a socket object from a numeric file description.
1143 Useful e.g. if stdin is a socket.
1144 Additional arguments as for socket(). */
1145
1146/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001147static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001148BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001149{
Guido van Rossum73624e91994-10-10 17:59:00 +00001150 PySocketSockObject *s;
Guido van Rossumbe32c891996-06-20 16:25:29 +00001151 int fd, family, type, proto = 0;
1152 if (!PyArg_ParseTuple(args, "iii|i", &fd, &family, &type, &proto))
1153 return NULL;
Guido van Rossum5f59d601992-12-14 16:59:51 +00001154 /* Dup the fd so it and the socket can be closed independently */
1155 fd = dup(fd);
1156 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001157 return PySocket_Err();
1158 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001159 /* From now on, ignore SIGPIPE and let the error checking
1160 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001161#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001162 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001163#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001164 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001165}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001166#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001167
Guido van Rossum006bf911996-06-12 04:04:55 +00001168static PyObject *
1169BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1170{
1171 int x1, x2;
1172
1173 if (!PyArg_Parse(args, "i", &x1)) {
1174 return NULL;
1175 }
1176 x2 = (int)ntohs((short)x1);
1177 return PyInt_FromLong(x2);
1178}
1179
1180static PyObject *
1181BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1182{
1183 int x1, x2;
1184
1185 if (!PyArg_Parse(args, "i", &x1)) {
1186 return NULL;
1187 }
1188 x2 = ntohl(x1);
1189 return PyInt_FromLong(x2);
1190}
1191
1192static PyObject *
1193BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1194{
1195 int x1, x2;
1196
1197 if (!PyArg_Parse(args, "i", &x1)) {
1198 return NULL;
1199 }
1200 x2 = (int)htons((short)x1);
1201 return PyInt_FromLong(x2);
1202}
1203
1204static PyObject *
1205BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1206{
1207 int x1, x2;
1208
1209 if (!PyArg_Parse(args, "i", &x1)) {
1210 return NULL;
1211 }
1212 x2 = htonl(x1);
1213 return PyInt_FromLong(x2);
1214}
1215
Guido van Rossum30a685f1991-06-27 15:51:29 +00001216/* List of functions exported by this module. */
1217
Guido van Rossum73624e91994-10-10 17:59:00 +00001218static PyMethodDef PySocket_methods[] = {
1219 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001220 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001221 {"gethostname", PySocket_gethostname},
1222 {"getservbyname", PySocket_getservbyname},
Guido van Rossumbe32c891996-06-20 16:25:29 +00001223 {"socket", PySocket_socket, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001224#ifndef NO_DUP
Guido van Rossumbe32c891996-06-20 16:25:29 +00001225 {"fromfd", PySocket_fromfd, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001226#endif
Guido van Rossum006bf911996-06-12 04:04:55 +00001227 {"ntohs", PySocket_ntohs},
1228 {"ntohl", PySocket_ntohl},
1229 {"htons", PySocket_htons},
1230 {"htonl", PySocket_htonl},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001232};
1233
Guido van Rossum30a685f1991-06-27 15:51:29 +00001234
1235/* Convenience routine to export an integer value.
1236 For simplicity, errors (which are unlikely anyway) are ignored. */
1237
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001238static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001239BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001240{
Guido van Rossum73624e91994-10-10 17:59:00 +00001241 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001242 if (v == NULL) {
1243 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001244 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001245 }
1246 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001247 PyDict_SetItemString(d, name, v);
1248 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001249 }
1250}
1251
Guido van Rossum30a685f1991-06-27 15:51:29 +00001252
Guido van Rossum8d665e61996-06-26 18:22:49 +00001253#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001254
1255/* Additional initialization and cleanup for NT/Windows */
1256
1257static void
1258NTcleanup()
1259{
1260 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00001261}
1262
1263static int
1264NTinit()
1265{
1266 WSADATA WSAData;
1267 int ret;
1268 char buf[100];
1269 ret = WSAStartup(0x0101, &WSAData);
1270 switch (ret) {
1271 case 0: /* no error */
1272 atexit(NTcleanup);
1273 return 1;
1274 case WSASYSNOTREADY:
1275 PyErr_SetString(PyExc_ImportError,
1276 "WSAStartup failed: network not ready");
1277 break;
1278 case WSAVERNOTSUPPORTED:
1279 case WSAEINVAL:
1280 PyErr_SetString(PyExc_ImportError,
1281 "WSAStartup failed: requested version not supported");
1282 break;
1283 default:
1284 sprintf(buf, "WSAStartup failed: error code %d", ret);
1285 PyErr_SetString(PyExc_ImportError, buf);
1286 break;
1287 }
1288 return 0;
1289}
1290
Guido van Rossum8d665e61996-06-26 18:22:49 +00001291#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00001292
1293
Guido van Rossum30a685f1991-06-27 15:51:29 +00001294/* Initialize this module.
1295 This is called when the first 'import socket' is done,
1296 via a table in config.c, if config.c is compiled with USE_SOCKET
Guido van Rossumbe32c891996-06-20 16:25:29 +00001297 defined.
1298
Guido van Rossum8d665e61996-06-26 18:22:49 +00001299 For MS_WINDOWS (which means any Windows variant), this module
Guido van Rossumbe32c891996-06-20 16:25:29 +00001300 is actually called "_socket", and there's a wrapper "socket.py"
1301 which implements some missing functionality (such as makefile(),
1302 dup() and fromfd()). The import of "_socket" may fail with an
1303 ImportError exception if initialization of WINSOCK fails. When
1304 WINSOCK is initialized succesfully, a call to WSACleanup() is
1305 scheduled to be made at exit time. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001306
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001307void
Guido van Rossum8d665e61996-06-26 18:22:49 +00001308#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001309init_socket()
1310#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001311initsocket()
Guido van Rossumbe32c891996-06-20 16:25:29 +00001312#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001313{
Guido van Rossum73624e91994-10-10 17:59:00 +00001314 PyObject *m, *d;
Guido van Rossum8d665e61996-06-26 18:22:49 +00001315#ifdef MS_WINDOWS
Guido van Rossumbe32c891996-06-20 16:25:29 +00001316 if (!NTinit())
1317 return;
1318 m = Py_InitModule("_socket", PySocket_methods);
1319#else
Guido van Rossum73624e91994-10-10 17:59:00 +00001320 m = Py_InitModule("socket", PySocket_methods);
Guido van Rossumbe32c891996-06-20 16:25:29 +00001321#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001322 d = PyModule_GetDict(m);
1323 PySocket_Error = PyString_FromString("socket.error");
1324 if (PySocket_Error == NULL ||
1325 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1326 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001327 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001328#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001329 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001330#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001331 insint(d, "SOCK_STREAM", SOCK_STREAM);
1332 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1333 insint(d, "SOCK_RAW", SOCK_RAW);
1334 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1335 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001336
1337#ifdef SO_DEBUG
1338 insint(d, "SO_DEBUG", SO_DEBUG);
1339#endif
1340#ifdef SO_ACCEPTCONN
1341 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1342#endif
1343#ifdef SO_REUSEADDR
1344 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1345#endif
1346#ifdef SO_KEEPALIVE
1347 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1348#endif
1349#ifdef SO_DONTROUTE
1350 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1351#endif
1352#ifdef SO_BROADCAST
1353 insint(d, "SO_BROADCAST", SO_BROADCAST);
1354#endif
1355#ifdef SO_USELOOPBACK
1356 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1357#endif
1358#ifdef SO_LINGER
1359 insint(d, "SO_LINGER", SO_LINGER);
1360#endif
1361#ifdef SO_OOBINLINE
1362 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1363#endif
1364#ifdef SO_REUSEPORT
1365 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1366#endif
1367
1368#ifdef SO_SNDBUF
1369 insint(d, "SO_SNDBUF", SO_SNDBUF);
1370#endif
1371#ifdef SO_RCVBUF
1372 insint(d, "SO_RCVBUF", SO_RCVBUF);
1373#endif
1374#ifdef SO_SNDLOWAT
1375 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1376#endif
1377#ifdef SO_RCVLOWAT
1378 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1379#endif
1380#ifdef SO_SNDTIMEO
1381 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1382#endif
1383#ifdef SO_RCVTIMEO
1384 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1385#endif
1386#ifdef SO_ERROR
1387 insint(d, "SO_ERROR", SO_ERROR);
1388#endif
1389#ifdef SO_TYPE
1390 insint(d, "SO_TYPE", SO_TYPE);
1391#endif
1392
1393 /* Maximum number of connections for "listen" */
1394#ifdef SOMAXCONN
1395 insint(d, "SOMAXCONN", SOMAXCONN);
1396#else
1397 insint(d, "SOMAXCONN", 5); /* Common value */
1398#endif
1399
1400 /* Flags for send, recv */
1401#ifdef MSG_OOB
1402 insint(d, "MSG_OOB", MSG_OOB);
1403#endif
1404#ifdef MSG_PEEK
1405 insint(d, "MSG_PEEK", MSG_PEEK);
1406#endif
1407#ifdef MSG_DONTROUTE
1408 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1409#endif
1410#ifdef MSG_EOR
1411 insint(d, "MSG_EOR", MSG_EOR);
1412#endif
1413#ifdef MSG_TRUNC
1414 insint(d, "MSG_TRUNC", MSG_TRUNC);
1415#endif
1416#ifdef MSG_CTRUNC
1417 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1418#endif
1419#ifdef MSG_WAITALL
1420 insint(d, "MSG_WAITALL", MSG_WAITALL);
1421#endif
1422#ifdef MSG_BTAG
1423 insint(d, "MSG_BTAG", MSG_BTAG);
1424#endif
1425#ifdef MSG_ETAG
1426 insint(d, "MSG_ETAG", MSG_ETAG);
1427#endif
1428
1429 /* Protocol level and numbers, usable for [gs]etsockopt */
1430#ifdef SOL_SOCKET
1431 insint(d, "SOL_SOCKET", SOL_SOCKET);
1432#endif
1433#ifdef IPPROTO_IP
1434 insint(d, "IPPROTO_IP", IPPROTO_IP);
1435#endif
1436#ifdef IPPROTO_ICMP
1437 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1438#endif
1439#ifdef IPPROTO_IGMP
1440 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1441#endif
1442#ifdef IPPROTO_GGP
1443 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1444#endif
1445#ifdef IPPROTO_TCP
1446 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1447#endif
1448#ifdef IPPROTO_EGP
1449 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1450#endif
1451#ifdef IPPROTO_PUP
1452 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1453#endif
1454#ifdef IPPROTO_UDP
1455 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1456#endif
1457#ifdef IPPROTO_IDP
1458 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1459#endif
1460#ifdef IPPROTO_HELLO
1461 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1462#endif
1463#ifdef IPPROTO_ND
1464 insint(d, "IPPROTO_ND", IPPROTO_ND);
1465#endif
1466#ifdef IPPROTO_TP
1467 insint(d, "IPPROTO_TP", IPPROTO_TP);
1468#endif
1469#ifdef IPPROTO_XTP
1470 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1471#endif
1472#ifdef IPPROTO_EON
1473 insint(d, "IPPROTO_EON", IPPROTO_EON);
1474#endif
1475#ifdef IPPROTO_BIP
1476 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1477#endif
1478/**/
1479#ifdef IPPROTO_RAW
1480 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1481#endif
1482#ifdef IPPROTO_MAX
1483 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1484#endif
1485
1486 /* Some port configuration */
1487#ifdef IPPORT_RESERVED
1488 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1489#else
1490 insint(d, "IPPORT_RESERVED", 1024);
1491#endif
1492#ifdef IPPORT_USERRESERVED
1493 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1494#else
1495 insint(d, "IPPORT_USERRESERVED", 5000);
1496#endif
1497
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001498 /* Some reserved IP v.4 addresses */
1499#ifdef INADDR_ANY
1500 insint(d, "INADDR_ANY", INADDR_ANY);
1501#else
1502 insint(d, "INADDR_ANY", 0x00000000);
1503#endif
1504#ifdef INADDR_BROADCAST
1505 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1506#else
1507 insint(d, "INADDR_BROADCAST", 0xffffffff);
1508#endif
1509#ifdef INADDR_LOOPBACK
1510 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1511#else
1512 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1513#endif
1514#ifdef INADDR_UNSPEC_GROUP
1515 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1516#else
1517 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1518#endif
1519#ifdef INADDR_ALLHOSTS_GROUP
1520 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1521#else
1522 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1523#endif
1524#ifdef INADDR_MAX_LOCAL_GROUP
1525 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1526#else
1527 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1528#endif
1529#ifdef INADDR_NONE
1530 insint(d, "INADDR_NONE", INADDR_NONE);
1531#else
1532 insint(d, "INADDR_NONE", 0xffffffff);
1533#endif
1534
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001535 /* IP [gs]etsockopt options */
1536#ifdef IP_OPTIONS
1537 insint(d, "IP_OPTIONS", IP_OPTIONS);
1538#endif
1539#ifdef IP_HDRINCL
1540 insint(d, "IP_HDRINCL", IP_HDRINCL);
1541#endif
1542#ifdef IP_TOS
1543 insint(d, "IP_TOS", IP_TOS);
1544#endif
1545#ifdef IP_TTL
1546 insint(d, "IP_TTL", IP_TTL);
1547#endif
1548#ifdef IP_RECVOPTS
1549 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1550#endif
1551#ifdef IP_RECVRETOPTS
1552 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1553#endif
1554#ifdef IP_RECVDSTADDR
1555 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1556#endif
1557#ifdef IP_RETOPTS
1558 insint(d, "IP_RETOPTS", IP_RETOPTS);
1559#endif
1560#ifdef IP_MULTICAST_IF
1561 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1562#endif
1563#ifdef IP_MULTICAST_TTL
1564 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1565#endif
1566#ifdef IP_MULTICAST_LOOP
1567 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1568#endif
1569#ifdef IP_ADD_MEMBERSHIP
1570 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1571#endif
1572#ifdef IP_DROP_MEMBERSHIP
1573 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1574#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001575}