blob: db0758c6990289179b0dff79f69d93b1dc8b075c [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
Jack Jansen508537b1996-02-14 15:57:45 +000098#ifdef USE_GUSI
99/* fdopen() isn't declared in stdio.h (sigh) */
100#include <GUSI.h>
101#endif
102
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000103
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000104/* Here we have some hacks to choose between K&R or ANSI style function
105 definitions. For NT to build this as an extension module (ie, DLL)
106 it must be compiled by the C++ compiler, as it takes the address of
107 a static data item exported from the main Python DLL.
108*/
109#ifdef NT
110/* seem to be a few differences in the API */
111#define close closesocket
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000112#define NO_DUP /* Define for NT 3.1, Win3.1 and Win95, Undefine for NT3.5 */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000113#define FORCE_ANSI_FUNC_DEFS
114#endif
115
116#ifdef FORCE_ANSI_FUNC_DEFS
117#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
118fnname( arg1type arg1name )
119
120#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
121fnname( arg1type arg1name, arg2type arg2name )
122
123#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
124fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
125
126#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
127fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
128
129#else /* !FORCE_ANSI_FN_DEFS */
130#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
131fnname( arg1name ) \
132 arg1type arg1name;
133
134#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
135fnname( arg1name, arg2name ) \
136 arg1type arg1name; \
137 arg2type arg2name;
138
139#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
140fnname( arg1name, arg2name, arg3name ) \
141 arg1type arg1name; \
142 arg2type arg2name; \
143 arg3type arg3name;
144
145#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
146fnname( arg1name, arg2name, arg3name, arg4name ) \
147 arg1type arg1name; \
148 arg2type arg2name; \
149 arg3type arg3name; \
150 arg4type arg4name;
151
152#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000153
154/* Global variable holding the exception type for errors detected
155 by this module (but not argument type or memory errors, etc.). */
156
Guido van Rossum73624e91994-10-10 17:59:00 +0000157static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000158
159
160/* Convenience function to raise an error according to errno
161 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000162
Guido van Rossum73624e91994-10-10 17:59:00 +0000163static PyObject *
164PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000165{
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000166#ifdef NT
167 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000168 PyObject *v;
169 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000170 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000171 PyErr_SetObject(PySocket_Error, v);
172 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000173 }
174 return NULL;
175 }
176 else
177#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000178 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000179}
180
Guido van Rossum30a685f1991-06-27 15:51:29 +0000181
182/* The object holding a socket. It holds some extra information,
183 like the address family, which is used to decode socket address
184 arguments properly. */
185
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000186typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000187 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000188 int sock_fd; /* Socket file descriptor */
189 int sock_family; /* Address family, e.g., AF_INET */
190 int sock_type; /* Socket type, e.g., SOCK_STREAM */
191 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000192 union sock_addr {
193 struct sockaddr_in in;
194#ifdef AF_UNIX
195 struct sockaddr_un un;
196#endif
197 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000198} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000199
Guido van Rossum30a685f1991-06-27 15:51:29 +0000200
201/* A forward reference to the Socktype type object.
202 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000203 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000204 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000205
Guido van Rossum73624e91994-10-10 17:59:00 +0000206staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000207
Guido van Rossum30a685f1991-06-27 15:51:29 +0000208
209/* Create a new socket object.
210 This just creates the object and initializes it.
211 If the creation fails, return NULL and set an exception (implicit
212 in NEWOBJ()). */
213
Guido van Rossum73624e91994-10-10 17:59:00 +0000214static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000215BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000216{
Guido van Rossum73624e91994-10-10 17:59:00 +0000217 PySocketSockObject *s;
218 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000219 if (s != NULL) {
220 s->sock_fd = fd;
221 s->sock_family = family;
222 s->sock_type = type;
223 s->sock_proto = proto;
224 }
225 return s;
226}
227
Guido van Rossum30a685f1991-06-27 15:51:29 +0000228
229/* Convert a string specifying a host name or one of a few symbolic
230 names to a numeric IP address. This usually calls gethostbyname()
231 to do the work; the names "" and "<broadcast>" are special.
232 Return the length (should always be 4 bytes), or negative if
233 an error occurred; then an exception is raised. */
234
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000235static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000236BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000237{
238 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000239 int d1, d2, d3, d4;
240 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000241#ifdef HAVE_GETHOSTBYNAME_R
242 struct hostent hp_allocated;
243 char buf[1001];
244 int buf_len = (sizeof buf) - 1;
245 int errnop;
246#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000247
Guido van Rossum30a685f1991-06-27 15:51:29 +0000248 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000249 addr_ret->sin_addr.s_addr = INADDR_ANY;
250 return 4;
251 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000252 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000253 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
254 return 4;
255 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000256 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
257 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
258 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
259 addr_ret->sin_addr.s_addr = htonl(
260 ((long) d1 << 24) | ((long) d2 << 16) |
261 ((long) d3 << 8) | ((long) d4 << 0));
262 return 4;
263 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000264#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000265 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000266 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000267 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000268#else /* not HAVE_GETHOSTBYNAME_R */
269 hp = gethostbyname(name);
270#endif /* HAVE_GETHOSTBYNAME_R */
271
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000272 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000273#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000274 /* Let's get real error message to return */
275 extern int h_errno;
276 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
277#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000278 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000279#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000280 return -1;
281 }
282 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
283 return hp->h_length;
284}
285
Guido van Rossum30a685f1991-06-27 15:51:29 +0000286
Guido van Rossum30a685f1991-06-27 15:51:29 +0000287/* Create a string object representing an IP address.
288 This is always a string of the form 'dd.dd.dd.dd' (with variable
289 size numbers). */
290
Guido van Rossum73624e91994-10-10 17:59:00 +0000291static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000292BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000293{
294 long x = ntohl(addr->sin_addr.s_addr);
295 char buf[100];
296 sprintf(buf, "%d.%d.%d.%d",
297 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
298 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000299 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000300}
301
302
303/* Create an object representing the given socket address,
304 suitable for passing it back to bind(), connect() etc.
305 The family field of the sockaddr structure is inspected
306 to determine what kind of address it really is. */
307
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000308/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000309static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000310BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000311{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000312 if (addrlen == 0) {
313 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000314 Py_INCREF(Py_None);
315 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000316 }
317
Guido van Rossum30a685f1991-06-27 15:51:29 +0000318 switch (addr->sa_family) {
319
320 case AF_INET:
321 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000322 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000323 PyObject *addr = makeipaddr(a);
324 PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
325 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000326 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000327 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000328
Guido van Rossumb6775db1994-08-01 11:34:53 +0000329#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000330 case AF_UNIX:
331 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000332 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000333 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000334 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000335#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000336
337 /* More cases here... */
338
339 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000340 PyErr_SetString(PySocket_Error, "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000341 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000342
Guido van Rossum30a685f1991-06-27 15:51:29 +0000343 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000344}
345
Guido van Rossum30a685f1991-06-27 15:51:29 +0000346
347/* Parse a socket address argument according to the socket object's
348 address family. Return 1 if the address was in the proper format,
349 0 of not. The address is returned through addr_ret, its length
350 through len_ret. */
351
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000352static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000353BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000354getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000355{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000356 switch (s->sock_family) {
357
Guido van Rossumb6775db1994-08-01 11:34:53 +0000358#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000359 case AF_UNIX:
360 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000361 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000362 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000363 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000364 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000365 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000366 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000367 if (len > sizeof addr->sun_path) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000368 PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000369 return 0;
370 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000371 addr->sun_family = AF_UNIX;
372 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000373 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000374 *addr_ret = (struct sockaddr *) addr;
375 *len_ret = len + sizeof addr->sun_family;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000376 return 1;
377 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000378#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000379
Guido van Rossum30a685f1991-06-27 15:51:29 +0000380 case AF_INET:
381 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000382 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000383 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000384 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000385 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000386 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000387 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000388 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000389 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000390 addr->sin_family = AF_INET;
391 addr->sin_port = htons(port);
392 *addr_ret = (struct sockaddr *) addr;
393 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000394 return 1;
395 }
396
Guido van Rossum30a685f1991-06-27 15:51:29 +0000397 /* More cases here... */
398
399 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000400 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000401 return 0;
402
403 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000404}
405
Guido van Rossum30a685f1991-06-27 15:51:29 +0000406
Guido van Rossum710e1df1992-06-12 10:39:36 +0000407/* Get the address length according to the socket object's address family.
408 Return 1 if the family is known, 0 otherwise. The length is returned
409 through len_ret. */
410
411static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000412BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000413{
414 switch (s->sock_family) {
415
Guido van Rossumb6775db1994-08-01 11:34:53 +0000416#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000417 case AF_UNIX:
418 {
419 *len_ret = sizeof (struct sockaddr_un);
420 return 1;
421 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000422#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000423
424 case AF_INET:
425 {
426 *len_ret = sizeof (struct sockaddr_in);
427 return 1;
428 }
429
430 /* More cases here... */
431
432 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000433 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000434 return 0;
435
436 }
437}
438
439
Guido van Rossum30a685f1991-06-27 15:51:29 +0000440/* s.accept() method */
441
Guido van Rossum73624e91994-10-10 17:59:00 +0000442static PyObject *
443BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000444{
445 char addrbuf[256];
446 int addrlen, newfd;
Guido van Rossum73624e91994-10-10 17:59:00 +0000447 PyObject *sock, *addr, *res;
448 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000449 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000450 if (!getsockaddrlen(s, &addrlen))
451 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000452 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000453 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000454 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000455 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000456 return PySocket_Err();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000457 /* Create the new object with unspecified family,
458 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000459 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000460 s->sock_family,
461 s->sock_type,
462 s->sock_proto);
463 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000464 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000465 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000466 res = Py_BuildValue("OO", sock, addr);
467 Py_XDECREF(sock);
468 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000469 return res;
470}
471
Guido van Rossum30a685f1991-06-27 15:51:29 +0000472
Guido van Rossumc65a5251994-08-05 13:44:50 +0000473#if 0
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000474/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000475/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000476
Guido van Rossum73624e91994-10-10 17:59:00 +0000477static PyObject *
478BUILD_FUNC_DEF_2(PySocketSock_allowbroadcast,PySocketSockObject *,s, PyObject *,args)
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000479{
480 int flag;
481 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000482 if (!PyArg_Parse(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000483 return NULL;
484 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000485 (ANY *)&flag, sizeof flag);
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000486 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000487 return PySocket_Err();
488 Py_INCREF(Py_None);
489 return Py_None;
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000490}
Guido van Rossumc65a5251994-08-05 13:44:50 +0000491#endif
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000492
493
Guido van Rossume4485b01994-09-07 14:32:49 +0000494/* s.setblocking(1 | 0) method */
495
Guido van Rossum73624e91994-10-10 17:59:00 +0000496static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000497BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000498{
499 int block;
500 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000501 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000502 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000503 Py_BEGIN_ALLOW_THREADS
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000504#ifndef NT
Guido van Rossume4485b01994-09-07 14:32:49 +0000505 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
506 if (block)
507 delay_flag &= (~O_NDELAY);
508 else
509 delay_flag |= O_NDELAY;
510 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000511#else
512 block = !block;
513 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
514#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000515 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000516
Guido van Rossum73624e91994-10-10 17:59:00 +0000517 Py_INCREF(Py_None);
518 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000519}
Guido van Rossume4485b01994-09-07 14:32:49 +0000520
521
Guido van Rossumaee08791992-09-08 09:05:33 +0000522/* s.setsockopt() method.
523 With an integer third argument, sets an integer option.
524 With a string third argument, sets an option from a buffer;
525 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000526
Guido van Rossum73624e91994-10-10 17:59:00 +0000527static PyObject *
528BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000529{
530 int level;
531 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000532 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000533 char *buf;
534 int buflen;
535 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000536
Guido van Rossum73624e91994-10-10 17:59:00 +0000537 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000538 buf = (char *) &flag;
539 buflen = sizeof flag;
540 }
541 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000542 PyErr_Clear();
543 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000544 return NULL;
545 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000546 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000547 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000548 return PySocket_Err();
549 Py_INCREF(Py_None);
550 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000551}
552
553
Guido van Rossumaee08791992-09-08 09:05:33 +0000554/* s.getsockopt() method.
555 With two arguments, retrieves an integer option.
556 With a third integer argument, retrieves a string buffer of that size;
557 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000558
Guido van Rossum73624e91994-10-10 17:59:00 +0000559static PyObject *
560BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000561{
562 int level;
563 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000564 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000565 PyObject *buf;
Guido van Rossumaee08791992-09-08 09:05:33 +0000566 int buflen;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000567
Guido van Rossum73624e91994-10-10 17:59:00 +0000568 if (PyArg_Parse(args, "(ii)", &level, &optname)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000569 int flag = 0;
570 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000571 res = getsockopt(s->sock_fd, level, optname,
572 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000573 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000574 return PySocket_Err();
575 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000576 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000577 PyErr_Clear();
578 if (!PyArg_Parse(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000579 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000580 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000581 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000582 return NULL;
583 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000584 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000585 if (buf == NULL)
586 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000587 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000588 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000589 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000590 Py_DECREF(buf);
591 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000592 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000593 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000594 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000595}
596
597
Guido van Rossum30a685f1991-06-27 15:51:29 +0000598/* s.bind(sockaddr) method */
599
Guido van Rossum73624e91994-10-10 17:59:00 +0000600static PyObject *
601BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000602{
603 struct sockaddr *addr;
604 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000605 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000606 if (!getsockaddrarg(s, args, &addr, &addrlen))
607 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000608 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000609 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000610 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000611 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000612 return PySocket_Err();
613 Py_INCREF(Py_None);
614 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000615}
616
Guido van Rossum30a685f1991-06-27 15:51:29 +0000617
618/* s.close() method.
619 Set the file descriptor to -1 so operations tried subsequently
620 will surely fail. */
621
Guido van Rossum73624e91994-10-10 17:59:00 +0000622static PyObject *
623BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624{
Guido van Rossum73624e91994-10-10 17:59:00 +0000625 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000627 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000628 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000629 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000630 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000631 Py_INCREF(Py_None);
632 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000633}
634
Guido van Rossum30a685f1991-06-27 15:51:29 +0000635
636/* s.connect(sockaddr) method */
637
Guido van Rossum73624e91994-10-10 17:59:00 +0000638static PyObject *
639BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000640{
641 struct sockaddr *addr;
642 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000643 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000644 if (!getsockaddrarg(s, args, &addr, &addrlen))
645 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000646 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000647 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000648 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000649 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000650 return PySocket_Err();
651 Py_INCREF(Py_None);
652 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000653}
654
Guido van Rossum30a685f1991-06-27 15:51:29 +0000655
Guido van Rossumed233a51992-06-23 09:07:03 +0000656/* s.fileno() method */
657
Guido van Rossum73624e91994-10-10 17:59:00 +0000658static PyObject *
659BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000660{
Guido van Rossum73624e91994-10-10 17:59:00 +0000661 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000662 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000663 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000664}
665
666
Guido van Rossumc89705d1992-11-26 08:54:07 +0000667/* s.getsockname() method */
668
Guido van Rossum73624e91994-10-10 17:59:00 +0000669static PyObject *
670BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000671{
672 char addrbuf[256];
673 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000674 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000675 return NULL;
676 if (!getsockaddrlen(s, &addrlen))
677 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000678 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000679 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000680 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000681 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000682 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000683 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000684 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
685}
686
687
Guido van Rossumb6775db1994-08-01 11:34:53 +0000688#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000689/* s.getpeername() method */
690
Guido van Rossum73624e91994-10-10 17:59:00 +0000691static PyObject *
692BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000693{
694 char addrbuf[256];
695 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000696 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000697 return NULL;
698 if (!getsockaddrlen(s, &addrlen))
699 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000700 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000701 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000702 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000703 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000704 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000705 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
706}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000707#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000708
709
Guido van Rossum30a685f1991-06-27 15:51:29 +0000710/* s.listen(n) method */
711
Guido van Rossum73624e91994-10-10 17:59:00 +0000712static PyObject *
713BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000714{
715 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000716 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000717 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000718 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000719 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000720 if (backlog < 1)
721 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000722 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000723 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000724 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000725 return PySocket_Err();
726 Py_INCREF(Py_None);
727 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000728}
729
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000730#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000731/* s.makefile(mode) method.
732 Create a new open file object referring to a dupped version of
733 the socket's file descriptor. (The dup() call is necessary so
734 that the open file and socket objects may be closed independent
735 of each other.)
736 The mode argument specifies 'r' or 'w' passed to fdopen(). */
737
Guido van Rossum73624e91994-10-10 17:59:00 +0000738static PyObject *
739BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000740{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000741 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000742 char *mode = "r";
743 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000744 int fd;
745 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000746 PyObject *f;
747
748 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000749 return NULL;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000750#ifdef NT
751 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
752 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
753#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000755 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000756#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000757 if (fd >= 0)
758 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000759 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000760 }
761 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
762 if (f != NULL)
763 PyFile_SetBufSize(f, bufsize);
764 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000765}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000766#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000768/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000769
Guido van Rossum73624e91994-10-10 17:59:00 +0000770static PyObject *
771BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000772{
773 int len, n, flags;
Guido van Rossum73624e91994-10-10 17:59:00 +0000774 PyObject *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000775 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000776 if (!PyArg_Parse(args, "i", &len)) {
777 PyErr_Clear();
778 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000780 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000781 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000782 if (buf == NULL)
783 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000784 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000785 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000786 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000787 if (n < 0) {
788 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000789 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000790 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000791 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000792 return NULL;
793 return buf;
794}
795
Guido van Rossum30a685f1991-06-27 15:51:29 +0000796
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000797/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798
Guido van Rossum73624e91994-10-10 17:59:00 +0000799static PyObject *
800BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000801{
802 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000803 PyObject *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000804 int addrlen, len, n, flags;
805 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 if (!PyArg_Parse(args, "i", &len)) {
807 PyErr_Clear();
808 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000809 return NULL;
810 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000811 if (!getsockaddrlen(s, &addrlen))
812 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000813 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000814 if (buf == NULL)
815 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000816 Py_BEGIN_ALLOW_THREADS
817 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000818#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000819 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000820#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000821 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000822#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000823 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000824 if (n < 0) {
825 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000826 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000827 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000828 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000830 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000831 ret = Py_BuildValue("OO", buf, addr);
832 Py_XDECREF(addr);
833 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000834 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000835}
836
Guido van Rossum30a685f1991-06-27 15:51:29 +0000837
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000838/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839
Guido van Rossum73624e91994-10-10 17:59:00 +0000840static PyObject *
841BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000842{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000843 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000845 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000846 if (!PyArg_Parse(args, "s#", &buf, &len)) {
847 PyErr_Clear();
848 if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000849 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000851 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000852 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000853 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000854 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000855 return PySocket_Err();
856 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000857}
858
859
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000860/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000861
Guido van Rossum73624e91994-10-10 17:59:00 +0000862static PyObject *
863BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000864{
Guido van Rossum73624e91994-10-10 17:59:00 +0000865 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000866 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000867 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000868 int addrlen, len, n, flags;
869 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000870 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
871 PyErr_Clear();
872 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000873 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000875 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000876 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000877 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000878 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000879 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000880 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000881 return PySocket_Err();
882 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000883}
884
Guido van Rossum30a685f1991-06-27 15:51:29 +0000885
886/* s.shutdown(how) method */
887
Guido van Rossum73624e91994-10-10 17:59:00 +0000888static PyObject *
889BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000890{
891 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000892 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000893 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000894 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000895 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000896 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000897 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000898 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000899 return PySocket_Err();
900 Py_INCREF(Py_None);
901 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000902}
903
Guido van Rossum30a685f1991-06-27 15:51:29 +0000904
905/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000906
Guido van Rossum73624e91994-10-10 17:59:00 +0000907static PyMethodDef PySocketSock_methods[] = {
908 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000909#if 0
Guido van Rossum73624e91994-10-10 17:59:00 +0000910 {"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000911#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000912 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000913 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
914 {"getsockopt", (PyCFunction)PySocketSock_getsockopt},
915 {"bind", (PyCFunction)PySocketSock_bind},
916 {"close", (PyCFunction)PySocketSock_close},
917 {"connect", (PyCFunction)PySocketSock_connect},
918 {"fileno", (PyCFunction)PySocketSock_fileno},
919 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000920#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000921 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000922#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000923 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000924#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000925 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000926#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000927 {"recv", (PyCFunction)PySocketSock_recv},
928 {"recvfrom", (PyCFunction)PySocketSock_recvfrom},
929 {"send", (PyCFunction)PySocketSock_send},
930 {"sendto", (PyCFunction)PySocketSock_sendto},
931 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000932 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000933};
934
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935
Guido van Rossum73624e91994-10-10 17:59:00 +0000936/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000937 First close the file description. */
938
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000939static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000940BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000941{
942 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000943 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944}
945
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946
947/* Return a socket object's named attribute. */
948
Guido van Rossum73624e91994-10-10 17:59:00 +0000949static PyObject *
950BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951{
Guido van Rossum73624e91994-10-10 17:59:00 +0000952 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000953}
954
Guido van Rossum30a685f1991-06-27 15:51:29 +0000955
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000956static PyObject *
957BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
958{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000959 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000960 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 Rossumdc1c64a1996-02-27 15:21:19 +0000963 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000964}
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;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001031 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001032 PyObject *rtn_tuple = (PyObject *)NULL;
1033 PyObject *name_list = (PyObject *)NULL;
1034 PyObject *addr_list = (PyObject *)NULL;
1035 PyObject *tmp;
1036
1037 if (!PyArg_Parse(args, "s", &ip_num))
1038 return NULL;
1039 if (setipaddr(ip_num, &addr) < 0)
1040 return NULL;
1041 h = gethostbyaddr((char *)&addr.sin_addr,
1042 sizeof(addr.sin_addr),
1043 AF_INET);
1044 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001045#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001046 /* Let's get real error message to return */
1047 extern int h_errno;
1048 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1049#else
1050 PyErr_SetString(PySocket_Error, "host not found");
1051#endif
1052 return NULL;
1053 }
1054 if ((name_list = PyList_New(0)) == NULL)
1055 goto err;
1056 if ((addr_list = PyList_New(0)) == NULL)
1057 goto err;
1058 for (pch = h->h_aliases; *pch != NULL; pch++) {
1059 tmp = PyString_FromString(*pch);
1060 if (tmp == NULL)
1061 goto err;
1062 PyList_Append(name_list, tmp);
1063 Py_DECREF(tmp);
1064 }
1065 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1066 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1067 tmp = makeipaddr(&addr);
1068 if (tmp == NULL)
1069 goto err;
1070 PyList_Append(addr_list, tmp);
1071 Py_DECREF(tmp);
1072 }
1073 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1074 err:
1075 Py_XDECREF(name_list);
1076 Py_XDECREF(addr_list);
1077 return rtn_tuple;
1078}
1079
Guido van Rossum30a685f1991-06-27 15:51:29 +00001080
1081/* Python interface to getservbyname(name).
1082 This only returns the port number, since the other info is already
1083 known or not useful (like the list of aliases). */
1084
1085/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001086static PyObject *
1087BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001088{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001089 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001090 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001091 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001092 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001093 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001094 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001095 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001096 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001097 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001098 return NULL;
1099 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001100 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001101}
1102
1103
1104/* Python interface to socket(family, type, proto).
1105 The third (protocol) argument is optional.
1106 Return a new socket object. */
1107
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001108/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001109static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001110BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001111{
Guido van Rossum73624e91994-10-10 17:59:00 +00001112 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001113 int fd, family, type, proto;
1114 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001115 if (!PyArg_Parse(args, "(ii)", &family, &type)) {
1116 PyErr_Clear();
1117 if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001118 return NULL;
1119 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001120 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001121 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001122 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001123 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001124 return PySocket_Err();
1125 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001126 /* If the object can't be created, don't forget to close the
1127 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001128 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001129 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001130 /* From now on, ignore SIGPIPE and let the error checking
1131 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001132#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001133 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001134#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001135 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001136}
1137
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001138#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001139/* Create a socket object from a numeric file description.
1140 Useful e.g. if stdin is a socket.
1141 Additional arguments as for socket(). */
1142
1143/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001144static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001145BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001146{
Guido van Rossum73624e91994-10-10 17:59:00 +00001147 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001148 int fd, family, type, proto;
1149 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001150 if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
1151 PyErr_Clear();
1152 if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001153 return NULL;
1154 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001155 /* Dup the fd so it and the socket can be closed independently */
1156 fd = dup(fd);
1157 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 return PySocket_Err();
1159 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001160 /* From now on, ignore SIGPIPE and let the error checking
1161 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001162#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001163 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001164#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001165 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001166}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001167#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001168
Guido van Rossum30a685f1991-06-27 15:51:29 +00001169/* List of functions exported by this module. */
1170
Guido van Rossum73624e91994-10-10 17:59:00 +00001171static PyMethodDef PySocket_methods[] = {
1172 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001173 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001174 {"gethostname", PySocket_gethostname},
1175 {"getservbyname", PySocket_getservbyname},
1176 {"socket", PySocket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001177#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +00001178 {"fromfd", PySocket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001179#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001181};
1182
Guido van Rossum30a685f1991-06-27 15:51:29 +00001183
1184/* Convenience routine to export an integer value.
1185 For simplicity, errors (which are unlikely anyway) are ignored. */
1186
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001187static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001188BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001189{
Guido van Rossum73624e91994-10-10 17:59:00 +00001190 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001191 if (v == NULL) {
1192 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001193 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001194 }
1195 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001196 PyDict_SetItemString(d, name, v);
1197 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001198 }
1199}
1200
Guido van Rossum30a685f1991-06-27 15:51:29 +00001201
1202/* Initialize this module.
1203 This is called when the first 'import socket' is done,
1204 via a table in config.c, if config.c is compiled with USE_SOCKET
1205 defined. */
1206
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001207void
1208initsocket()
1209{
Guido van Rossum73624e91994-10-10 17:59:00 +00001210 PyObject *m, *d;
1211 m = Py_InitModule("socket", PySocket_methods);
1212 d = PyModule_GetDict(m);
1213 PySocket_Error = PyString_FromString("socket.error");
1214 if (PySocket_Error == NULL ||
1215 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1216 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001217 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001218#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001219 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001220#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001221 insint(d, "SOCK_STREAM", SOCK_STREAM);
1222 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1223 insint(d, "SOCK_RAW", SOCK_RAW);
1224 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1225 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001226
1227#ifdef SO_DEBUG
1228 insint(d, "SO_DEBUG", SO_DEBUG);
1229#endif
1230#ifdef SO_ACCEPTCONN
1231 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1232#endif
1233#ifdef SO_REUSEADDR
1234 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1235#endif
1236#ifdef SO_KEEPALIVE
1237 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1238#endif
1239#ifdef SO_DONTROUTE
1240 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1241#endif
1242#ifdef SO_BROADCAST
1243 insint(d, "SO_BROADCAST", SO_BROADCAST);
1244#endif
1245#ifdef SO_USELOOPBACK
1246 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1247#endif
1248#ifdef SO_LINGER
1249 insint(d, "SO_LINGER", SO_LINGER);
1250#endif
1251#ifdef SO_OOBINLINE
1252 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1253#endif
1254#ifdef SO_REUSEPORT
1255 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1256#endif
1257
1258#ifdef SO_SNDBUF
1259 insint(d, "SO_SNDBUF", SO_SNDBUF);
1260#endif
1261#ifdef SO_RCVBUF
1262 insint(d, "SO_RCVBUF", SO_RCVBUF);
1263#endif
1264#ifdef SO_SNDLOWAT
1265 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1266#endif
1267#ifdef SO_RCVLOWAT
1268 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1269#endif
1270#ifdef SO_SNDTIMEO
1271 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1272#endif
1273#ifdef SO_RCVTIMEO
1274 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1275#endif
1276#ifdef SO_ERROR
1277 insint(d, "SO_ERROR", SO_ERROR);
1278#endif
1279#ifdef SO_TYPE
1280 insint(d, "SO_TYPE", SO_TYPE);
1281#endif
1282
1283 /* Maximum number of connections for "listen" */
1284#ifdef SOMAXCONN
1285 insint(d, "SOMAXCONN", SOMAXCONN);
1286#else
1287 insint(d, "SOMAXCONN", 5); /* Common value */
1288#endif
1289
1290 /* Flags for send, recv */
1291#ifdef MSG_OOB
1292 insint(d, "MSG_OOB", MSG_OOB);
1293#endif
1294#ifdef MSG_PEEK
1295 insint(d, "MSG_PEEK", MSG_PEEK);
1296#endif
1297#ifdef MSG_DONTROUTE
1298 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1299#endif
1300#ifdef MSG_EOR
1301 insint(d, "MSG_EOR", MSG_EOR);
1302#endif
1303#ifdef MSG_TRUNC
1304 insint(d, "MSG_TRUNC", MSG_TRUNC);
1305#endif
1306#ifdef MSG_CTRUNC
1307 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1308#endif
1309#ifdef MSG_WAITALL
1310 insint(d, "MSG_WAITALL", MSG_WAITALL);
1311#endif
1312#ifdef MSG_BTAG
1313 insint(d, "MSG_BTAG", MSG_BTAG);
1314#endif
1315#ifdef MSG_ETAG
1316 insint(d, "MSG_ETAG", MSG_ETAG);
1317#endif
1318
1319 /* Protocol level and numbers, usable for [gs]etsockopt */
1320#ifdef SOL_SOCKET
1321 insint(d, "SOL_SOCKET", SOL_SOCKET);
1322#endif
1323#ifdef IPPROTO_IP
1324 insint(d, "IPPROTO_IP", IPPROTO_IP);
1325#endif
1326#ifdef IPPROTO_ICMP
1327 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1328#endif
1329#ifdef IPPROTO_IGMP
1330 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1331#endif
1332#ifdef IPPROTO_GGP
1333 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1334#endif
1335#ifdef IPPROTO_TCP
1336 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1337#endif
1338#ifdef IPPROTO_EGP
1339 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1340#endif
1341#ifdef IPPROTO_PUP
1342 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1343#endif
1344#ifdef IPPROTO_UDP
1345 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1346#endif
1347#ifdef IPPROTO_IDP
1348 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1349#endif
1350#ifdef IPPROTO_HELLO
1351 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1352#endif
1353#ifdef IPPROTO_ND
1354 insint(d, "IPPROTO_ND", IPPROTO_ND);
1355#endif
1356#ifdef IPPROTO_TP
1357 insint(d, "IPPROTO_TP", IPPROTO_TP);
1358#endif
1359#ifdef IPPROTO_XTP
1360 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1361#endif
1362#ifdef IPPROTO_EON
1363 insint(d, "IPPROTO_EON", IPPROTO_EON);
1364#endif
1365#ifdef IPPROTO_BIP
1366 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1367#endif
1368/**/
1369#ifdef IPPROTO_RAW
1370 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1371#endif
1372#ifdef IPPROTO_MAX
1373 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1374#endif
1375
1376 /* Some port configuration */
1377#ifdef IPPORT_RESERVED
1378 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1379#else
1380 insint(d, "IPPORT_RESERVED", 1024);
1381#endif
1382#ifdef IPPORT_USERRESERVED
1383 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1384#else
1385 insint(d, "IPPORT_USERRESERVED", 5000);
1386#endif
1387
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001388 /* Some reserved IP v.4 addresses */
1389#ifdef INADDR_ANY
1390 insint(d, "INADDR_ANY", INADDR_ANY);
1391#else
1392 insint(d, "INADDR_ANY", 0x00000000);
1393#endif
1394#ifdef INADDR_BROADCAST
1395 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1396#else
1397 insint(d, "INADDR_BROADCAST", 0xffffffff);
1398#endif
1399#ifdef INADDR_LOOPBACK
1400 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1401#else
1402 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1403#endif
1404#ifdef INADDR_UNSPEC_GROUP
1405 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1406#else
1407 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1408#endif
1409#ifdef INADDR_ALLHOSTS_GROUP
1410 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1411#else
1412 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1413#endif
1414#ifdef INADDR_MAX_LOCAL_GROUP
1415 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1416#else
1417 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1418#endif
1419#ifdef INADDR_NONE
1420 insint(d, "INADDR_NONE", INADDR_NONE);
1421#else
1422 insint(d, "INADDR_NONE", 0xffffffff);
1423#endif
1424
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001425 /* IP [gs]etsockopt options */
1426#ifdef IP_OPTIONS
1427 insint(d, "IP_OPTIONS", IP_OPTIONS);
1428#endif
1429#ifdef IP_HDRINCL
1430 insint(d, "IP_HDRINCL", IP_HDRINCL);
1431#endif
1432#ifdef IP_TOS
1433 insint(d, "IP_TOS", IP_TOS);
1434#endif
1435#ifdef IP_TTL
1436 insint(d, "IP_TTL", IP_TTL);
1437#endif
1438#ifdef IP_RECVOPTS
1439 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1440#endif
1441#ifdef IP_RECVRETOPTS
1442 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1443#endif
1444#ifdef IP_RECVDSTADDR
1445 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1446#endif
1447#ifdef IP_RETOPTS
1448 insint(d, "IP_RETOPTS", IP_RETOPTS);
1449#endif
1450#ifdef IP_MULTICAST_IF
1451 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1452#endif
1453#ifdef IP_MULTICAST_TTL
1454 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1455#endif
1456#ifdef IP_MULTICAST_LOOP
1457 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1458#endif
1459#ifdef IP_ADD_MEMBERSHIP
1460 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1461#endif
1462#ifdef IP_DROP_MEMBERSHIP
1463 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1464#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001465}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001466
1467#ifdef NT
1468BOOL WINAPI DllMain (HANDLE hInst,
1469 ULONG ul_reason_for_call,
1470 LPVOID lpReserved)
1471{
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001472 const int opt = SO_SYNCHRONOUS_NONALERT;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001473 switch (ul_reason_for_call)
1474 {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001475 case DLL_PROCESS_ATTACH: {
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001476 WSADATA WSAData;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001477 BOOL ok = TRUE;
1478 char buf[100] = "Python can't initialize Windows Sockets Module!\n\r";
1479 if (WSAStartup(MAKEWORD(1,1), &WSAData)) {
1480 wsprintf(buf+strlen(buf), "WSAStartup failed (%d)",WSAGetLastError());
1481 ok = FALSE;
1482 }
1483 /*
1484 ** Setup sockets in non-overlapped mode by default
1485 */
1486 if (ok && setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(const char *)&opt,sizeof(opt)) != 0) {
1487 wsprintf(buf+strlen(buf),"setsockopt failed (%d)",WSAGetLastError());
1488 ok = FALSE;
1489 }
1490 if (!ok) {
1491 MessageBox(NULL,buf,"WinSock Error",MB_OK|MB_SETFOREGROUND);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001492 return FALSE;
1493 }
1494 break;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001495 }
1496
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001497 case DLL_PROCESS_DETACH:
1498 WSACleanup();
1499 break;
1500
1501 }
1502 return TRUE;
1503}
1504#endif /* NT */