blob: 29877465cf31e1632f20002aaa813852607a4ccf [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 Rossum7c53b771995-09-13 18:39:47 +0000782 if (n < 0) {
783 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000784 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000785 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000786 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000787 return NULL;
788 return buf;
789}
790
Guido van Rossum30a685f1991-06-27 15:51:29 +0000791
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000792/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000793
Guido van Rossum73624e91994-10-10 17:59:00 +0000794static PyObject *
795BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796{
797 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000798 PyObject *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000799 int addrlen, len, n, flags;
800 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000801 if (!PyArg_Parse(args, "i", &len)) {
802 PyErr_Clear();
803 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000804 return NULL;
805 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000806 if (!getsockaddrlen(s, &addrlen))
807 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000808 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000809 if (buf == NULL)
810 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000811 Py_BEGIN_ALLOW_THREADS
812 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000813#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000814 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000815#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000816 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000817#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000818 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000819 if (n < 0) {
820 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000821 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000822 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000823 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000825 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000826 ret = Py_BuildValue("OO", buf, addr);
827 Py_XDECREF(addr);
828 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000829 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830}
831
Guido van Rossum30a685f1991-06-27 15:51:29 +0000832
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000833/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834
Guido van Rossum73624e91994-10-10 17:59:00 +0000835static PyObject *
836BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000837{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000838 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000840 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000841 if (!PyArg_Parse(args, "s#", &buf, &len)) {
842 PyErr_Clear();
843 if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000846 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000847 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000848 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000849 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000850 return PySocket_Err();
851 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000852}
853
854
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000855/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000856
Guido van Rossum73624e91994-10-10 17:59:00 +0000857static PyObject *
858BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859{
Guido van Rossum73624e91994-10-10 17:59:00 +0000860 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000861 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000862 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000863 int addrlen, len, n, flags;
864 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000865 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
866 PyErr_Clear();
867 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000868 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000869 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000870 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000871 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000872 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000873 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000874 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000876 return PySocket_Err();
877 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000878}
879
Guido van Rossum30a685f1991-06-27 15:51:29 +0000880
881/* s.shutdown(how) method */
882
Guido van Rossum73624e91994-10-10 17:59:00 +0000883static PyObject *
884BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000885{
886 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000887 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000888 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000889 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000890 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000891 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000892 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000893 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000894 return PySocket_Err();
895 Py_INCREF(Py_None);
896 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897}
898
Guido van Rossum30a685f1991-06-27 15:51:29 +0000899
900/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000901
Guido van Rossum73624e91994-10-10 17:59:00 +0000902static PyMethodDef PySocketSock_methods[] = {
903 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000904#if 0
Guido van Rossum73624e91994-10-10 17:59:00 +0000905 {"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000906#endif
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},
909 {"getsockopt", (PyCFunction)PySocketSock_getsockopt},
910 {"bind", (PyCFunction)PySocketSock_bind},
911 {"close", (PyCFunction)PySocketSock_close},
912 {"connect", (PyCFunction)PySocketSock_connect},
913 {"fileno", (PyCFunction)PySocketSock_fileno},
914 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000915#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000916 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000917#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000918 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000919#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000920 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000921#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000922 {"recv", (PyCFunction)PySocketSock_recv},
923 {"recvfrom", (PyCFunction)PySocketSock_recvfrom},
924 {"send", (PyCFunction)PySocketSock_send},
925 {"sendto", (PyCFunction)PySocketSock_sendto},
926 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000927 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000928};
929
Guido van Rossum30a685f1991-06-27 15:51:29 +0000930
Guido van Rossum73624e91994-10-10 17:59:00 +0000931/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932 First close the file description. */
933
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000934static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000935BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000936{
937 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000938 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939}
940
Guido van Rossum30a685f1991-06-27 15:51:29 +0000941
942/* Return a socket object's named attribute. */
943
Guido van Rossum73624e91994-10-10 17:59:00 +0000944static PyObject *
945BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946{
Guido van Rossum73624e91994-10-10 17:59:00 +0000947 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000948}
949
Guido van Rossum30a685f1991-06-27 15:51:29 +0000950
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000951static PyObject *
952BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
953{
954 PyObject *addro;
955 struct sockaddr *addr;
956 char buf[512];
Guido van Rossuma597dde1995-01-10 20:56:29 +0000957 PyObject *t, *comma, *v;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000958 int i, len;
959 sprintf(buf,
960 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
961 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossuma597dde1995-01-10 20:56:29 +0000962 t = PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000963 return t;
964}
965
966
Guido van Rossumb6775db1994-08-01 11:34:53 +0000967/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968
Guido van Rossum73624e91994-10-10 17:59:00 +0000969static PyTypeObject PySocketSock_Type = {
970 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000971 0,
972 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000973 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000974 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000975 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000976 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000977 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000978 0, /*tp_setattr*/
979 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000980 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000981 0, /*tp_as_number*/
982 0, /*tp_as_sequence*/
983 0, /*tp_as_mapping*/
984};
985
Guido van Rossum30a685f1991-06-27 15:51:29 +0000986
Guido van Rossum81194471991-07-27 21:42:02 +0000987/* Python interface to gethostname(). */
988
989/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000990static PyObject *
991BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000992{
993 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000994 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +0000996 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000997 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000998 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +0000999 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001000 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001001 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001002 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001003 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001004}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001005
1006
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007/* Python interface to gethostbyname(name). */
1008
1009/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001010static PyObject *
1011BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001012{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001013 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001014 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001015 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001016 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001017 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001018 return NULL;
1019 return makeipaddr(&addrbuf);
1020}
1021
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001022/* Python interface to gethostbyaddr(IP). */
1023
1024/*ARGSUSED*/
1025static PyObject *
1026BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1027{
1028 struct sockaddr_in addr;
1029 char *ip_num;
1030 struct hostent *h;
1031 int d1,d2,d3,d4;
1032 char ch, **pch;
1033 PyObject *rtn_tuple = (PyObject *)NULL;
1034 PyObject *name_list = (PyObject *)NULL;
1035 PyObject *addr_list = (PyObject *)NULL;
1036 PyObject *tmp;
1037
1038 if (!PyArg_Parse(args, "s", &ip_num))
1039 return NULL;
1040 if (setipaddr(ip_num, &addr) < 0)
1041 return NULL;
1042 h = gethostbyaddr((char *)&addr.sin_addr,
1043 sizeof(addr.sin_addr),
1044 AF_INET);
1045 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001046#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001047 /* Let's get real error message to return */
1048 extern int h_errno;
1049 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1050#else
1051 PyErr_SetString(PySocket_Error, "host not found");
1052#endif
1053 return NULL;
1054 }
1055 if ((name_list = PyList_New(0)) == NULL)
1056 goto err;
1057 if ((addr_list = PyList_New(0)) == NULL)
1058 goto err;
1059 for (pch = h->h_aliases; *pch != NULL; pch++) {
1060 tmp = PyString_FromString(*pch);
1061 if (tmp == NULL)
1062 goto err;
1063 PyList_Append(name_list, tmp);
1064 Py_DECREF(tmp);
1065 }
1066 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1067 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1068 tmp = makeipaddr(&addr);
1069 if (tmp == NULL)
1070 goto err;
1071 PyList_Append(addr_list, tmp);
1072 Py_DECREF(tmp);
1073 }
1074 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1075 err:
1076 Py_XDECREF(name_list);
1077 Py_XDECREF(addr_list);
1078 return rtn_tuple;
1079}
1080
Guido van Rossum30a685f1991-06-27 15:51:29 +00001081
1082/* Python interface to getservbyname(name).
1083 This only returns the port number, since the other info is already
1084 known or not useful (like the list of aliases). */
1085
1086/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001087static PyObject *
1088BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001089{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001090 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001091 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001092 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001093 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001094 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001095 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001096 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001098 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001099 return NULL;
1100 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001102}
1103
1104
1105/* Python interface to socket(family, type, proto).
1106 The third (protocol) argument is optional.
1107 Return a new socket object. */
1108
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001109/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001110static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001111BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001112{
Guido van Rossum73624e91994-10-10 17:59:00 +00001113 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001114 int fd, family, type, proto;
1115 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001116 if (!PyArg_Parse(args, "(ii)", &family, &type)) {
1117 PyErr_Clear();
1118 if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001119 return NULL;
1120 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001121 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001122 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001123 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001124 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001125 return PySocket_Err();
1126 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001127 /* If the object can't be created, don't forget to close the
1128 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001129 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001130 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001131 /* From now on, ignore SIGPIPE and let the error checking
1132 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001133#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001134 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001135#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001136 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001137}
1138
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001139#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001140/* Create a socket object from a numeric file description.
1141 Useful e.g. if stdin is a socket.
1142 Additional arguments as for socket(). */
1143
1144/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001145static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001146BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001147{
Guido van Rossum73624e91994-10-10 17:59:00 +00001148 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001149 int fd, family, type, proto;
1150 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001151 if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
1152 PyErr_Clear();
1153 if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001154 return NULL;
1155 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001156 /* Dup the fd so it and the socket can be closed independently */
1157 fd = dup(fd);
1158 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001159 return PySocket_Err();
1160 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001161 /* From now on, ignore SIGPIPE and let the error checking
1162 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001163#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001164 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001165#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001166 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001167}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001168#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001169
Guido van Rossum30a685f1991-06-27 15:51:29 +00001170/* List of functions exported by this module. */
1171
Guido van Rossum73624e91994-10-10 17:59:00 +00001172static PyMethodDef PySocket_methods[] = {
1173 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001174 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001175 {"gethostname", PySocket_gethostname},
1176 {"getservbyname", PySocket_getservbyname},
1177 {"socket", PySocket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001178#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +00001179 {"fromfd", PySocket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001180#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001181 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001182};
1183
Guido van Rossum30a685f1991-06-27 15:51:29 +00001184
1185/* Convenience routine to export an integer value.
1186 For simplicity, errors (which are unlikely anyway) are ignored. */
1187
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001188static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001189BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001190{
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001192 if (v == NULL) {
1193 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001194 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001195 }
1196 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001197 PyDict_SetItemString(d, name, v);
1198 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001199 }
1200}
1201
Guido van Rossum30a685f1991-06-27 15:51:29 +00001202
1203/* Initialize this module.
1204 This is called when the first 'import socket' is done,
1205 via a table in config.c, if config.c is compiled with USE_SOCKET
1206 defined. */
1207
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001208void
1209initsocket()
1210{
Guido van Rossum73624e91994-10-10 17:59:00 +00001211 PyObject *m, *d;
1212 m = Py_InitModule("socket", PySocket_methods);
1213 d = PyModule_GetDict(m);
1214 PySocket_Error = PyString_FromString("socket.error");
1215 if (PySocket_Error == NULL ||
1216 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1217 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001218 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001219#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001220 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001221#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001222 insint(d, "SOCK_STREAM", SOCK_STREAM);
1223 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1224 insint(d, "SOCK_RAW", SOCK_RAW);
1225 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1226 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001227
1228#ifdef SO_DEBUG
1229 insint(d, "SO_DEBUG", SO_DEBUG);
1230#endif
1231#ifdef SO_ACCEPTCONN
1232 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1233#endif
1234#ifdef SO_REUSEADDR
1235 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1236#endif
1237#ifdef SO_KEEPALIVE
1238 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1239#endif
1240#ifdef SO_DONTROUTE
1241 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1242#endif
1243#ifdef SO_BROADCAST
1244 insint(d, "SO_BROADCAST", SO_BROADCAST);
1245#endif
1246#ifdef SO_USELOOPBACK
1247 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1248#endif
1249#ifdef SO_LINGER
1250 insint(d, "SO_LINGER", SO_LINGER);
1251#endif
1252#ifdef SO_OOBINLINE
1253 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1254#endif
1255#ifdef SO_REUSEPORT
1256 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1257#endif
1258
1259#ifdef SO_SNDBUF
1260 insint(d, "SO_SNDBUF", SO_SNDBUF);
1261#endif
1262#ifdef SO_RCVBUF
1263 insint(d, "SO_RCVBUF", SO_RCVBUF);
1264#endif
1265#ifdef SO_SNDLOWAT
1266 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1267#endif
1268#ifdef SO_RCVLOWAT
1269 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1270#endif
1271#ifdef SO_SNDTIMEO
1272 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1273#endif
1274#ifdef SO_RCVTIMEO
1275 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1276#endif
1277#ifdef SO_ERROR
1278 insint(d, "SO_ERROR", SO_ERROR);
1279#endif
1280#ifdef SO_TYPE
1281 insint(d, "SO_TYPE", SO_TYPE);
1282#endif
1283
1284 /* Maximum number of connections for "listen" */
1285#ifdef SOMAXCONN
1286 insint(d, "SOMAXCONN", SOMAXCONN);
1287#else
1288 insint(d, "SOMAXCONN", 5); /* Common value */
1289#endif
1290
1291 /* Flags for send, recv */
1292#ifdef MSG_OOB
1293 insint(d, "MSG_OOB", MSG_OOB);
1294#endif
1295#ifdef MSG_PEEK
1296 insint(d, "MSG_PEEK", MSG_PEEK);
1297#endif
1298#ifdef MSG_DONTROUTE
1299 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1300#endif
1301#ifdef MSG_EOR
1302 insint(d, "MSG_EOR", MSG_EOR);
1303#endif
1304#ifdef MSG_TRUNC
1305 insint(d, "MSG_TRUNC", MSG_TRUNC);
1306#endif
1307#ifdef MSG_CTRUNC
1308 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1309#endif
1310#ifdef MSG_WAITALL
1311 insint(d, "MSG_WAITALL", MSG_WAITALL);
1312#endif
1313#ifdef MSG_BTAG
1314 insint(d, "MSG_BTAG", MSG_BTAG);
1315#endif
1316#ifdef MSG_ETAG
1317 insint(d, "MSG_ETAG", MSG_ETAG);
1318#endif
1319
1320 /* Protocol level and numbers, usable for [gs]etsockopt */
1321#ifdef SOL_SOCKET
1322 insint(d, "SOL_SOCKET", SOL_SOCKET);
1323#endif
1324#ifdef IPPROTO_IP
1325 insint(d, "IPPROTO_IP", IPPROTO_IP);
1326#endif
1327#ifdef IPPROTO_ICMP
1328 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1329#endif
1330#ifdef IPPROTO_IGMP
1331 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1332#endif
1333#ifdef IPPROTO_GGP
1334 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1335#endif
1336#ifdef IPPROTO_TCP
1337 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1338#endif
1339#ifdef IPPROTO_EGP
1340 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1341#endif
1342#ifdef IPPROTO_PUP
1343 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1344#endif
1345#ifdef IPPROTO_UDP
1346 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1347#endif
1348#ifdef IPPROTO_IDP
1349 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1350#endif
1351#ifdef IPPROTO_HELLO
1352 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1353#endif
1354#ifdef IPPROTO_ND
1355 insint(d, "IPPROTO_ND", IPPROTO_ND);
1356#endif
1357#ifdef IPPROTO_TP
1358 insint(d, "IPPROTO_TP", IPPROTO_TP);
1359#endif
1360#ifdef IPPROTO_XTP
1361 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1362#endif
1363#ifdef IPPROTO_EON
1364 insint(d, "IPPROTO_EON", IPPROTO_EON);
1365#endif
1366#ifdef IPPROTO_BIP
1367 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1368#endif
1369/**/
1370#ifdef IPPROTO_RAW
1371 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1372#endif
1373#ifdef IPPROTO_MAX
1374 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1375#endif
1376
1377 /* Some port configuration */
1378#ifdef IPPORT_RESERVED
1379 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1380#else
1381 insint(d, "IPPORT_RESERVED", 1024);
1382#endif
1383#ifdef IPPORT_USERRESERVED
1384 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1385#else
1386 insint(d, "IPPORT_USERRESERVED", 5000);
1387#endif
1388
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001389 /* Some reserved IP v.4 addresses */
1390#ifdef INADDR_ANY
1391 insint(d, "INADDR_ANY", INADDR_ANY);
1392#else
1393 insint(d, "INADDR_ANY", 0x00000000);
1394#endif
1395#ifdef INADDR_BROADCAST
1396 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1397#else
1398 insint(d, "INADDR_BROADCAST", 0xffffffff);
1399#endif
1400#ifdef INADDR_LOOPBACK
1401 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1402#else
1403 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1404#endif
1405#ifdef INADDR_UNSPEC_GROUP
1406 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1407#else
1408 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1409#endif
1410#ifdef INADDR_ALLHOSTS_GROUP
1411 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1412#else
1413 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1414#endif
1415#ifdef INADDR_MAX_LOCAL_GROUP
1416 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1417#else
1418 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1419#endif
1420#ifdef INADDR_NONE
1421 insint(d, "INADDR_NONE", INADDR_NONE);
1422#else
1423 insint(d, "INADDR_NONE", 0xffffffff);
1424#endif
1425
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001426 /* IP [gs]etsockopt options */
1427#ifdef IP_OPTIONS
1428 insint(d, "IP_OPTIONS", IP_OPTIONS);
1429#endif
1430#ifdef IP_HDRINCL
1431 insint(d, "IP_HDRINCL", IP_HDRINCL);
1432#endif
1433#ifdef IP_TOS
1434 insint(d, "IP_TOS", IP_TOS);
1435#endif
1436#ifdef IP_TTL
1437 insint(d, "IP_TTL", IP_TTL);
1438#endif
1439#ifdef IP_RECVOPTS
1440 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1441#endif
1442#ifdef IP_RECVRETOPTS
1443 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1444#endif
1445#ifdef IP_RECVDSTADDR
1446 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1447#endif
1448#ifdef IP_RETOPTS
1449 insint(d, "IP_RETOPTS", IP_RETOPTS);
1450#endif
1451#ifdef IP_MULTICAST_IF
1452 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1453#endif
1454#ifdef IP_MULTICAST_TTL
1455 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1456#endif
1457#ifdef IP_MULTICAST_LOOP
1458 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1459#endif
1460#ifdef IP_ADD_MEMBERSHIP
1461 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1462#endif
1463#ifdef IP_DROP_MEMBERSHIP
1464 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1465#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001466}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001467
1468#ifdef NT
1469BOOL WINAPI DllMain (HANDLE hInst,
1470 ULONG ul_reason_for_call,
1471 LPVOID lpReserved)
1472{
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001473 const int opt = SO_SYNCHRONOUS_NONALERT;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001474 switch (ul_reason_for_call)
1475 {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001476 case DLL_PROCESS_ATTACH: {
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001477 WSADATA WSAData;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001478 BOOL ok = TRUE;
1479 char buf[100] = "Python can't initialize Windows Sockets Module!\n\r";
1480 if (WSAStartup(MAKEWORD(1,1), &WSAData)) {
1481 wsprintf(buf+strlen(buf), "WSAStartup failed (%d)",WSAGetLastError());
1482 ok = FALSE;
1483 }
1484 /*
1485 ** Setup sockets in non-overlapped mode by default
1486 */
1487 if (ok && setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(const char *)&opt,sizeof(opt)) != 0) {
1488 wsprintf(buf+strlen(buf),"setsockopt failed (%d)",WSAGetLastError());
1489 ok = FALSE;
1490 }
1491 if (!ok) {
1492 MessageBox(NULL,buf,"WinSock Error",MB_OK|MB_SETFOREGROUND);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001493 return FALSE;
1494 }
1495 break;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001496 }
1497
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001498 case DLL_PROCESS_DETACH:
1499 WSACleanup();
1500 break;
1501
1502 }
1503 return TRUE;
1504}
1505#endif /* NT */