blob: b77bdac3d50532e18ccadd6264c49f79113fb59c [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 Rossum55558541996-05-23 22:54:50 +000079#ifndef _MSC_VER
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;
Guido van Rossum55558541996-05-23 22:54:50 +0000218 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000219 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000220 if (s != NULL) {
221 s->sock_fd = fd;
222 s->sock_family = family;
223 s->sock_type = type;
224 s->sock_proto = proto;
225 }
226 return s;
227}
228
Guido van Rossum30a685f1991-06-27 15:51:29 +0000229
230/* Convert a string specifying a host name or one of a few symbolic
231 names to a numeric IP address. This usually calls gethostbyname()
232 to do the work; the names "" and "<broadcast>" are special.
233 Return the length (should always be 4 bytes), or negative if
234 an error occurred; then an exception is raised. */
235
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000236static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000237BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000238{
239 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000240 int d1, d2, d3, d4;
241 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000242#ifdef HAVE_GETHOSTBYNAME_R
243 struct hostent hp_allocated;
244 char buf[1001];
245 int buf_len = (sizeof buf) - 1;
246 int errnop;
247#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000248
Guido van Rossum30a685f1991-06-27 15:51:29 +0000249 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000250 addr_ret->sin_addr.s_addr = INADDR_ANY;
251 return 4;
252 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000253 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000254 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
255 return 4;
256 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000257 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
258 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
259 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
260 addr_ret->sin_addr.s_addr = htonl(
261 ((long) d1 << 24) | ((long) d2 << 16) |
262 ((long) d3 << 8) | ((long) d4 << 0));
263 return 4;
264 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000265#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000266 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000267 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000268 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000269#else /* not HAVE_GETHOSTBYNAME_R */
270 hp = gethostbyname(name);
271#endif /* HAVE_GETHOSTBYNAME_R */
272
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000273 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000274#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000275 /* Let's get real error message to return */
276 extern int h_errno;
277 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
278#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000279 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000280#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000281 return -1;
282 }
283 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
284 return hp->h_length;
285}
286
Guido van Rossum30a685f1991-06-27 15:51:29 +0000287
Guido van Rossum30a685f1991-06-27 15:51:29 +0000288/* Create a string object representing an IP address.
289 This is always a string of the form 'dd.dd.dd.dd' (with variable
290 size numbers). */
291
Guido van Rossum73624e91994-10-10 17:59:00 +0000292static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000293BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000294{
295 long x = ntohl(addr->sin_addr.s_addr);
296 char buf[100];
297 sprintf(buf, "%d.%d.%d.%d",
298 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
299 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000300 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000301}
302
303
304/* Create an object representing the given socket address,
305 suitable for passing it back to bind(), connect() etc.
306 The family field of the sockaddr structure is inspected
307 to determine what kind of address it really is. */
308
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000309/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000310static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000311BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000312{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000313 if (addrlen == 0) {
314 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000315 Py_INCREF(Py_None);
316 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000317 }
318
Guido van Rossum30a685f1991-06-27 15:51:29 +0000319 switch (addr->sa_family) {
320
321 case AF_INET:
322 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000323 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000324 PyObject *addr = makeipaddr(a);
325 PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
326 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000327 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000328 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000329
Guido van Rossumb6775db1994-08-01 11:34:53 +0000330#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000331 case AF_UNIX:
332 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000333 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000334 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000335 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000336#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000337
338 /* More cases here... */
339
340 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000341 PyErr_SetString(PySocket_Error, "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000342 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000343
Guido van Rossum30a685f1991-06-27 15:51:29 +0000344 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000345}
346
Guido van Rossum30a685f1991-06-27 15:51:29 +0000347
348/* Parse a socket address argument according to the socket object's
349 address family. Return 1 if the address was in the proper format,
350 0 of not. The address is returned through addr_ret, its length
351 through len_ret. */
352
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000353static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000354BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000355getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000356{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000357 switch (s->sock_family) {
358
Guido van Rossumb6775db1994-08-01 11:34:53 +0000359#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000360 case AF_UNIX:
361 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000362 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000363 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000364 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000365 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000366 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000367 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000368 if (len > sizeof addr->sun_path) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000369 PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000370 return 0;
371 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000372 addr->sun_family = AF_UNIX;
373 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000374 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000375 *addr_ret = (struct sockaddr *) addr;
376 *len_ret = len + sizeof addr->sun_family;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000377 return 1;
378 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000379#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000380
Guido van Rossum30a685f1991-06-27 15:51:29 +0000381 case AF_INET:
382 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000383 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000384 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000385 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000386 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000387 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000388 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000389 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000390 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000391 addr->sin_family = AF_INET;
392 addr->sin_port = htons(port);
393 *addr_ret = (struct sockaddr *) addr;
394 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000395 return 1;
396 }
397
Guido van Rossum30a685f1991-06-27 15:51:29 +0000398 /* More cases here... */
399
400 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000401 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000402 return 0;
403
404 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000405}
406
Guido van Rossum30a685f1991-06-27 15:51:29 +0000407
Guido van Rossum710e1df1992-06-12 10:39:36 +0000408/* Get the address length according to the socket object's address family.
409 Return 1 if the family is known, 0 otherwise. The length is returned
410 through len_ret. */
411
412static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000413BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000414{
415 switch (s->sock_family) {
416
Guido van Rossumb6775db1994-08-01 11:34:53 +0000417#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000418 case AF_UNIX:
419 {
420 *len_ret = sizeof (struct sockaddr_un);
421 return 1;
422 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000423#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000424
425 case AF_INET:
426 {
427 *len_ret = sizeof (struct sockaddr_in);
428 return 1;
429 }
430
431 /* More cases here... */
432
433 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000434 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000435 return 0;
436
437 }
438}
439
440
Guido van Rossum30a685f1991-06-27 15:51:29 +0000441/* s.accept() method */
442
Guido van Rossum73624e91994-10-10 17:59:00 +0000443static PyObject *
444BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000445{
446 char addrbuf[256];
447 int addrlen, newfd;
Guido van Rossum73624e91994-10-10 17:59:00 +0000448 PyObject *sock, *addr, *res;
449 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000450 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000451 if (!getsockaddrlen(s, &addrlen))
452 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000453 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000454 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000455 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000456 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000457 return PySocket_Err();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458 /* Create the new object with unspecified family,
459 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000460 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000461 s->sock_family,
462 s->sock_type,
463 s->sock_proto);
464 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000465 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000466 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000467 res = Py_BuildValue("OO", sock, addr);
468 Py_XDECREF(sock);
469 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000470 return res;
471}
472
Guido van Rossum30a685f1991-06-27 15:51:29 +0000473
Guido van Rossume4485b01994-09-07 14:32:49 +0000474/* s.setblocking(1 | 0) method */
475
Guido van Rossum73624e91994-10-10 17:59:00 +0000476static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000477BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000478{
479 int block;
480 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000481 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000482 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000483 Py_BEGIN_ALLOW_THREADS
Guido van Rossum55558541996-05-23 22:54:50 +0000484#ifndef _MSC_VER
Guido van Rossume4485b01994-09-07 14:32:49 +0000485 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
486 if (block)
487 delay_flag &= (~O_NDELAY);
488 else
489 delay_flag |= O_NDELAY;
490 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000491#else
492 block = !block;
493 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
494#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000495 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000496
Guido van Rossum73624e91994-10-10 17:59:00 +0000497 Py_INCREF(Py_None);
498 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000499}
Guido van Rossume4485b01994-09-07 14:32:49 +0000500
501
Guido van Rossumaee08791992-09-08 09:05:33 +0000502/* s.setsockopt() method.
503 With an integer third argument, sets an integer option.
504 With a string third argument, sets an option from a buffer;
505 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000506
Guido van Rossum73624e91994-10-10 17:59:00 +0000507static PyObject *
508BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000509{
510 int level;
511 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000512 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000513 char *buf;
514 int buflen;
515 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000516
Guido van Rossum73624e91994-10-10 17:59:00 +0000517 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000518 buf = (char *) &flag;
519 buflen = sizeof flag;
520 }
521 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000522 PyErr_Clear();
523 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000524 return NULL;
525 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000526 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000527 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000528 return PySocket_Err();
529 Py_INCREF(Py_None);
530 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000531}
532
533
Guido van Rossumaee08791992-09-08 09:05:33 +0000534/* s.getsockopt() method.
535 With two arguments, retrieves an integer option.
536 With a third integer argument, retrieves a string buffer of that size;
537 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000538
Guido van Rossum73624e91994-10-10 17:59:00 +0000539static PyObject *
540BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000541{
542 int level;
543 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000544 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000545 PyObject *buf;
Guido van Rossumaee08791992-09-08 09:05:33 +0000546 int buflen;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000547
Guido van Rossum73624e91994-10-10 17:59:00 +0000548 if (PyArg_Parse(args, "(ii)", &level, &optname)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000549 int flag = 0;
550 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000551 res = getsockopt(s->sock_fd, level, optname,
552 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000553 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000554 return PySocket_Err();
555 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000556 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000557 PyErr_Clear();
558 if (!PyArg_Parse(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000559 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000560 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000561 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000562 return NULL;
563 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000564 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000565 if (buf == NULL)
566 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000567 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000568 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000569 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000570 Py_DECREF(buf);
571 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000572 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000573 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000574 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000575}
576
577
Guido van Rossum30a685f1991-06-27 15:51:29 +0000578/* s.bind(sockaddr) method */
579
Guido van Rossum73624e91994-10-10 17:59:00 +0000580static PyObject *
581BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000582{
583 struct sockaddr *addr;
584 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000585 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000586 if (!getsockaddrarg(s, args, &addr, &addrlen))
587 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000588 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000589 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000590 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000591 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000592 return PySocket_Err();
593 Py_INCREF(Py_None);
594 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000595}
596
Guido van Rossum30a685f1991-06-27 15:51:29 +0000597
598/* s.close() method.
599 Set the file descriptor to -1 so operations tried subsequently
600 will surely fail. */
601
Guido van Rossum73624e91994-10-10 17:59:00 +0000602static PyObject *
603BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000604{
Guido van Rossum73624e91994-10-10 17:59:00 +0000605 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000606 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000607 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000608 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000609 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000610 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 Py_INCREF(Py_None);
612 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000613}
614
Guido van Rossum30a685f1991-06-27 15:51:29 +0000615
616/* s.connect(sockaddr) method */
617
Guido van Rossum73624e91994-10-10 17:59:00 +0000618static PyObject *
619BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000620{
621 struct sockaddr *addr;
622 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000623 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 if (!getsockaddrarg(s, args, &addr, &addrlen))
625 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000626 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000627 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000628 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000629 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000630 return PySocket_Err();
631 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
Guido van Rossumed233a51992-06-23 09:07:03 +0000636/* s.fileno() method */
637
Guido van Rossum73624e91994-10-10 17:59:00 +0000638static PyObject *
639BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000640{
Guido van Rossum73624e91994-10-10 17:59:00 +0000641 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000642 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000643 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000644}
645
646
Guido van Rossumc89705d1992-11-26 08:54:07 +0000647/* s.getsockname() method */
648
Guido van Rossum73624e91994-10-10 17:59:00 +0000649static PyObject *
650BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000651{
652 char addrbuf[256];
653 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000654 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000655 return NULL;
656 if (!getsockaddrlen(s, &addrlen))
657 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000658 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000659 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000660 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000661 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000662 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000663 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000664 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
665}
666
667
Guido van Rossumb6775db1994-08-01 11:34:53 +0000668#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000669/* s.getpeername() method */
670
Guido van Rossum73624e91994-10-10 17:59:00 +0000671static PyObject *
672BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000673{
674 char addrbuf[256];
675 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000676 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000677 return NULL;
678 if (!getsockaddrlen(s, &addrlen))
679 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000680 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000681 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000682 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000683 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000684 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000685 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
686}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000687#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000688
689
Guido van Rossum30a685f1991-06-27 15:51:29 +0000690/* s.listen(n) method */
691
Guido van Rossum73624e91994-10-10 17:59:00 +0000692static PyObject *
693BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000694{
695 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000696 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000697 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000698 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000699 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000700 if (backlog < 1)
701 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000702 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000703 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000704 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000705 return PySocket_Err();
706 Py_INCREF(Py_None);
707 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000708}
709
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000710#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000711/* s.makefile(mode) method.
712 Create a new open file object referring to a dupped version of
713 the socket's file descriptor. (The dup() call is necessary so
714 that the open file and socket objects may be closed independent
715 of each other.)
716 The mode argument specifies 'r' or 'w' passed to fdopen(). */
717
Guido van Rossum73624e91994-10-10 17:59:00 +0000718static PyObject *
719BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000720{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000721 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000722 char *mode = "r";
723 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000724 int fd;
725 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000726 PyObject *f;
727
728 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000729 return NULL;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000730#ifdef NT
731 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
732 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
733#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000734 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000735 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000736#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000737 if (fd >= 0)
738 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000739 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000740 }
741 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
742 if (f != NULL)
743 PyFile_SetBufSize(f, bufsize);
744 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000745}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000746#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000747
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000748/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000749
Guido van Rossum73624e91994-10-10 17:59:00 +0000750static PyObject *
751BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752{
753 int len, n, flags;
Guido van Rossum73624e91994-10-10 17:59:00 +0000754 PyObject *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000755 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000756 if (!PyArg_Parse(args, "i", &len)) {
757 PyErr_Clear();
758 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000759 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000760 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000761 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762 if (buf == NULL)
763 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000764 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000765 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000766 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000767 if (n < 0) {
768 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000769 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000770 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000771 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772 return NULL;
773 return buf;
774}
775
Guido van Rossum30a685f1991-06-27 15:51:29 +0000776
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000777/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000778
Guido van Rossum73624e91994-10-10 17:59:00 +0000779static PyObject *
780BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781{
782 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000783 PyObject *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000784 int addrlen, len, n, flags;
785 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000786 if (!PyArg_Parse(args, "i", &len)) {
787 PyErr_Clear();
788 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000789 return NULL;
790 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000791 if (!getsockaddrlen(s, &addrlen))
792 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000793 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000794 if (buf == NULL)
795 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000796 Py_BEGIN_ALLOW_THREADS
797 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000798#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000799 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000800#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000801 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000802#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000803 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000804 if (n < 0) {
805 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000806 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000807 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000808 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000810 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000811 ret = Py_BuildValue("OO", buf, addr);
812 Py_XDECREF(addr);
813 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000814 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000815}
816
Guido van Rossum30a685f1991-06-27 15:51:29 +0000817
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000818/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000819
Guido van Rossum73624e91994-10-10 17:59:00 +0000820static PyObject *
821BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000822{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000823 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000824 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000825 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000826 if (!PyArg_Parse(args, "s#", &buf, &len)) {
827 PyErr_Clear();
828 if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000829 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000830 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000831 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000832 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000833 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000835 return PySocket_Err();
836 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000837}
838
839
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000840/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841
Guido van Rossum73624e91994-10-10 17:59:00 +0000842static PyObject *
843BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000844{
Guido van Rossum73624e91994-10-10 17:59:00 +0000845 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000846 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000848 int addrlen, len, n, flags;
849 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000850 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
851 PyErr_Clear();
852 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000853 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000855 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000856 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000857 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000858 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000859 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000861 return PySocket_Err();
862 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000863}
864
Guido van Rossum30a685f1991-06-27 15:51:29 +0000865
866/* s.shutdown(how) method */
867
Guido van Rossum73624e91994-10-10 17:59:00 +0000868static PyObject *
869BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000870{
871 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000872 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000873 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000875 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000876 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000877 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000878 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000879 return PySocket_Err();
880 Py_INCREF(Py_None);
881 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000882}
883
Guido van Rossum30a685f1991-06-27 15:51:29 +0000884
885/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000886
Guido van Rossum73624e91994-10-10 17:59:00 +0000887static PyMethodDef PySocketSock_methods[] = {
888 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000889#if 0
Guido van Rossum73624e91994-10-10 17:59:00 +0000890 {"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000891#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000892 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000893 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
894 {"getsockopt", (PyCFunction)PySocketSock_getsockopt},
895 {"bind", (PyCFunction)PySocketSock_bind},
896 {"close", (PyCFunction)PySocketSock_close},
897 {"connect", (PyCFunction)PySocketSock_connect},
898 {"fileno", (PyCFunction)PySocketSock_fileno},
899 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000900#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000901 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000902#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000903 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000904#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000905 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000906#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000907 {"recv", (PyCFunction)PySocketSock_recv},
908 {"recvfrom", (PyCFunction)PySocketSock_recvfrom},
909 {"send", (PyCFunction)PySocketSock_send},
910 {"sendto", (PyCFunction)PySocketSock_sendto},
911 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000912 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000913};
914
Guido van Rossum30a685f1991-06-27 15:51:29 +0000915
Guido van Rossum73624e91994-10-10 17:59:00 +0000916/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000917 First close the file description. */
918
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000919static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000920BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000921{
922 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000923 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000924}
925
Guido van Rossum30a685f1991-06-27 15:51:29 +0000926
927/* Return a socket object's named attribute. */
928
Guido van Rossum73624e91994-10-10 17:59:00 +0000929static PyObject *
930BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000931{
Guido van Rossum73624e91994-10-10 17:59:00 +0000932 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000933}
934
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000936static PyObject *
937BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
938{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000939 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000940 sprintf(buf,
941 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
942 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +0000943 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000944}
945
946
Guido van Rossumb6775db1994-08-01 11:34:53 +0000947/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000948
Guido van Rossum73624e91994-10-10 17:59:00 +0000949static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +0000950 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951 0,
952 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000953 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000954 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000955 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000956 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000957 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000958 0, /*tp_setattr*/
959 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000960 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000961 0, /*tp_as_number*/
962 0, /*tp_as_sequence*/
963 0, /*tp_as_mapping*/
964};
965
Guido van Rossum30a685f1991-06-27 15:51:29 +0000966
Guido van Rossum81194471991-07-27 21:42:02 +0000967/* Python interface to gethostname(). */
968
969/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000970static PyObject *
971BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000972{
973 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000974 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000975 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +0000976 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000977 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000978 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +0000979 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000980 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000981 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +0000982 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +0000983 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +0000984}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000985
986
Guido van Rossum30a685f1991-06-27 15:51:29 +0000987/* Python interface to gethostbyname(name). */
988
989/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000990static PyObject *
991BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000992{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000993 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000994 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +0000995 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000996 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000997 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000998 return NULL;
999 return makeipaddr(&addrbuf);
1000}
1001
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001002/* Python interface to gethostbyaddr(IP). */
1003
1004/*ARGSUSED*/
1005static PyObject *
1006BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1007{
1008 struct sockaddr_in addr;
1009 char *ip_num;
1010 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001011 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001012 PyObject *rtn_tuple = (PyObject *)NULL;
1013 PyObject *name_list = (PyObject *)NULL;
1014 PyObject *addr_list = (PyObject *)NULL;
1015 PyObject *tmp;
1016
1017 if (!PyArg_Parse(args, "s", &ip_num))
1018 return NULL;
1019 if (setipaddr(ip_num, &addr) < 0)
1020 return NULL;
1021 h = gethostbyaddr((char *)&addr.sin_addr,
1022 sizeof(addr.sin_addr),
1023 AF_INET);
1024 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001025#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001026 /* Let's get real error message to return */
1027 extern int h_errno;
1028 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1029#else
1030 PyErr_SetString(PySocket_Error, "host not found");
1031#endif
1032 return NULL;
1033 }
1034 if ((name_list = PyList_New(0)) == NULL)
1035 goto err;
1036 if ((addr_list = PyList_New(0)) == NULL)
1037 goto err;
1038 for (pch = h->h_aliases; *pch != NULL; pch++) {
1039 tmp = PyString_FromString(*pch);
1040 if (tmp == NULL)
1041 goto err;
1042 PyList_Append(name_list, tmp);
1043 Py_DECREF(tmp);
1044 }
1045 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1046 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1047 tmp = makeipaddr(&addr);
1048 if (tmp == NULL)
1049 goto err;
1050 PyList_Append(addr_list, tmp);
1051 Py_DECREF(tmp);
1052 }
1053 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1054 err:
1055 Py_XDECREF(name_list);
1056 Py_XDECREF(addr_list);
1057 return rtn_tuple;
1058}
1059
Guido van Rossum30a685f1991-06-27 15:51:29 +00001060
1061/* Python interface to getservbyname(name).
1062 This only returns the port number, since the other info is already
1063 known or not useful (like the list of aliases). */
1064
1065/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001066static PyObject *
1067BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001068{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001069 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001070 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001071 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001072 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001073 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001074 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001075 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001076 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001077 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001078 return NULL;
1079 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001080 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001081}
1082
1083
1084/* Python interface to socket(family, type, proto).
1085 The third (protocol) argument is optional.
1086 Return a new socket object. */
1087
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001088/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001089static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001090BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001091{
Guido van Rossum73624e91994-10-10 17:59:00 +00001092 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001093 int fd, family, type, proto;
1094 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001095 if (!PyArg_Parse(args, "(ii)", &family, &type)) {
1096 PyErr_Clear();
1097 if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001098 return NULL;
1099 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001100 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001101 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001102 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001103 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001104 return PySocket_Err();
1105 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001106 /* If the object can't be created, don't forget to close the
1107 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001108 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001109 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001110 /* From now on, ignore SIGPIPE and let the error checking
1111 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001112#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001113 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001114#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001115 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001116}
1117
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001118#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001119/* Create a socket object from a numeric file description.
1120 Useful e.g. if stdin is a socket.
1121 Additional arguments as for socket(). */
1122
1123/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001124static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001125BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001126{
Guido van Rossum73624e91994-10-10 17:59:00 +00001127 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001128 int fd, family, type, proto;
1129 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001130 if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
1131 PyErr_Clear();
1132 if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001133 return NULL;
1134 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001135 /* Dup the fd so it and the socket can be closed independently */
1136 fd = dup(fd);
1137 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001138 return PySocket_Err();
1139 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001140 /* From now on, ignore SIGPIPE and let the error checking
1141 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001142#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001143 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001144#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001145 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001146}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001147#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001148
Guido van Rossum30a685f1991-06-27 15:51:29 +00001149/* List of functions exported by this module. */
1150
Guido van Rossum73624e91994-10-10 17:59:00 +00001151static PyMethodDef PySocket_methods[] = {
1152 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001153 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001154 {"gethostname", PySocket_gethostname},
1155 {"getservbyname", PySocket_getservbyname},
1156 {"socket", PySocket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001157#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 {"fromfd", PySocket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001159#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001160 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001161};
1162
Guido van Rossum30a685f1991-06-27 15:51:29 +00001163
1164/* Convenience routine to export an integer value.
1165 For simplicity, errors (which are unlikely anyway) are ignored. */
1166
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001167static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001168BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001169{
Guido van Rossum73624e91994-10-10 17:59:00 +00001170 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001171 if (v == NULL) {
1172 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001173 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001174 }
1175 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001176 PyDict_SetItemString(d, name, v);
1177 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001178 }
1179}
1180
Guido van Rossum30a685f1991-06-27 15:51:29 +00001181
1182/* Initialize this module.
1183 This is called when the first 'import socket' is done,
1184 via a table in config.c, if config.c is compiled with USE_SOCKET
1185 defined. */
1186
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001187void
1188initsocket()
1189{
Guido van Rossum73624e91994-10-10 17:59:00 +00001190 PyObject *m, *d;
1191 m = Py_InitModule("socket", PySocket_methods);
1192 d = PyModule_GetDict(m);
1193 PySocket_Error = PyString_FromString("socket.error");
1194 if (PySocket_Error == NULL ||
1195 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1196 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001197 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001198#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001199 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001200#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001201 insint(d, "SOCK_STREAM", SOCK_STREAM);
1202 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1203 insint(d, "SOCK_RAW", SOCK_RAW);
1204 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1205 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001206
1207#ifdef SO_DEBUG
1208 insint(d, "SO_DEBUG", SO_DEBUG);
1209#endif
1210#ifdef SO_ACCEPTCONN
1211 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1212#endif
1213#ifdef SO_REUSEADDR
1214 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1215#endif
1216#ifdef SO_KEEPALIVE
1217 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1218#endif
1219#ifdef SO_DONTROUTE
1220 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1221#endif
1222#ifdef SO_BROADCAST
1223 insint(d, "SO_BROADCAST", SO_BROADCAST);
1224#endif
1225#ifdef SO_USELOOPBACK
1226 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1227#endif
1228#ifdef SO_LINGER
1229 insint(d, "SO_LINGER", SO_LINGER);
1230#endif
1231#ifdef SO_OOBINLINE
1232 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1233#endif
1234#ifdef SO_REUSEPORT
1235 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1236#endif
1237
1238#ifdef SO_SNDBUF
1239 insint(d, "SO_SNDBUF", SO_SNDBUF);
1240#endif
1241#ifdef SO_RCVBUF
1242 insint(d, "SO_RCVBUF", SO_RCVBUF);
1243#endif
1244#ifdef SO_SNDLOWAT
1245 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1246#endif
1247#ifdef SO_RCVLOWAT
1248 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1249#endif
1250#ifdef SO_SNDTIMEO
1251 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1252#endif
1253#ifdef SO_RCVTIMEO
1254 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1255#endif
1256#ifdef SO_ERROR
1257 insint(d, "SO_ERROR", SO_ERROR);
1258#endif
1259#ifdef SO_TYPE
1260 insint(d, "SO_TYPE", SO_TYPE);
1261#endif
1262
1263 /* Maximum number of connections for "listen" */
1264#ifdef SOMAXCONN
1265 insint(d, "SOMAXCONN", SOMAXCONN);
1266#else
1267 insint(d, "SOMAXCONN", 5); /* Common value */
1268#endif
1269
1270 /* Flags for send, recv */
1271#ifdef MSG_OOB
1272 insint(d, "MSG_OOB", MSG_OOB);
1273#endif
1274#ifdef MSG_PEEK
1275 insint(d, "MSG_PEEK", MSG_PEEK);
1276#endif
1277#ifdef MSG_DONTROUTE
1278 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1279#endif
1280#ifdef MSG_EOR
1281 insint(d, "MSG_EOR", MSG_EOR);
1282#endif
1283#ifdef MSG_TRUNC
1284 insint(d, "MSG_TRUNC", MSG_TRUNC);
1285#endif
1286#ifdef MSG_CTRUNC
1287 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1288#endif
1289#ifdef MSG_WAITALL
1290 insint(d, "MSG_WAITALL", MSG_WAITALL);
1291#endif
1292#ifdef MSG_BTAG
1293 insint(d, "MSG_BTAG", MSG_BTAG);
1294#endif
1295#ifdef MSG_ETAG
1296 insint(d, "MSG_ETAG", MSG_ETAG);
1297#endif
1298
1299 /* Protocol level and numbers, usable for [gs]etsockopt */
1300#ifdef SOL_SOCKET
1301 insint(d, "SOL_SOCKET", SOL_SOCKET);
1302#endif
1303#ifdef IPPROTO_IP
1304 insint(d, "IPPROTO_IP", IPPROTO_IP);
1305#endif
1306#ifdef IPPROTO_ICMP
1307 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1308#endif
1309#ifdef IPPROTO_IGMP
1310 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1311#endif
1312#ifdef IPPROTO_GGP
1313 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1314#endif
1315#ifdef IPPROTO_TCP
1316 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1317#endif
1318#ifdef IPPROTO_EGP
1319 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1320#endif
1321#ifdef IPPROTO_PUP
1322 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1323#endif
1324#ifdef IPPROTO_UDP
1325 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1326#endif
1327#ifdef IPPROTO_IDP
1328 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1329#endif
1330#ifdef IPPROTO_HELLO
1331 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1332#endif
1333#ifdef IPPROTO_ND
1334 insint(d, "IPPROTO_ND", IPPROTO_ND);
1335#endif
1336#ifdef IPPROTO_TP
1337 insint(d, "IPPROTO_TP", IPPROTO_TP);
1338#endif
1339#ifdef IPPROTO_XTP
1340 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1341#endif
1342#ifdef IPPROTO_EON
1343 insint(d, "IPPROTO_EON", IPPROTO_EON);
1344#endif
1345#ifdef IPPROTO_BIP
1346 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1347#endif
1348/**/
1349#ifdef IPPROTO_RAW
1350 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1351#endif
1352#ifdef IPPROTO_MAX
1353 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1354#endif
1355
1356 /* Some port configuration */
1357#ifdef IPPORT_RESERVED
1358 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1359#else
1360 insint(d, "IPPORT_RESERVED", 1024);
1361#endif
1362#ifdef IPPORT_USERRESERVED
1363 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1364#else
1365 insint(d, "IPPORT_USERRESERVED", 5000);
1366#endif
1367
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001368 /* Some reserved IP v.4 addresses */
1369#ifdef INADDR_ANY
1370 insint(d, "INADDR_ANY", INADDR_ANY);
1371#else
1372 insint(d, "INADDR_ANY", 0x00000000);
1373#endif
1374#ifdef INADDR_BROADCAST
1375 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1376#else
1377 insint(d, "INADDR_BROADCAST", 0xffffffff);
1378#endif
1379#ifdef INADDR_LOOPBACK
1380 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1381#else
1382 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1383#endif
1384#ifdef INADDR_UNSPEC_GROUP
1385 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1386#else
1387 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1388#endif
1389#ifdef INADDR_ALLHOSTS_GROUP
1390 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1391#else
1392 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1393#endif
1394#ifdef INADDR_MAX_LOCAL_GROUP
1395 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1396#else
1397 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1398#endif
1399#ifdef INADDR_NONE
1400 insint(d, "INADDR_NONE", INADDR_NONE);
1401#else
1402 insint(d, "INADDR_NONE", 0xffffffff);
1403#endif
1404
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001405 /* IP [gs]etsockopt options */
1406#ifdef IP_OPTIONS
1407 insint(d, "IP_OPTIONS", IP_OPTIONS);
1408#endif
1409#ifdef IP_HDRINCL
1410 insint(d, "IP_HDRINCL", IP_HDRINCL);
1411#endif
1412#ifdef IP_TOS
1413 insint(d, "IP_TOS", IP_TOS);
1414#endif
1415#ifdef IP_TTL
1416 insint(d, "IP_TTL", IP_TTL);
1417#endif
1418#ifdef IP_RECVOPTS
1419 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1420#endif
1421#ifdef IP_RECVRETOPTS
1422 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1423#endif
1424#ifdef IP_RECVDSTADDR
1425 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1426#endif
1427#ifdef IP_RETOPTS
1428 insint(d, "IP_RETOPTS", IP_RETOPTS);
1429#endif
1430#ifdef IP_MULTICAST_IF
1431 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1432#endif
1433#ifdef IP_MULTICAST_TTL
1434 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1435#endif
1436#ifdef IP_MULTICAST_LOOP
1437 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1438#endif
1439#ifdef IP_ADD_MEMBERSHIP
1440 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1441#endif
1442#ifdef IP_DROP_MEMBERSHIP
1443 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1444#endif
Guido van Rossum55558541996-05-23 22:54:50 +00001445
1446#ifdef MS_WIN16
1447/* All windows sockets require a successful WSAStartup() before use */
1448 {
1449 const int opt = SO_SYNCHRONOUS_NONALERT;
1450 WSADATA WSAData;
1451 int ret;
1452 ret = WSAStartup(0x0101, &WSAData); /* request version 1.1 */
1453 switch(ret){
1454 case WSASYSNOTREADY:
1455 PyErr_SetString(PySocket_Error,
1456 "WSAStartup failed: Network not ready\n");
1457 break;
1458 case WSAVERNOTSUPPORTED:
1459 case WSAEINVAL:
1460 PyErr_SetString(PySocket_Error,
1461 "WSAStartup failed: Requested version not supported");
1462 break;
1463 case 0:
1464 /* Setup sockets in non-overlapped mode by default */
1465 if (setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,
1466 (const char *)&opt,sizeof(opt)) != 0)
1467 PyErr_SetString(PySocket_Error,
1468 "setsockopt failed in initsocket");
1469 break;
1470 default:
1471 PyErr_SetString(PySocket_Error,
1472 "WSAStartup failed");
1473 break;
1474 }
1475 }
1476#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001477}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001478
1479#ifdef NT
1480BOOL WINAPI DllMain (HANDLE hInst,
1481 ULONG ul_reason_for_call,
1482 LPVOID lpReserved)
1483{
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001484 const int opt = SO_SYNCHRONOUS_NONALERT;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001485 switch (ul_reason_for_call)
1486 {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001487 case DLL_PROCESS_ATTACH: {
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001488 WSADATA WSAData;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001489 BOOL ok = TRUE;
1490 char buf[100] = "Python can't initialize Windows Sockets Module!\n\r";
1491 if (WSAStartup(MAKEWORD(1,1), &WSAData)) {
1492 wsprintf(buf+strlen(buf), "WSAStartup failed (%d)",WSAGetLastError());
1493 ok = FALSE;
1494 }
1495 /*
1496 ** Setup sockets in non-overlapped mode by default
1497 */
Guido van Rossum55558541996-05-23 22:54:50 +00001498// if (ok && setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(const char *)&opt,sizeof(opt)) != 0) {
1499// wsprintf(buf+strlen(buf),"setsockopt failed (%d)",WSAGetLastError());
1500// ok = FALSE;
1501// }
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001502 if (!ok) {
1503 MessageBox(NULL,buf,"WinSock Error",MB_OK|MB_SETFOREGROUND);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001504 return FALSE;
1505 }
1506 break;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001507 }
1508
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001509 case DLL_PROCESS_DETACH:
1510 WSACleanup();
1511 break;
1512
1513 }
1514 return TRUE;
1515}
1516#endif /* NT */