blob: 571a751743554d0d3a9d8685da11d8a3bd3626c7 [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 Rossum6574b3e1991-06-25 21:36:08 +000034
Guido van Rossum27e177d1995-03-16 15:43:47 +000035Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000036
Guido van Rossum27e177d1995-03-16 15:43:47 +000037- socket.error: exception raised for socket specific errors
Guido van Rossum30a685f1991-06-27 15:51:29 +000038- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000039- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000040- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
41- socket.getservbyname(servicename, protocolname) --> port number
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000042- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum27e177d1995-03-16 15:43:47 +000043- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044- an Internet socket address is a pair (hostname, port)
45 where hostname can be anything recognized by gethostbyname()
46 (including the dd.dd.dd.dd notation) and port is in host byte order
47- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000048- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000049
Guido van Rossum30a685f1991-06-27 15:51:29 +000050Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000051
Guido van Rossum81194471991-07-27 21:42:02 +000052- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000053- s.bind(sockaddr) --> None
54- s.close() --> None
55- s.connect(sockaddr) --> None
56- s.fileno() --> file descriptor
Guido van Rossumc89705d1992-11-26 08:54:07 +000057- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000058- s.getsockname() --> sockaddr
59- s.getsockopt(level, optname[, buflen]) --> int or string
60- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000061- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000062- s.recv(buflen [,flags]) --> string
63- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000064- s.send(string [,flags]) --> nbytes
65- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- s.setblocking(0 | 1) --> None
67- s.setsockopt(level, optname, value) --> None
68- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000069- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000070
Guido van Rossum6574b3e1991-06-25 21:36:08 +000071*/
72
Guido van Rossum73624e91994-10-10 17:59:00 +000073#include "Python.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000074
Guido van Rossumb6775db1994-08-01 11:34:53 +000075#include <sys/types.h>
76#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000077
Guido van Rossum81194471991-07-27 21:42:02 +000078#include <signal.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000079#ifndef NT
Guido van Rossumb6775db1994-08-01 11:34:53 +000080#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000081#include <sys/socket.h>
82#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +000083#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000084#else
85#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +000086#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000087#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000088#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +000089#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000090#else
91#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +000092#endif
93
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000094#ifndef O_NDELAY
95#define O_NDELAY O_NONBLOCK /* For QNX only? */
96#endif
97
98
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000099/* Here we have some hacks to choose between K&R or ANSI style function
100 definitions. For NT to build this as an extension module (ie, DLL)
101 it must be compiled by the C++ compiler, as it takes the address of
102 a static data item exported from the main Python DLL.
103*/
104#ifdef NT
105/* seem to be a few differences in the API */
106#define close closesocket
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000107#define NO_DUP /* Define for NT 3.1, Win3.1 and Win95, Undefine for NT3.5 */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000108#define FORCE_ANSI_FUNC_DEFS
109#endif
110
111#ifdef FORCE_ANSI_FUNC_DEFS
112#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
113fnname( arg1type arg1name )
114
115#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
116fnname( arg1type arg1name, arg2type arg2name )
117
118#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
119fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
120
121#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
122fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
123
124#else /* !FORCE_ANSI_FN_DEFS */
125#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
126fnname( arg1name ) \
127 arg1type arg1name;
128
129#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
130fnname( arg1name, arg2name ) \
131 arg1type arg1name; \
132 arg2type arg2name;
133
134#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
135fnname( arg1name, arg2name, arg3name ) \
136 arg1type arg1name; \
137 arg2type arg2name; \
138 arg3type arg3name;
139
140#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
141fnname( arg1name, arg2name, arg3name, arg4name ) \
142 arg1type arg1name; \
143 arg2type arg2name; \
144 arg3type arg3name; \
145 arg4type arg4name;
146
147#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000148
149/* Global variable holding the exception type for errors detected
150 by this module (but not argument type or memory errors, etc.). */
151
Guido van Rossum73624e91994-10-10 17:59:00 +0000152static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000153
154
155/* Convenience function to raise an error according to errno
156 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000157
Guido van Rossum73624e91994-10-10 17:59:00 +0000158static PyObject *
159PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000160{
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000161#ifdef NT
162 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000163 PyObject *v;
164 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000165 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000166 PyErr_SetObject(PySocket_Error, v);
167 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000168 }
169 return NULL;
170 }
171 else
172#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000173 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000174}
175
Guido van Rossum30a685f1991-06-27 15:51:29 +0000176
177/* The object holding a socket. It holds some extra information,
178 like the address family, which is used to decode socket address
179 arguments properly. */
180
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000181typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000182 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000183 int sock_fd; /* Socket file descriptor */
184 int sock_family; /* Address family, e.g., AF_INET */
185 int sock_type; /* Socket type, e.g., SOCK_STREAM */
186 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000187 union sock_addr {
188 struct sockaddr_in in;
189#ifdef AF_UNIX
190 struct sockaddr_un un;
191#endif
192 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000193} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000194
Guido van Rossum30a685f1991-06-27 15:51:29 +0000195
196/* A forward reference to the Socktype type object.
197 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000198 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000199 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000200
Guido van Rossum73624e91994-10-10 17:59:00 +0000201staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000202
Guido van Rossum30a685f1991-06-27 15:51:29 +0000203
204/* Create a new socket object.
205 This just creates the object and initializes it.
206 If the creation fails, return NULL and set an exception (implicit
207 in NEWOBJ()). */
208
Guido van Rossum73624e91994-10-10 17:59:00 +0000209static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000210BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000211{
Guido van Rossum73624e91994-10-10 17:59:00 +0000212 PySocketSockObject *s;
213 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000214 if (s != NULL) {
215 s->sock_fd = fd;
216 s->sock_family = family;
217 s->sock_type = type;
218 s->sock_proto = proto;
219 }
220 return s;
221}
222
Guido van Rossum30a685f1991-06-27 15:51:29 +0000223
224/* Convert a string specifying a host name or one of a few symbolic
225 names to a numeric IP address. This usually calls gethostbyname()
226 to do the work; the names "" and "<broadcast>" are special.
227 Return the length (should always be 4 bytes), or negative if
228 an error occurred; then an exception is raised. */
229
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000230static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000231BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000232{
233 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000234 int d1, d2, d3, d4;
235 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000236#ifdef HAVE_GETHOSTBYNAME_R
237 struct hostent hp_allocated;
238 char buf[1001];
239 int buf_len = (sizeof buf) - 1;
240 int errnop;
241#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000242
Guido van Rossum30a685f1991-06-27 15:51:29 +0000243 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000244 addr_ret->sin_addr.s_addr = INADDR_ANY;
245 return 4;
246 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000247 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000248 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
249 return 4;
250 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000251 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
252 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
253 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
254 addr_ret->sin_addr.s_addr = htonl(
255 ((long) d1 << 24) | ((long) d2 << 16) |
256 ((long) d3 << 8) | ((long) d4 << 0));
257 return 4;
258 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000259#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000260 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000261 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000262 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000263#else /* not HAVE_GETHOSTBYNAME_R */
264 hp = gethostbyname(name);
265#endif /* HAVE_GETHOSTBYNAME_R */
266
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000267 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000268#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000269 /* Let's get real error message to return */
270 extern int h_errno;
271 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
272#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000273 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000274#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000275 return -1;
276 }
277 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
278 return hp->h_length;
279}
280
Guido van Rossum30a685f1991-06-27 15:51:29 +0000281
Guido van Rossum30a685f1991-06-27 15:51:29 +0000282/* Create a string object representing an IP address.
283 This is always a string of the form 'dd.dd.dd.dd' (with variable
284 size numbers). */
285
Guido van Rossum73624e91994-10-10 17:59:00 +0000286static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000287BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000288{
289 long x = ntohl(addr->sin_addr.s_addr);
290 char buf[100];
291 sprintf(buf, "%d.%d.%d.%d",
292 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
293 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000294 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000295}
296
297
298/* Create an object representing the given socket address,
299 suitable for passing it back to bind(), connect() etc.
300 The family field of the sockaddr structure is inspected
301 to determine what kind of address it really is. */
302
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000303/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000304static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000305BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000306{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000307 if (addrlen == 0) {
308 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000309 Py_INCREF(Py_None);
310 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000311 }
312
Guido van Rossum30a685f1991-06-27 15:51:29 +0000313 switch (addr->sa_family) {
314
315 case AF_INET:
316 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000317 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000318 PyObject *addr = makeipaddr(a);
319 PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
320 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000321 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000322 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000323
Guido van Rossumb6775db1994-08-01 11:34:53 +0000324#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000325 case AF_UNIX:
326 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000327 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000328 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000329 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000330#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000331
332 /* More cases here... */
333
334 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000335 PyErr_SetString(PySocket_Error, "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000336 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000337
Guido van Rossum30a685f1991-06-27 15:51:29 +0000338 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000339}
340
Guido van Rossum30a685f1991-06-27 15:51:29 +0000341
342/* Parse a socket address argument according to the socket object's
343 address family. Return 1 if the address was in the proper format,
344 0 of not. The address is returned through addr_ret, its length
345 through len_ret. */
346
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000347static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000348BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000349getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000350{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000351 switch (s->sock_family) {
352
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 Rossum3bbc62e1995-01-02 19:30:30 +0000356 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000357 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000358 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000359 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000360 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000361 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000362 if (len > sizeof addr->sun_path) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000363 PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000364 return 0;
365 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000366 addr->sun_family = AF_UNIX;
367 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000368 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000369 *addr_ret = (struct sockaddr *) addr;
370 *len_ret = len + sizeof addr->sun_family;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000371 return 1;
372 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000373#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000374
Guido van Rossum30a685f1991-06-27 15:51:29 +0000375 case AF_INET:
376 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000377 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000378 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000379 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000380 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000381 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000382 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000383 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000384 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000385 addr->sin_family = AF_INET;
386 addr->sin_port = htons(port);
387 *addr_ret = (struct sockaddr *) addr;
388 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000389 return 1;
390 }
391
Guido van Rossum30a685f1991-06-27 15:51:29 +0000392 /* More cases here... */
393
394 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000395 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000396 return 0;
397
398 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000399}
400
Guido van Rossum30a685f1991-06-27 15:51:29 +0000401
Guido van Rossum710e1df1992-06-12 10:39:36 +0000402/* Get the address length according to the socket object's address family.
403 Return 1 if the family is known, 0 otherwise. The length is returned
404 through len_ret. */
405
406static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000407BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000408{
409 switch (s->sock_family) {
410
Guido van Rossumb6775db1994-08-01 11:34:53 +0000411#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000412 case AF_UNIX:
413 {
414 *len_ret = sizeof (struct sockaddr_un);
415 return 1;
416 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000417#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000418
419 case AF_INET:
420 {
421 *len_ret = sizeof (struct sockaddr_in);
422 return 1;
423 }
424
425 /* More cases here... */
426
427 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000428 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000429 return 0;
430
431 }
432}
433
434
Guido van Rossum30a685f1991-06-27 15:51:29 +0000435/* s.accept() method */
436
Guido van Rossum73624e91994-10-10 17:59:00 +0000437static PyObject *
438BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000439{
440 char addrbuf[256];
441 int addrlen, newfd;
Guido van Rossum73624e91994-10-10 17:59:00 +0000442 PyObject *sock, *addr, *res;
443 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000444 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000445 if (!getsockaddrlen(s, &addrlen))
446 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000447 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000448 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000449 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000450 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000451 return PySocket_Err();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000452 /* Create the new object with unspecified family,
453 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000454 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000455 s->sock_family,
456 s->sock_type,
457 s->sock_proto);
458 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000459 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000460 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000461 res = Py_BuildValue("OO", sock, addr);
462 Py_XDECREF(sock);
463 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000464 return res;
465}
466
Guido van Rossum30a685f1991-06-27 15:51:29 +0000467
Guido van Rossumc65a5251994-08-05 13:44:50 +0000468#if 0
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000469/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000470/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000471
Guido van Rossum73624e91994-10-10 17:59:00 +0000472static PyObject *
473BUILD_FUNC_DEF_2(PySocketSock_allowbroadcast,PySocketSockObject *,s, PyObject *,args)
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000474{
475 int flag;
476 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000477 if (!PyArg_Parse(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000478 return NULL;
479 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000480 (ANY *)&flag, sizeof flag);
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000481 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000482 return PySocket_Err();
483 Py_INCREF(Py_None);
484 return Py_None;
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000485}
Guido van Rossumc65a5251994-08-05 13:44:50 +0000486#endif
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000487
488
Guido van Rossume4485b01994-09-07 14:32:49 +0000489/* s.setblocking(1 | 0) method */
490
Guido van Rossum73624e91994-10-10 17:59:00 +0000491static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000492BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000493{
494 int block;
495 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000496 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000497 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000498 Py_BEGIN_ALLOW_THREADS
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000499#ifndef NT
Guido van Rossume4485b01994-09-07 14:32:49 +0000500 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
501 if (block)
502 delay_flag &= (~O_NDELAY);
503 else
504 delay_flag |= O_NDELAY;
505 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000506#else
507 block = !block;
508 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
509#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000510 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000511
Guido van Rossum73624e91994-10-10 17:59:00 +0000512 Py_INCREF(Py_None);
513 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000514}
Guido van Rossume4485b01994-09-07 14:32:49 +0000515
516
Guido van Rossumaee08791992-09-08 09:05:33 +0000517/* s.setsockopt() method.
518 With an integer third argument, sets an integer option.
519 With a string third argument, sets an option from a buffer;
520 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000521
Guido van Rossum73624e91994-10-10 17:59:00 +0000522static PyObject *
523BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000524{
525 int level;
526 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000527 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000528 char *buf;
529 int buflen;
530 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000531
Guido van Rossum73624e91994-10-10 17:59:00 +0000532 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000533 buf = (char *) &flag;
534 buflen = sizeof flag;
535 }
536 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000537 PyErr_Clear();
538 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000539 return NULL;
540 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000541 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000542 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000543 return PySocket_Err();
544 Py_INCREF(Py_None);
545 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000546}
547
548
Guido van Rossumaee08791992-09-08 09:05:33 +0000549/* s.getsockopt() method.
550 With two arguments, retrieves an integer option.
551 With a third integer argument, retrieves a string buffer of that size;
552 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000553
Guido van Rossum73624e91994-10-10 17:59:00 +0000554static PyObject *
555BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000556{
557 int level;
558 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000559 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000560 PyObject *buf;
Guido van Rossumaee08791992-09-08 09:05:33 +0000561 int buflen;
562 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000563
Guido van Rossum73624e91994-10-10 17:59:00 +0000564 if (PyArg_Parse(args, "(ii)", &level, &optname)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000565 int flag = 0;
566 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000567 res = getsockopt(s->sock_fd, level, optname,
568 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000569 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000570 return PySocket_Err();
571 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000572 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000573 PyErr_Clear();
574 if (!PyArg_Parse(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000575 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000576 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000577 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000578 return NULL;
579 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000580 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000581 if (buf == NULL)
582 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000583 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000584 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000585 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000586 Py_DECREF(buf);
587 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000588 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000589 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000590 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000591}
592
593
Guido van Rossum30a685f1991-06-27 15:51:29 +0000594/* s.bind(sockaddr) method */
595
Guido van Rossum73624e91994-10-10 17:59:00 +0000596static PyObject *
597BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000598{
599 struct sockaddr *addr;
600 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000601 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000602 if (!getsockaddrarg(s, args, &addr, &addrlen))
603 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000604 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000605 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000606 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000607 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000608 return PySocket_Err();
609 Py_INCREF(Py_None);
610 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000611}
612
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613
614/* s.close() method.
615 Set the file descriptor to -1 so operations tried subsequently
616 will surely fail. */
617
Guido van Rossum73624e91994-10-10 17:59:00 +0000618static PyObject *
619BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000620{
Guido van Rossum73624e91994-10-10 17:59:00 +0000621 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000622 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000623 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000625 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000627 Py_INCREF(Py_None);
628 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629}
630
Guido van Rossum30a685f1991-06-27 15:51:29 +0000631
632/* s.connect(sockaddr) method */
633
Guido van Rossum73624e91994-10-10 17:59:00 +0000634static PyObject *
635BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000636{
637 struct sockaddr *addr;
638 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000639 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000640 if (!getsockaddrarg(s, args, &addr, &addrlen))
641 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000642 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000643 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000644 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000645 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000646 return PySocket_Err();
647 Py_INCREF(Py_None);
648 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000649}
650
Guido van Rossum30a685f1991-06-27 15:51:29 +0000651
Guido van Rossumed233a51992-06-23 09:07:03 +0000652/* s.fileno() method */
653
Guido van Rossum73624e91994-10-10 17:59:00 +0000654static PyObject *
655BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000656{
Guido van Rossum73624e91994-10-10 17:59:00 +0000657 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000658 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000659 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000660}
661
662
Guido van Rossumc89705d1992-11-26 08:54:07 +0000663/* s.getsockname() method */
664
Guido van Rossum73624e91994-10-10 17:59:00 +0000665static PyObject *
666BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000667{
668 char addrbuf[256];
669 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000670 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000671 return NULL;
672 if (!getsockaddrlen(s, &addrlen))
673 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000674 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000675 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000677 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000678 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000679 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
680}
681
682
Guido van Rossumb6775db1994-08-01 11:34:53 +0000683#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000684/* s.getpeername() method */
685
Guido van Rossum73624e91994-10-10 17:59:00 +0000686static PyObject *
687BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000688{
689 char addrbuf[256];
690 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000691 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000692 return NULL;
693 if (!getsockaddrlen(s, &addrlen))
694 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000695 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000696 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000697 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000698 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000699 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000700 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
701}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000702#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000703
704
Guido van Rossum30a685f1991-06-27 15:51:29 +0000705/* s.listen(n) method */
706
Guido van Rossum73624e91994-10-10 17:59:00 +0000707static PyObject *
708BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000709{
710 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000711 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000712 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000713 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000714 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000715 if (backlog < 1)
716 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000717 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000718 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000719 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000720 return PySocket_Err();
721 Py_INCREF(Py_None);
722 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000723}
724
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000725#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000726/* s.makefile(mode) method.
727 Create a new open file object referring to a dupped version of
728 the socket's file descriptor. (The dup() call is necessary so
729 that the open file and socket objects may be closed independent
730 of each other.)
731 The mode argument specifies 'r' or 'w' passed to fdopen(). */
732
Guido van Rossum73624e91994-10-10 17:59:00 +0000733static PyObject *
734BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000735{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000736 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000737 char *mode = "r";
738 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739 int fd;
740 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000741 PyObject *f;
742
743 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000744 return NULL;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000745#ifdef NT
746 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
747 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
748#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000749 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000750 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000751#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000752 if (fd >= 0)
753 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000754 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000755 }
756 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
757 if (f != NULL)
758 PyFile_SetBufSize(f, bufsize);
759 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000760}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000761#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000762
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000763/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764
Guido van Rossum73624e91994-10-10 17:59:00 +0000765static PyObject *
766BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767{
768 int len, n, flags;
Guido van Rossum73624e91994-10-10 17:59:00 +0000769 PyObject *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000770 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000771 if (!PyArg_Parse(args, "i", &len)) {
772 PyErr_Clear();
773 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000774 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000775 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000776 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000777 if (buf == NULL)
778 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000779 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000780 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000781 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000782 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000783 return PySocket_Err();
784 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785 return NULL;
786 return buf;
787}
788
Guido van Rossum30a685f1991-06-27 15:51:29 +0000789
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000790/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000791
Guido van Rossum73624e91994-10-10 17:59:00 +0000792static PyObject *
793BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794{
795 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000796 PyObject *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000797 int addrlen, len, n, flags;
798 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000799 if (!PyArg_Parse(args, "i", &len)) {
800 PyErr_Clear();
801 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000802 return NULL;
803 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000804 if (!getsockaddrlen(s, &addrlen))
805 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000807 if (buf == NULL)
808 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000809 Py_BEGIN_ALLOW_THREADS
810 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000811#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000812 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000813#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000814 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000815#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000816 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000817 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000818 return PySocket_Err();
819 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000820 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000821 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000822 ret = Py_BuildValue("OO", buf, addr);
823 Py_XDECREF(addr);
824 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000825 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826}
827
Guido van Rossum30a685f1991-06-27 15:51:29 +0000828
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000829/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000830
Guido van Rossum73624e91994-10-10 17:59:00 +0000831static PyObject *
832BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000834 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000835 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000836 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000837 if (!PyArg_Parse(args, "s#", &buf, &len)) {
838 PyErr_Clear();
839 if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000840 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000842 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000843 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000844 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000846 return PySocket_Err();
847 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000848}
849
850
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000851/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000852
Guido van Rossum73624e91994-10-10 17:59:00 +0000853static PyObject *
854BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000855{
Guido van Rossum73624e91994-10-10 17:59:00 +0000856 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000857 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000858 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000859 int addrlen, len, n, flags;
860 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000861 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
862 PyErr_Clear();
863 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000864 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000865 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000866 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000867 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000868 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000869 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000870 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000871 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 return PySocket_Err();
873 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874}
875
Guido van Rossum30a685f1991-06-27 15:51:29 +0000876
877/* s.shutdown(how) method */
878
Guido van Rossum73624e91994-10-10 17:59:00 +0000879static PyObject *
880BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000881{
882 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000883 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000884 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000885 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000886 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000887 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000888 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000889 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000890 return PySocket_Err();
891 Py_INCREF(Py_None);
892 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000893}
894
Guido van Rossum30a685f1991-06-27 15:51:29 +0000895
896/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897
Guido van Rossum73624e91994-10-10 17:59:00 +0000898static PyMethodDef PySocketSock_methods[] = {
899 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000900#if 0
Guido van Rossum73624e91994-10-10 17:59:00 +0000901 {"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000902#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000903 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000904 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
905 {"getsockopt", (PyCFunction)PySocketSock_getsockopt},
906 {"bind", (PyCFunction)PySocketSock_bind},
907 {"close", (PyCFunction)PySocketSock_close},
908 {"connect", (PyCFunction)PySocketSock_connect},
909 {"fileno", (PyCFunction)PySocketSock_fileno},
910 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000911#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000912 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000913#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000914 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000915#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000916 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000917#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000918 {"recv", (PyCFunction)PySocketSock_recv},
919 {"recvfrom", (PyCFunction)PySocketSock_recvfrom},
920 {"send", (PyCFunction)PySocketSock_send},
921 {"sendto", (PyCFunction)PySocketSock_sendto},
922 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000923 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000924};
925
Guido van Rossum30a685f1991-06-27 15:51:29 +0000926
Guido van Rossum73624e91994-10-10 17:59:00 +0000927/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928 First close the file description. */
929
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000930static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000931BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000932{
933 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000934 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000935}
936
Guido van Rossum30a685f1991-06-27 15:51:29 +0000937
938/* Return a socket object's named attribute. */
939
Guido van Rossum73624e91994-10-10 17:59:00 +0000940static PyObject *
941BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942{
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944}
945
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000947static PyObject *
948BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
949{
950 PyObject *addro;
951 struct sockaddr *addr;
952 char buf[512];
Guido van Rossuma597dde1995-01-10 20:56:29 +0000953 PyObject *t, *comma, *v;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000954 int i, len;
955 sprintf(buf,
956 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
957 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossuma597dde1995-01-10 20:56:29 +0000958 t = PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000959 return t;
960}
961
962
Guido van Rossumb6775db1994-08-01 11:34:53 +0000963/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000964
Guido van Rossum73624e91994-10-10 17:59:00 +0000965static PyTypeObject PySocketSock_Type = {
966 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000967 0,
968 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000969 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000971 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000973 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000974 0, /*tp_setattr*/
975 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000976 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000977 0, /*tp_as_number*/
978 0, /*tp_as_sequence*/
979 0, /*tp_as_mapping*/
980};
981
Guido van Rossum30a685f1991-06-27 15:51:29 +0000982
Guido van Rossum81194471991-07-27 21:42:02 +0000983/* Python interface to gethostname(). */
984
985/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000986static PyObject *
987BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000988{
989 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000990 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000991 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +0000992 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000993 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000994 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000996 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000997 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +0000998 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +0000999 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001000}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001001
1002
Guido van Rossum30a685f1991-06-27 15:51:29 +00001003/* Python interface to gethostbyname(name). */
1004
1005/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001006static PyObject *
1007BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001008{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001009 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001010 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001011 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001012 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001013 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001014 return NULL;
1015 return makeipaddr(&addrbuf);
1016}
1017
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001018/* Python interface to gethostbyaddr(IP). */
1019
1020/*ARGSUSED*/
1021static PyObject *
1022BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1023{
1024 struct sockaddr_in addr;
1025 char *ip_num;
1026 struct hostent *h;
1027 int d1,d2,d3,d4;
1028 char ch, **pch;
1029 PyObject *rtn_tuple = (PyObject *)NULL;
1030 PyObject *name_list = (PyObject *)NULL;
1031 PyObject *addr_list = (PyObject *)NULL;
1032 PyObject *tmp;
1033
1034 if (!PyArg_Parse(args, "s", &ip_num))
1035 return NULL;
1036 if (setipaddr(ip_num, &addr) < 0)
1037 return NULL;
1038 h = gethostbyaddr((char *)&addr.sin_addr,
1039 sizeof(addr.sin_addr),
1040 AF_INET);
1041 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001042#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001043 /* Let's get real error message to return */
1044 extern int h_errno;
1045 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1046#else
1047 PyErr_SetString(PySocket_Error, "host not found");
1048#endif
1049 return NULL;
1050 }
1051 if ((name_list = PyList_New(0)) == NULL)
1052 goto err;
1053 if ((addr_list = PyList_New(0)) == NULL)
1054 goto err;
1055 for (pch = h->h_aliases; *pch != NULL; pch++) {
1056 tmp = PyString_FromString(*pch);
1057 if (tmp == NULL)
1058 goto err;
1059 PyList_Append(name_list, tmp);
1060 Py_DECREF(tmp);
1061 }
1062 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1063 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1064 tmp = makeipaddr(&addr);
1065 if (tmp == NULL)
1066 goto err;
1067 PyList_Append(addr_list, tmp);
1068 Py_DECREF(tmp);
1069 }
1070 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1071 err:
1072 Py_XDECREF(name_list);
1073 Py_XDECREF(addr_list);
1074 return rtn_tuple;
1075}
1076
Guido van Rossum30a685f1991-06-27 15:51:29 +00001077
1078/* Python interface to getservbyname(name).
1079 This only returns the port number, since the other info is already
1080 known or not useful (like the list of aliases). */
1081
1082/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001083static PyObject *
1084BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001085{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001086 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001087 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001088 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001089 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001090 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001091 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001092 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001093 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001094 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001095 return NULL;
1096 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001097 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001098}
1099
1100
1101/* Python interface to socket(family, type, proto).
1102 The third (protocol) argument is optional.
1103 Return a new socket object. */
1104
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001105/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001106static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001107BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001108{
Guido van Rossum73624e91994-10-10 17:59:00 +00001109 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001110 int fd, family, type, proto;
1111 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001112 if (!PyArg_Parse(args, "(ii)", &family, &type)) {
1113 PyErr_Clear();
1114 if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001115 return NULL;
1116 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001117 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001118 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001119 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001120 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001121 return PySocket_Err();
1122 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001123 /* If the object can't be created, don't forget to close the
1124 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001125 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001126 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001127 /* From now on, ignore SIGPIPE and let the error checking
1128 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001129#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001130 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001131#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001132 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001133}
1134
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001135#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001136/* Create a socket object from a numeric file description.
1137 Useful e.g. if stdin is a socket.
1138 Additional arguments as for socket(). */
1139
1140/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001141static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001142BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001143{
Guido van Rossum73624e91994-10-10 17:59:00 +00001144 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001145 int fd, family, type, proto;
1146 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001147 if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
1148 PyErr_Clear();
1149 if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001150 return NULL;
1151 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001152 /* Dup the fd so it and the socket can be closed independently */
1153 fd = dup(fd);
1154 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001155 return PySocket_Err();
1156 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001157 /* From now on, ignore SIGPIPE and let the error checking
1158 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001159#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001160 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001161#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001162 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001163}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001164#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001165
Guido van Rossum30a685f1991-06-27 15:51:29 +00001166/* List of functions exported by this module. */
1167
Guido van Rossum73624e91994-10-10 17:59:00 +00001168static PyMethodDef PySocket_methods[] = {
1169 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001170 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001171 {"gethostname", PySocket_gethostname},
1172 {"getservbyname", PySocket_getservbyname},
1173 {"socket", PySocket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001174#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +00001175 {"fromfd", PySocket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001176#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001177 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001178};
1179
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180
1181/* Convenience routine to export an integer value.
1182 For simplicity, errors (which are unlikely anyway) are ignored. */
1183
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001184static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001185BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001186{
Guido van Rossum73624e91994-10-10 17:59:00 +00001187 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001188 if (v == NULL) {
1189 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001190 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191 }
1192 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001193 PyDict_SetItemString(d, name, v);
1194 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001195 }
1196}
1197
Guido van Rossum30a685f1991-06-27 15:51:29 +00001198
1199/* Initialize this module.
1200 This is called when the first 'import socket' is done,
1201 via a table in config.c, if config.c is compiled with USE_SOCKET
1202 defined. */
1203
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001204void
1205initsocket()
1206{
Guido van Rossum73624e91994-10-10 17:59:00 +00001207 PyObject *m, *d;
1208 m = Py_InitModule("socket", PySocket_methods);
1209 d = PyModule_GetDict(m);
1210 PySocket_Error = PyString_FromString("socket.error");
1211 if (PySocket_Error == NULL ||
1212 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1213 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001214 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001215#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001216 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001217#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001218 insint(d, "SOCK_STREAM", SOCK_STREAM);
1219 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1220 insint(d, "SOCK_RAW", SOCK_RAW);
1221 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1222 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001223
1224#ifdef SO_DEBUG
1225 insint(d, "SO_DEBUG", SO_DEBUG);
1226#endif
1227#ifdef SO_ACCEPTCONN
1228 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1229#endif
1230#ifdef SO_REUSEADDR
1231 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1232#endif
1233#ifdef SO_KEEPALIVE
1234 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1235#endif
1236#ifdef SO_DONTROUTE
1237 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1238#endif
1239#ifdef SO_BROADCAST
1240 insint(d, "SO_BROADCAST", SO_BROADCAST);
1241#endif
1242#ifdef SO_USELOOPBACK
1243 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1244#endif
1245#ifdef SO_LINGER
1246 insint(d, "SO_LINGER", SO_LINGER);
1247#endif
1248#ifdef SO_OOBINLINE
1249 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1250#endif
1251#ifdef SO_REUSEPORT
1252 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1253#endif
1254
1255#ifdef SO_SNDBUF
1256 insint(d, "SO_SNDBUF", SO_SNDBUF);
1257#endif
1258#ifdef SO_RCVBUF
1259 insint(d, "SO_RCVBUF", SO_RCVBUF);
1260#endif
1261#ifdef SO_SNDLOWAT
1262 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1263#endif
1264#ifdef SO_RCVLOWAT
1265 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1266#endif
1267#ifdef SO_SNDTIMEO
1268 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1269#endif
1270#ifdef SO_RCVTIMEO
1271 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1272#endif
1273#ifdef SO_ERROR
1274 insint(d, "SO_ERROR", SO_ERROR);
1275#endif
1276#ifdef SO_TYPE
1277 insint(d, "SO_TYPE", SO_TYPE);
1278#endif
1279
1280 /* Maximum number of connections for "listen" */
1281#ifdef SOMAXCONN
1282 insint(d, "SOMAXCONN", SOMAXCONN);
1283#else
1284 insint(d, "SOMAXCONN", 5); /* Common value */
1285#endif
1286
1287 /* Flags for send, recv */
1288#ifdef MSG_OOB
1289 insint(d, "MSG_OOB", MSG_OOB);
1290#endif
1291#ifdef MSG_PEEK
1292 insint(d, "MSG_PEEK", MSG_PEEK);
1293#endif
1294#ifdef MSG_DONTROUTE
1295 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1296#endif
1297#ifdef MSG_EOR
1298 insint(d, "MSG_EOR", MSG_EOR);
1299#endif
1300#ifdef MSG_TRUNC
1301 insint(d, "MSG_TRUNC", MSG_TRUNC);
1302#endif
1303#ifdef MSG_CTRUNC
1304 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1305#endif
1306#ifdef MSG_WAITALL
1307 insint(d, "MSG_WAITALL", MSG_WAITALL);
1308#endif
1309#ifdef MSG_BTAG
1310 insint(d, "MSG_BTAG", MSG_BTAG);
1311#endif
1312#ifdef MSG_ETAG
1313 insint(d, "MSG_ETAG", MSG_ETAG);
1314#endif
1315
1316 /* Protocol level and numbers, usable for [gs]etsockopt */
1317#ifdef SOL_SOCKET
1318 insint(d, "SOL_SOCKET", SOL_SOCKET);
1319#endif
1320#ifdef IPPROTO_IP
1321 insint(d, "IPPROTO_IP", IPPROTO_IP);
1322#endif
1323#ifdef IPPROTO_ICMP
1324 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1325#endif
1326#ifdef IPPROTO_IGMP
1327 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1328#endif
1329#ifdef IPPROTO_GGP
1330 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1331#endif
1332#ifdef IPPROTO_TCP
1333 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1334#endif
1335#ifdef IPPROTO_EGP
1336 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1337#endif
1338#ifdef IPPROTO_PUP
1339 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1340#endif
1341#ifdef IPPROTO_UDP
1342 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1343#endif
1344#ifdef IPPROTO_IDP
1345 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1346#endif
1347#ifdef IPPROTO_HELLO
1348 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1349#endif
1350#ifdef IPPROTO_ND
1351 insint(d, "IPPROTO_ND", IPPROTO_ND);
1352#endif
1353#ifdef IPPROTO_TP
1354 insint(d, "IPPROTO_TP", IPPROTO_TP);
1355#endif
1356#ifdef IPPROTO_XTP
1357 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1358#endif
1359#ifdef IPPROTO_EON
1360 insint(d, "IPPROTO_EON", IPPROTO_EON);
1361#endif
1362#ifdef IPPROTO_BIP
1363 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1364#endif
1365/**/
1366#ifdef IPPROTO_RAW
1367 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1368#endif
1369#ifdef IPPROTO_MAX
1370 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1371#endif
1372
1373 /* Some port configuration */
1374#ifdef IPPORT_RESERVED
1375 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1376#else
1377 insint(d, "IPPORT_RESERVED", 1024);
1378#endif
1379#ifdef IPPORT_USERRESERVED
1380 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1381#else
1382 insint(d, "IPPORT_USERRESERVED", 5000);
1383#endif
1384
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001385 /* Some reserved IP v.4 addresses */
1386#ifdef INADDR_ANY
1387 insint(d, "INADDR_ANY", INADDR_ANY);
1388#else
1389 insint(d, "INADDR_ANY", 0x00000000);
1390#endif
1391#ifdef INADDR_BROADCAST
1392 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1393#else
1394 insint(d, "INADDR_BROADCAST", 0xffffffff);
1395#endif
1396#ifdef INADDR_LOOPBACK
1397 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1398#else
1399 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1400#endif
1401#ifdef INADDR_UNSPEC_GROUP
1402 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1403#else
1404 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1405#endif
1406#ifdef INADDR_ALLHOSTS_GROUP
1407 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1408#else
1409 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1410#endif
1411#ifdef INADDR_MAX_LOCAL_GROUP
1412 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1413#else
1414 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1415#endif
1416#ifdef INADDR_NONE
1417 insint(d, "INADDR_NONE", INADDR_NONE);
1418#else
1419 insint(d, "INADDR_NONE", 0xffffffff);
1420#endif
1421
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001422 /* IP [gs]etsockopt options */
1423#ifdef IP_OPTIONS
1424 insint(d, "IP_OPTIONS", IP_OPTIONS);
1425#endif
1426#ifdef IP_HDRINCL
1427 insint(d, "IP_HDRINCL", IP_HDRINCL);
1428#endif
1429#ifdef IP_TOS
1430 insint(d, "IP_TOS", IP_TOS);
1431#endif
1432#ifdef IP_TTL
1433 insint(d, "IP_TTL", IP_TTL);
1434#endif
1435#ifdef IP_RECVOPTS
1436 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1437#endif
1438#ifdef IP_RECVRETOPTS
1439 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1440#endif
1441#ifdef IP_RECVDSTADDR
1442 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1443#endif
1444#ifdef IP_RETOPTS
1445 insint(d, "IP_RETOPTS", IP_RETOPTS);
1446#endif
1447#ifdef IP_MULTICAST_IF
1448 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1449#endif
1450#ifdef IP_MULTICAST_TTL
1451 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1452#endif
1453#ifdef IP_MULTICAST_LOOP
1454 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1455#endif
1456#ifdef IP_ADD_MEMBERSHIP
1457 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1458#endif
1459#ifdef IP_DROP_MEMBERSHIP
1460 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1461#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001462}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001463
1464#ifdef NT
1465BOOL WINAPI DllMain (HANDLE hInst,
1466 ULONG ul_reason_for_call,
1467 LPVOID lpReserved)
1468{
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001469 const int opt = SO_SYNCHRONOUS_NONALERT;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001470 switch (ul_reason_for_call)
1471 {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001472 case DLL_PROCESS_ATTACH: {
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001473 WSADATA WSAData;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001474 BOOL ok = TRUE;
1475 char buf[100] = "Python can't initialize Windows Sockets Module!\n\r";
1476 if (WSAStartup(MAKEWORD(1,1), &WSAData)) {
1477 wsprintf(buf+strlen(buf), "WSAStartup failed (%d)",WSAGetLastError());
1478 ok = FALSE;
1479 }
1480 /*
1481 ** Setup sockets in non-overlapped mode by default
1482 */
1483 if (ok && setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(const char *)&opt,sizeof(opt)) != 0) {
1484 wsprintf(buf+strlen(buf),"setsockopt failed (%d)",WSAGetLastError());
1485 ok = FALSE;
1486 }
1487 if (!ok) {
1488 MessageBox(NULL,buf,"WinSock Error",MB_OK|MB_SETFOREGROUND);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001489 return FALSE;
1490 }
1491 break;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001492 }
1493
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001494 case DLL_PROCESS_DETACH:
1495 WSACleanup();
1496 break;
1497
1498 }
1499 return TRUE;
1500}
1501#endif /* NT */