blob: 59d730cf0b75e52c6312cb0cde333d1f02e2c539 [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 Rossumca42b161996-01-12 01:36:05 +0000674 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000675 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000676 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000677 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000678 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000679 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000680 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
681}
682
683
Guido van Rossumb6775db1994-08-01 11:34:53 +0000684#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000685/* s.getpeername() method */
686
Guido van Rossum73624e91994-10-10 17:59:00 +0000687static PyObject *
688BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000689{
690 char addrbuf[256];
691 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000692 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000693 return NULL;
694 if (!getsockaddrlen(s, &addrlen))
695 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000696 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000697 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000698 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000699 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000700 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000701 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
702}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000703#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000704
705
Guido van Rossum30a685f1991-06-27 15:51:29 +0000706/* s.listen(n) method */
707
Guido van Rossum73624e91994-10-10 17:59:00 +0000708static PyObject *
709BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000710{
711 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000712 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000713 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000714 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000715 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000716 if (backlog < 1)
717 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000718 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000719 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000720 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000721 return PySocket_Err();
722 Py_INCREF(Py_None);
723 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000724}
725
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000726#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000727/* s.makefile(mode) method.
728 Create a new open file object referring to a dupped version of
729 the socket's file descriptor. (The dup() call is necessary so
730 that the open file and socket objects may be closed independent
731 of each other.)
732 The mode argument specifies 'r' or 'w' passed to fdopen(). */
733
Guido van Rossum73624e91994-10-10 17:59:00 +0000734static PyObject *
735BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000736{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000737 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000738 char *mode = "r";
739 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000740 int fd;
741 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000742 PyObject *f;
743
744 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000745 return NULL;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000746#ifdef NT
747 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
748 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
749#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000750 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000751 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000752#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000753 if (fd >= 0)
754 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000755 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000756 }
757 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
758 if (f != NULL)
759 PyFile_SetBufSize(f, bufsize);
760 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000761}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000762#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000763
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000764/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000765
Guido van Rossum73624e91994-10-10 17:59:00 +0000766static PyObject *
767BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768{
769 int len, n, flags;
Guido van Rossum73624e91994-10-10 17:59:00 +0000770 PyObject *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000771 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000772 if (!PyArg_Parse(args, "i", &len)) {
773 PyErr_Clear();
774 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000775 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000776 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000777 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778 if (buf == NULL)
779 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000780 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000781 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000782 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000783 if (n < 0) {
784 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000785 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000786 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000787 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788 return NULL;
789 return buf;
790}
791
Guido van Rossum30a685f1991-06-27 15:51:29 +0000792
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000793/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000794
Guido van Rossum73624e91994-10-10 17:59:00 +0000795static PyObject *
796BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000797{
798 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000799 PyObject *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000800 int addrlen, len, n, flags;
801 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000802 if (!PyArg_Parse(args, "i", &len)) {
803 PyErr_Clear();
804 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000805 return NULL;
806 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000807 if (!getsockaddrlen(s, &addrlen))
808 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000809 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000810 if (buf == NULL)
811 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000812 Py_BEGIN_ALLOW_THREADS
813 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000814#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000815 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000816#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000817 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000818#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000819 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000820 if (n < 0) {
821 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000822 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000823 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000824 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000825 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000826 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000827 ret = Py_BuildValue("OO", buf, addr);
828 Py_XDECREF(addr);
829 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000830 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831}
832
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000834/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000835
Guido van Rossum73624e91994-10-10 17:59:00 +0000836static PyObject *
837BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000839 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000840 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000841 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000842 if (!PyArg_Parse(args, "s#", &buf, &len)) {
843 PyErr_Clear();
844 if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000846 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000847 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000848 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000849 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000851 return PySocket_Err();
852 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000853}
854
855
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000856/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000857
Guido van Rossum73624e91994-10-10 17:59:00 +0000858static PyObject *
859BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860{
Guido van Rossum73624e91994-10-10 17:59:00 +0000861 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000862 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000863 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000864 int addrlen, len, n, flags;
865 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000866 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
867 PyErr_Clear();
868 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000869 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000870 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000871 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000872 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000873 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000874 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000875 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000876 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000877 return PySocket_Err();
878 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000879}
880
Guido van Rossum30a685f1991-06-27 15:51:29 +0000881
882/* s.shutdown(how) method */
883
Guido van Rossum73624e91994-10-10 17:59:00 +0000884static PyObject *
885BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000886{
887 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000888 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000889 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000890 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000891 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000892 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000893 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000894 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000895 return PySocket_Err();
896 Py_INCREF(Py_None);
897 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000898}
899
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900
901/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000902
Guido van Rossum73624e91994-10-10 17:59:00 +0000903static PyMethodDef PySocketSock_methods[] = {
904 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000905#if 0
Guido van Rossum73624e91994-10-10 17:59:00 +0000906 {"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000907#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000908 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000909 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
910 {"getsockopt", (PyCFunction)PySocketSock_getsockopt},
911 {"bind", (PyCFunction)PySocketSock_bind},
912 {"close", (PyCFunction)PySocketSock_close},
913 {"connect", (PyCFunction)PySocketSock_connect},
914 {"fileno", (PyCFunction)PySocketSock_fileno},
915 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000916#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000917 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000918#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000919 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000920#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000921 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000922#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000923 {"recv", (PyCFunction)PySocketSock_recv},
924 {"recvfrom", (PyCFunction)PySocketSock_recvfrom},
925 {"send", (PyCFunction)PySocketSock_send},
926 {"sendto", (PyCFunction)PySocketSock_sendto},
927 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000928 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000929};
930
Guido van Rossum30a685f1991-06-27 15:51:29 +0000931
Guido van Rossum73624e91994-10-10 17:59:00 +0000932/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000933 First close the file description. */
934
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000935static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000936BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937{
938 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000939 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000940}
941
Guido van Rossum30a685f1991-06-27 15:51:29 +0000942
943/* Return a socket object's named attribute. */
944
Guido van Rossum73624e91994-10-10 17:59:00 +0000945static PyObject *
946BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000947{
Guido van Rossum73624e91994-10-10 17:59:00 +0000948 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000949}
950
Guido van Rossum30a685f1991-06-27 15:51:29 +0000951
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000952static PyObject *
953BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
954{
955 PyObject *addro;
956 struct sockaddr *addr;
957 char buf[512];
Guido van Rossuma597dde1995-01-10 20:56:29 +0000958 PyObject *t, *comma, *v;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000959 int i, len;
960 sprintf(buf,
961 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
962 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossuma597dde1995-01-10 20:56:29 +0000963 t = PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000964 return t;
965}
966
967
Guido van Rossumb6775db1994-08-01 11:34:53 +0000968/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969
Guido van Rossum73624e91994-10-10 17:59:00 +0000970static PyTypeObject PySocketSock_Type = {
971 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972 0,
973 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000974 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000975 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000976 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000977 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000978 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000979 0, /*tp_setattr*/
980 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000981 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000982 0, /*tp_as_number*/
983 0, /*tp_as_sequence*/
984 0, /*tp_as_mapping*/
985};
986
Guido van Rossum30a685f1991-06-27 15:51:29 +0000987
Guido van Rossum81194471991-07-27 21:42:02 +0000988/* Python interface to gethostname(). */
989
990/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000991static PyObject *
992BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000993{
994 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000995 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000996 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +0000997 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000998 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000999 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001000 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001001 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001002 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001003 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001004 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001005}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001006
1007
Guido van Rossum30a685f1991-06-27 15:51:29 +00001008/* Python interface to gethostbyname(name). */
1009
1010/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001011static PyObject *
1012BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001013{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001014 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001015 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001016 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001017 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001018 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019 return NULL;
1020 return makeipaddr(&addrbuf);
1021}
1022
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001023/* Python interface to gethostbyaddr(IP). */
1024
1025/*ARGSUSED*/
1026static PyObject *
1027BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1028{
1029 struct sockaddr_in addr;
1030 char *ip_num;
1031 struct hostent *h;
1032 int d1,d2,d3,d4;
1033 char ch, **pch;
1034 PyObject *rtn_tuple = (PyObject *)NULL;
1035 PyObject *name_list = (PyObject *)NULL;
1036 PyObject *addr_list = (PyObject *)NULL;
1037 PyObject *tmp;
1038
1039 if (!PyArg_Parse(args, "s", &ip_num))
1040 return NULL;
1041 if (setipaddr(ip_num, &addr) < 0)
1042 return NULL;
1043 h = gethostbyaddr((char *)&addr.sin_addr,
1044 sizeof(addr.sin_addr),
1045 AF_INET);
1046 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001047#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001048 /* Let's get real error message to return */
1049 extern int h_errno;
1050 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1051#else
1052 PyErr_SetString(PySocket_Error, "host not found");
1053#endif
1054 return NULL;
1055 }
1056 if ((name_list = PyList_New(0)) == NULL)
1057 goto err;
1058 if ((addr_list = PyList_New(0)) == NULL)
1059 goto err;
1060 for (pch = h->h_aliases; *pch != NULL; pch++) {
1061 tmp = PyString_FromString(*pch);
1062 if (tmp == NULL)
1063 goto err;
1064 PyList_Append(name_list, tmp);
1065 Py_DECREF(tmp);
1066 }
1067 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1068 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1069 tmp = makeipaddr(&addr);
1070 if (tmp == NULL)
1071 goto err;
1072 PyList_Append(addr_list, tmp);
1073 Py_DECREF(tmp);
1074 }
1075 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1076 err:
1077 Py_XDECREF(name_list);
1078 Py_XDECREF(addr_list);
1079 return rtn_tuple;
1080}
1081
Guido van Rossum30a685f1991-06-27 15:51:29 +00001082
1083/* Python interface to getservbyname(name).
1084 This only returns the port number, since the other info is already
1085 known or not useful (like the list of aliases). */
1086
1087/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001088static PyObject *
1089BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001090{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001091 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001092 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001093 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001094 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001095 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001096 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001097 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001098 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001099 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001100 return NULL;
1101 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001102 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001103}
1104
1105
1106/* Python interface to socket(family, type, proto).
1107 The third (protocol) argument is optional.
1108 Return a new socket object. */
1109
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001110/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001111static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001112BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001113{
Guido van Rossum73624e91994-10-10 17:59:00 +00001114 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001115 int fd, family, type, proto;
1116 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001117 if (!PyArg_Parse(args, "(ii)", &family, &type)) {
1118 PyErr_Clear();
1119 if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001120 return NULL;
1121 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001122 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001123 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001124 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001125 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001126 return PySocket_Err();
1127 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001128 /* If the object can't be created, don't forget to close the
1129 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001130 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001131 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001132 /* From now on, ignore SIGPIPE and let the error checking
1133 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001134#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001135 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001136#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001137 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001138}
1139
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001140#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001141/* Create a socket object from a numeric file description.
1142 Useful e.g. if stdin is a socket.
1143 Additional arguments as for socket(). */
1144
1145/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001146static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001147BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001148{
Guido van Rossum73624e91994-10-10 17:59:00 +00001149 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001150 int fd, family, type, proto;
1151 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001152 if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
1153 PyErr_Clear();
1154 if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001155 return NULL;
1156 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001157 /* Dup the fd so it and the socket can be closed independently */
1158 fd = dup(fd);
1159 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001160 return PySocket_Err();
1161 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001162 /* From now on, ignore SIGPIPE and let the error checking
1163 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001164#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001165 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001166#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001167 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001168}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001169#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001170
Guido van Rossum30a685f1991-06-27 15:51:29 +00001171/* List of functions exported by this module. */
1172
Guido van Rossum73624e91994-10-10 17:59:00 +00001173static PyMethodDef PySocket_methods[] = {
1174 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001175 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001176 {"gethostname", PySocket_gethostname},
1177 {"getservbyname", PySocket_getservbyname},
1178 {"socket", PySocket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001179#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +00001180 {"fromfd", PySocket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001181#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001182 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001183};
1184
Guido van Rossum30a685f1991-06-27 15:51:29 +00001185
1186/* Convenience routine to export an integer value.
1187 For simplicity, errors (which are unlikely anyway) are ignored. */
1188
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001189static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001190BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191{
Guido van Rossum73624e91994-10-10 17:59:00 +00001192 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001193 if (v == NULL) {
1194 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001195 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001196 }
1197 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001198 PyDict_SetItemString(d, name, v);
1199 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001200 }
1201}
1202
Guido van Rossum30a685f1991-06-27 15:51:29 +00001203
1204/* Initialize this module.
1205 This is called when the first 'import socket' is done,
1206 via a table in config.c, if config.c is compiled with USE_SOCKET
1207 defined. */
1208
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001209void
1210initsocket()
1211{
Guido van Rossum73624e91994-10-10 17:59:00 +00001212 PyObject *m, *d;
1213 m = Py_InitModule("socket", PySocket_methods);
1214 d = PyModule_GetDict(m);
1215 PySocket_Error = PyString_FromString("socket.error");
1216 if (PySocket_Error == NULL ||
1217 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1218 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001219 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001220#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001221 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001222#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001223 insint(d, "SOCK_STREAM", SOCK_STREAM);
1224 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1225 insint(d, "SOCK_RAW", SOCK_RAW);
1226 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1227 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001228
1229#ifdef SO_DEBUG
1230 insint(d, "SO_DEBUG", SO_DEBUG);
1231#endif
1232#ifdef SO_ACCEPTCONN
1233 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1234#endif
1235#ifdef SO_REUSEADDR
1236 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1237#endif
1238#ifdef SO_KEEPALIVE
1239 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1240#endif
1241#ifdef SO_DONTROUTE
1242 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1243#endif
1244#ifdef SO_BROADCAST
1245 insint(d, "SO_BROADCAST", SO_BROADCAST);
1246#endif
1247#ifdef SO_USELOOPBACK
1248 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1249#endif
1250#ifdef SO_LINGER
1251 insint(d, "SO_LINGER", SO_LINGER);
1252#endif
1253#ifdef SO_OOBINLINE
1254 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1255#endif
1256#ifdef SO_REUSEPORT
1257 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1258#endif
1259
1260#ifdef SO_SNDBUF
1261 insint(d, "SO_SNDBUF", SO_SNDBUF);
1262#endif
1263#ifdef SO_RCVBUF
1264 insint(d, "SO_RCVBUF", SO_RCVBUF);
1265#endif
1266#ifdef SO_SNDLOWAT
1267 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1268#endif
1269#ifdef SO_RCVLOWAT
1270 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1271#endif
1272#ifdef SO_SNDTIMEO
1273 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1274#endif
1275#ifdef SO_RCVTIMEO
1276 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1277#endif
1278#ifdef SO_ERROR
1279 insint(d, "SO_ERROR", SO_ERROR);
1280#endif
1281#ifdef SO_TYPE
1282 insint(d, "SO_TYPE", SO_TYPE);
1283#endif
1284
1285 /* Maximum number of connections for "listen" */
1286#ifdef SOMAXCONN
1287 insint(d, "SOMAXCONN", SOMAXCONN);
1288#else
1289 insint(d, "SOMAXCONN", 5); /* Common value */
1290#endif
1291
1292 /* Flags for send, recv */
1293#ifdef MSG_OOB
1294 insint(d, "MSG_OOB", MSG_OOB);
1295#endif
1296#ifdef MSG_PEEK
1297 insint(d, "MSG_PEEK", MSG_PEEK);
1298#endif
1299#ifdef MSG_DONTROUTE
1300 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1301#endif
1302#ifdef MSG_EOR
1303 insint(d, "MSG_EOR", MSG_EOR);
1304#endif
1305#ifdef MSG_TRUNC
1306 insint(d, "MSG_TRUNC", MSG_TRUNC);
1307#endif
1308#ifdef MSG_CTRUNC
1309 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1310#endif
1311#ifdef MSG_WAITALL
1312 insint(d, "MSG_WAITALL", MSG_WAITALL);
1313#endif
1314#ifdef MSG_BTAG
1315 insint(d, "MSG_BTAG", MSG_BTAG);
1316#endif
1317#ifdef MSG_ETAG
1318 insint(d, "MSG_ETAG", MSG_ETAG);
1319#endif
1320
1321 /* Protocol level and numbers, usable for [gs]etsockopt */
1322#ifdef SOL_SOCKET
1323 insint(d, "SOL_SOCKET", SOL_SOCKET);
1324#endif
1325#ifdef IPPROTO_IP
1326 insint(d, "IPPROTO_IP", IPPROTO_IP);
1327#endif
1328#ifdef IPPROTO_ICMP
1329 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1330#endif
1331#ifdef IPPROTO_IGMP
1332 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1333#endif
1334#ifdef IPPROTO_GGP
1335 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1336#endif
1337#ifdef IPPROTO_TCP
1338 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1339#endif
1340#ifdef IPPROTO_EGP
1341 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1342#endif
1343#ifdef IPPROTO_PUP
1344 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1345#endif
1346#ifdef IPPROTO_UDP
1347 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1348#endif
1349#ifdef IPPROTO_IDP
1350 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1351#endif
1352#ifdef IPPROTO_HELLO
1353 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1354#endif
1355#ifdef IPPROTO_ND
1356 insint(d, "IPPROTO_ND", IPPROTO_ND);
1357#endif
1358#ifdef IPPROTO_TP
1359 insint(d, "IPPROTO_TP", IPPROTO_TP);
1360#endif
1361#ifdef IPPROTO_XTP
1362 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1363#endif
1364#ifdef IPPROTO_EON
1365 insint(d, "IPPROTO_EON", IPPROTO_EON);
1366#endif
1367#ifdef IPPROTO_BIP
1368 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1369#endif
1370/**/
1371#ifdef IPPROTO_RAW
1372 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1373#endif
1374#ifdef IPPROTO_MAX
1375 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1376#endif
1377
1378 /* Some port configuration */
1379#ifdef IPPORT_RESERVED
1380 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1381#else
1382 insint(d, "IPPORT_RESERVED", 1024);
1383#endif
1384#ifdef IPPORT_USERRESERVED
1385 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1386#else
1387 insint(d, "IPPORT_USERRESERVED", 5000);
1388#endif
1389
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001390 /* Some reserved IP v.4 addresses */
1391#ifdef INADDR_ANY
1392 insint(d, "INADDR_ANY", INADDR_ANY);
1393#else
1394 insint(d, "INADDR_ANY", 0x00000000);
1395#endif
1396#ifdef INADDR_BROADCAST
1397 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1398#else
1399 insint(d, "INADDR_BROADCAST", 0xffffffff);
1400#endif
1401#ifdef INADDR_LOOPBACK
1402 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1403#else
1404 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1405#endif
1406#ifdef INADDR_UNSPEC_GROUP
1407 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1408#else
1409 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1410#endif
1411#ifdef INADDR_ALLHOSTS_GROUP
1412 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1413#else
1414 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1415#endif
1416#ifdef INADDR_MAX_LOCAL_GROUP
1417 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1418#else
1419 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1420#endif
1421#ifdef INADDR_NONE
1422 insint(d, "INADDR_NONE", INADDR_NONE);
1423#else
1424 insint(d, "INADDR_NONE", 0xffffffff);
1425#endif
1426
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001427 /* IP [gs]etsockopt options */
1428#ifdef IP_OPTIONS
1429 insint(d, "IP_OPTIONS", IP_OPTIONS);
1430#endif
1431#ifdef IP_HDRINCL
1432 insint(d, "IP_HDRINCL", IP_HDRINCL);
1433#endif
1434#ifdef IP_TOS
1435 insint(d, "IP_TOS", IP_TOS);
1436#endif
1437#ifdef IP_TTL
1438 insint(d, "IP_TTL", IP_TTL);
1439#endif
1440#ifdef IP_RECVOPTS
1441 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1442#endif
1443#ifdef IP_RECVRETOPTS
1444 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1445#endif
1446#ifdef IP_RECVDSTADDR
1447 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1448#endif
1449#ifdef IP_RETOPTS
1450 insint(d, "IP_RETOPTS", IP_RETOPTS);
1451#endif
1452#ifdef IP_MULTICAST_IF
1453 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1454#endif
1455#ifdef IP_MULTICAST_TTL
1456 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1457#endif
1458#ifdef IP_MULTICAST_LOOP
1459 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1460#endif
1461#ifdef IP_ADD_MEMBERSHIP
1462 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1463#endif
1464#ifdef IP_DROP_MEMBERSHIP
1465 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1466#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001467}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001468
1469#ifdef NT
1470BOOL WINAPI DllMain (HANDLE hInst,
1471 ULONG ul_reason_for_call,
1472 LPVOID lpReserved)
1473{
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001474 const int opt = SO_SYNCHRONOUS_NONALERT;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001475 switch (ul_reason_for_call)
1476 {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001477 case DLL_PROCESS_ATTACH: {
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001478 WSADATA WSAData;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001479 BOOL ok = TRUE;
1480 char buf[100] = "Python can't initialize Windows Sockets Module!\n\r";
1481 if (WSAStartup(MAKEWORD(1,1), &WSAData)) {
1482 wsprintf(buf+strlen(buf), "WSAStartup failed (%d)",WSAGetLastError());
1483 ok = FALSE;
1484 }
1485 /*
1486 ** Setup sockets in non-overlapped mode by default
1487 */
1488 if (ok && setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(const char *)&opt,sizeof(opt)) != 0) {
1489 wsprintf(buf+strlen(buf),"setsockopt failed (%d)",WSAGetLastError());
1490 ok = FALSE;
1491 }
1492 if (!ok) {
1493 MessageBox(NULL,buf,"WinSock Error",MB_OK|MB_SETFOREGROUND);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001494 return FALSE;
1495 }
1496 break;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001497 }
1498
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001499 case DLL_PROCESS_DETACH:
1500 WSACleanup();
1501 break;
1502
1503 }
1504 return TRUE;
1505}
1506#endif /* NT */