blob: 5b971f81e64e720883c6008d466c2c3fd09eab53 [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 Rossumc65a5251994-08-05 13:44:50 +0000474#if 0
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000475/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000476/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000477
Guido van Rossum73624e91994-10-10 17:59:00 +0000478static PyObject *
479BUILD_FUNC_DEF_2(PySocketSock_allowbroadcast,PySocketSockObject *,s, PyObject *,args)
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000480{
481 int flag;
482 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000483 if (!PyArg_Parse(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000484 return NULL;
485 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000486 (ANY *)&flag, sizeof flag);
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000487 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000488 return PySocket_Err();
489 Py_INCREF(Py_None);
490 return Py_None;
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000491}
Guido van Rossumc65a5251994-08-05 13:44:50 +0000492#endif
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000493
494
Guido van Rossume4485b01994-09-07 14:32:49 +0000495/* s.setblocking(1 | 0) method */
496
Guido van Rossum73624e91994-10-10 17:59:00 +0000497static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000498BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000499{
500 int block;
501 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000502 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000503 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000504 Py_BEGIN_ALLOW_THREADS
Guido van Rossum55558541996-05-23 22:54:50 +0000505#ifndef _MSC_VER
Guido van Rossume4485b01994-09-07 14:32:49 +0000506 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
507 if (block)
508 delay_flag &= (~O_NDELAY);
509 else
510 delay_flag |= O_NDELAY;
511 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000512#else
513 block = !block;
514 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
515#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000516 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000517
Guido van Rossum73624e91994-10-10 17:59:00 +0000518 Py_INCREF(Py_None);
519 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000520}
Guido van Rossume4485b01994-09-07 14:32:49 +0000521
522
Guido van Rossumaee08791992-09-08 09:05:33 +0000523/* s.setsockopt() method.
524 With an integer third argument, sets an integer option.
525 With a string third argument, sets an option from a buffer;
526 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000527
Guido van Rossum73624e91994-10-10 17:59:00 +0000528static PyObject *
529BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000530{
531 int level;
532 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000533 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000534 char *buf;
535 int buflen;
536 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000537
Guido van Rossum73624e91994-10-10 17:59:00 +0000538 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000539 buf = (char *) &flag;
540 buflen = sizeof flag;
541 }
542 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000543 PyErr_Clear();
544 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000545 return NULL;
546 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000547 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000548 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000549 return PySocket_Err();
550 Py_INCREF(Py_None);
551 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000552}
553
554
Guido van Rossumaee08791992-09-08 09:05:33 +0000555/* s.getsockopt() method.
556 With two arguments, retrieves an integer option.
557 With a third integer argument, retrieves a string buffer of that size;
558 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000559
Guido van Rossum73624e91994-10-10 17:59:00 +0000560static PyObject *
561BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000562{
563 int level;
564 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000565 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000566 PyObject *buf;
Guido van Rossumaee08791992-09-08 09:05:33 +0000567 int buflen;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000568
Guido van Rossum73624e91994-10-10 17:59:00 +0000569 if (PyArg_Parse(args, "(ii)", &level, &optname)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000570 int flag = 0;
571 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000572 res = getsockopt(s->sock_fd, level, optname,
573 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000574 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000575 return PySocket_Err();
576 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000577 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000578 PyErr_Clear();
579 if (!PyArg_Parse(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000580 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000581 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000582 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000583 return NULL;
584 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000585 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000586 if (buf == NULL)
587 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000588 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000589 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000590 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000591 Py_DECREF(buf);
592 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000593 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000594 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000595 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000596}
597
598
Guido van Rossum30a685f1991-06-27 15:51:29 +0000599/* s.bind(sockaddr) method */
600
Guido van Rossum73624e91994-10-10 17:59:00 +0000601static PyObject *
602BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000603{
604 struct sockaddr *addr;
605 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000606 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000607 if (!getsockaddrarg(s, args, &addr, &addrlen))
608 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000609 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000610 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000612 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 return PySocket_Err();
614 Py_INCREF(Py_None);
615 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000616}
617
Guido van Rossum30a685f1991-06-27 15:51:29 +0000618
619/* s.close() method.
620 Set the file descriptor to -1 so operations tried subsequently
621 will surely fail. */
622
Guido van Rossum73624e91994-10-10 17:59:00 +0000623static PyObject *
624BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000625{
Guido van Rossum73624e91994-10-10 17:59:00 +0000626 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000628 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000630 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000631 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000632 Py_INCREF(Py_None);
633 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000634}
635
Guido van Rossum30a685f1991-06-27 15:51:29 +0000636
637/* s.connect(sockaddr) method */
638
Guido van Rossum73624e91994-10-10 17:59:00 +0000639static PyObject *
640BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641{
642 struct sockaddr *addr;
643 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000644 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000645 if (!getsockaddrarg(s, args, &addr, &addrlen))
646 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000647 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000648 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000649 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000650 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000651 return PySocket_Err();
652 Py_INCREF(Py_None);
653 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000654}
655
Guido van Rossum30a685f1991-06-27 15:51:29 +0000656
Guido van Rossumed233a51992-06-23 09:07:03 +0000657/* s.fileno() method */
658
Guido van Rossum73624e91994-10-10 17:59:00 +0000659static PyObject *
660BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000661{
Guido van Rossum73624e91994-10-10 17:59:00 +0000662 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000663 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000664 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000665}
666
667
Guido van Rossumc89705d1992-11-26 08:54:07 +0000668/* s.getsockname() method */
669
Guido van Rossum73624e91994-10-10 17:59:00 +0000670static PyObject *
671BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000672{
673 char addrbuf[256];
674 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000675 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000676 return NULL;
677 if (!getsockaddrlen(s, &addrlen))
678 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000679 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000680 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000681 res = getsockname(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}
687
688
Guido van Rossumb6775db1994-08-01 11:34:53 +0000689#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000690/* s.getpeername() method */
691
Guido van Rossum73624e91994-10-10 17:59:00 +0000692static PyObject *
693BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000694{
695 char addrbuf[256];
696 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000697 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000698 return NULL;
699 if (!getsockaddrlen(s, &addrlen))
700 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000701 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000702 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000703 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000704 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000705 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000706 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
707}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000708#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000709
710
Guido van Rossum30a685f1991-06-27 15:51:29 +0000711/* s.listen(n) method */
712
Guido van Rossum73624e91994-10-10 17:59:00 +0000713static PyObject *
714BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000715{
716 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000717 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000718 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000719 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000720 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000721 if (backlog < 1)
722 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000723 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000724 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000725 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000726 return PySocket_Err();
727 Py_INCREF(Py_None);
728 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000729}
730
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000731#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000732/* s.makefile(mode) method.
733 Create a new open file object referring to a dupped version of
734 the socket's file descriptor. (The dup() call is necessary so
735 that the open file and socket objects may be closed independent
736 of each other.)
737 The mode argument specifies 'r' or 'w' passed to fdopen(). */
738
Guido van Rossum73624e91994-10-10 17:59:00 +0000739static PyObject *
740BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000741{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000742 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000743 char *mode = "r";
744 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000745 int fd;
746 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000747 PyObject *f;
748
749 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000750 return NULL;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000751#ifdef NT
752 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
753 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
754#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000756 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000757#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000758 if (fd >= 0)
759 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000760 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000761 }
762 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
763 if (f != NULL)
764 PyFile_SetBufSize(f, bufsize);
765 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000766}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000767#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000769/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000770
Guido van Rossum73624e91994-10-10 17:59:00 +0000771static PyObject *
772BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000773{
774 int len, n, flags;
Guido van Rossum73624e91994-10-10 17:59:00 +0000775 PyObject *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000776 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000777 if (!PyArg_Parse(args, "i", &len)) {
778 PyErr_Clear();
779 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000780 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000781 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000782 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000783 if (buf == NULL)
784 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000785 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000786 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000787 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000788 if (n < 0) {
789 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000790 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000791 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000792 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000793 return NULL;
794 return buf;
795}
796
Guido van Rossum30a685f1991-06-27 15:51:29 +0000797
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000798/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000799
Guido van Rossum73624e91994-10-10 17:59:00 +0000800static PyObject *
801BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000802{
803 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000804 PyObject *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000805 int addrlen, len, n, flags;
806 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000807 if (!PyArg_Parse(args, "i", &len)) {
808 PyErr_Clear();
809 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000810 return NULL;
811 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000812 if (!getsockaddrlen(s, &addrlen))
813 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000814 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000815 if (buf == NULL)
816 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000817 Py_BEGIN_ALLOW_THREADS
818 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000819#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000820 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000821#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000822 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000823#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000824 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000825 if (n < 0) {
826 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000827 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000828 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000829 if (_PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000831 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000832 ret = Py_BuildValue("OO", buf, addr);
833 Py_XDECREF(addr);
834 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000835 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000836}
837
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000839/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000840
Guido van Rossum73624e91994-10-10 17:59:00 +0000841static PyObject *
842BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000843{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000844 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000846 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000847 if (!PyArg_Parse(args, "s#", &buf, &len)) {
848 PyErr_Clear();
849 if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000851 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000852 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000853 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000854 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000855 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000856 return PySocket_Err();
857 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000858}
859
860
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000861/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000862
Guido van Rossum73624e91994-10-10 17:59:00 +0000863static PyObject *
864BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000865{
Guido van Rossum73624e91994-10-10 17:59:00 +0000866 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000867 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000868 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000869 int addrlen, len, n, flags;
870 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000871 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
872 PyErr_Clear();
873 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000874 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000876 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000877 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000878 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000879 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000880 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000881 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000882 return PySocket_Err();
883 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000884}
885
Guido van Rossum30a685f1991-06-27 15:51:29 +0000886
887/* s.shutdown(how) method */
888
Guido van Rossum73624e91994-10-10 17:59:00 +0000889static PyObject *
890BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000891{
892 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000893 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000894 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000895 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000896 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000897 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000898 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000899 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000900 return PySocket_Err();
901 Py_INCREF(Py_None);
902 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000903}
904
Guido van Rossum30a685f1991-06-27 15:51:29 +0000905
906/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000907
Guido van Rossum73624e91994-10-10 17:59:00 +0000908static PyMethodDef PySocketSock_methods[] = {
909 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000910#if 0
Guido van Rossum73624e91994-10-10 17:59:00 +0000911 {"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000912#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000913 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000914 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
915 {"getsockopt", (PyCFunction)PySocketSock_getsockopt},
916 {"bind", (PyCFunction)PySocketSock_bind},
917 {"close", (PyCFunction)PySocketSock_close},
918 {"connect", (PyCFunction)PySocketSock_connect},
919 {"fileno", (PyCFunction)PySocketSock_fileno},
920 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000921#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000922 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000923#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000924 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000925#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000926 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000927#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000928 {"recv", (PyCFunction)PySocketSock_recv},
929 {"recvfrom", (PyCFunction)PySocketSock_recvfrom},
930 {"send", (PyCFunction)PySocketSock_send},
931 {"sendto", (PyCFunction)PySocketSock_sendto},
932 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000933 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000934};
935
Guido van Rossum30a685f1991-06-27 15:51:29 +0000936
Guido van Rossum73624e91994-10-10 17:59:00 +0000937/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000938 First close the file description. */
939
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000940static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000941BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942{
943 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000944 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000945}
946
Guido van Rossum30a685f1991-06-27 15:51:29 +0000947
948/* Return a socket object's named attribute. */
949
Guido van Rossum73624e91994-10-10 17:59:00 +0000950static PyObject *
951BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000952{
Guido van Rossum73624e91994-10-10 17:59:00 +0000953 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000954}
955
Guido van Rossum30a685f1991-06-27 15:51:29 +0000956
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000957static PyObject *
958BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
959{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000960 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000961 sprintf(buf,
962 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
963 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +0000964 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000965}
966
967
Guido van Rossumb6775db1994-08-01 11:34:53 +0000968/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969
Guido van Rossum73624e91994-10-10 17:59:00 +0000970static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +0000971 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972 0,
973 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000974 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000975 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000976 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000977 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000978 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000979 0, /*tp_setattr*/
980 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000981 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000982 0, /*tp_as_number*/
983 0, /*tp_as_sequence*/
984 0, /*tp_as_mapping*/
985};
986
Guido van Rossum30a685f1991-06-27 15:51:29 +0000987
Guido van Rossum81194471991-07-27 21:42:02 +0000988/* Python interface to gethostname(). */
989
990/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000991static PyObject *
992BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000993{
994 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000995 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000996 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +0000997 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000998 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000999 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +00001000 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001001 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001002 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +00001003 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +00001004 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +00001005}
Guido van Rossumff4949e1992-08-05 19:58:53 +00001006
1007
Guido van Rossum30a685f1991-06-27 15:51:29 +00001008/* Python interface to gethostbyname(name). */
1009
1010/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001011static PyObject *
1012BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001013{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001014 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001015 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +00001016 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001017 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001018 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019 return NULL;
1020 return makeipaddr(&addrbuf);
1021}
1022
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001023/* Python interface to gethostbyaddr(IP). */
1024
1025/*ARGSUSED*/
1026static PyObject *
1027BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1028{
1029 struct sockaddr_in addr;
1030 char *ip_num;
1031 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001032 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001033 PyObject *rtn_tuple = (PyObject *)NULL;
1034 PyObject *name_list = (PyObject *)NULL;
1035 PyObject *addr_list = (PyObject *)NULL;
1036 PyObject *tmp;
1037
1038 if (!PyArg_Parse(args, "s", &ip_num))
1039 return NULL;
1040 if (setipaddr(ip_num, &addr) < 0)
1041 return NULL;
1042 h = gethostbyaddr((char *)&addr.sin_addr,
1043 sizeof(addr.sin_addr),
1044 AF_INET);
1045 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001046#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001047 /* Let's get real error message to return */
1048 extern int h_errno;
1049 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1050#else
1051 PyErr_SetString(PySocket_Error, "host not found");
1052#endif
1053 return NULL;
1054 }
1055 if ((name_list = PyList_New(0)) == NULL)
1056 goto err;
1057 if ((addr_list = PyList_New(0)) == NULL)
1058 goto err;
1059 for (pch = h->h_aliases; *pch != NULL; pch++) {
1060 tmp = PyString_FromString(*pch);
1061 if (tmp == NULL)
1062 goto err;
1063 PyList_Append(name_list, tmp);
1064 Py_DECREF(tmp);
1065 }
1066 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1067 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1068 tmp = makeipaddr(&addr);
1069 if (tmp == NULL)
1070 goto err;
1071 PyList_Append(addr_list, tmp);
1072 Py_DECREF(tmp);
1073 }
1074 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1075 err:
1076 Py_XDECREF(name_list);
1077 Py_XDECREF(addr_list);
1078 return rtn_tuple;
1079}
1080
Guido van Rossum30a685f1991-06-27 15:51:29 +00001081
1082/* Python interface to getservbyname(name).
1083 This only returns the port number, since the other info is already
1084 known or not useful (like the list of aliases). */
1085
1086/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001087static PyObject *
1088BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001089{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001090 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001091 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001092 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001093 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001094 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001095 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001096 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001098 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001099 return NULL;
1100 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001101 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001102}
1103
1104
1105/* Python interface to socket(family, type, proto).
1106 The third (protocol) argument is optional.
1107 Return a new socket object. */
1108
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001109/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001110static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001111BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001112{
Guido van Rossum73624e91994-10-10 17:59:00 +00001113 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001114 int fd, family, type, proto;
1115 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001116 if (!PyArg_Parse(args, "(ii)", &family, &type)) {
1117 PyErr_Clear();
1118 if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001119 return NULL;
1120 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001121 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001122 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001123 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001124 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001125 return PySocket_Err();
1126 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001127 /* If the object can't be created, don't forget to close the
1128 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001129 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001130 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001131 /* From now on, ignore SIGPIPE and let the error checking
1132 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001133#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001134 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001135#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001136 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001137}
1138
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001139#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001140/* Create a socket object from a numeric file description.
1141 Useful e.g. if stdin is a socket.
1142 Additional arguments as for socket(). */
1143
1144/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001145static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001146BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001147{
Guido van Rossum73624e91994-10-10 17:59:00 +00001148 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001149 int fd, family, type, proto;
1150 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001151 if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
1152 PyErr_Clear();
1153 if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001154 return NULL;
1155 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001156 /* Dup the fd so it and the socket can be closed independently */
1157 fd = dup(fd);
1158 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001159 return PySocket_Err();
1160 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001161 /* From now on, ignore SIGPIPE and let the error checking
1162 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001163#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001164 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001165#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001166 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001167}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001168#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001169
Guido van Rossum30a685f1991-06-27 15:51:29 +00001170/* List of functions exported by this module. */
1171
Guido van Rossum73624e91994-10-10 17:59:00 +00001172static PyMethodDef PySocket_methods[] = {
1173 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001174 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001175 {"gethostname", PySocket_gethostname},
1176 {"getservbyname", PySocket_getservbyname},
1177 {"socket", PySocket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001178#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +00001179 {"fromfd", PySocket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001180#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001181 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001182};
1183
Guido van Rossum30a685f1991-06-27 15:51:29 +00001184
1185/* Convenience routine to export an integer value.
1186 For simplicity, errors (which are unlikely anyway) are ignored. */
1187
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001188static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001189BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001190{
Guido van Rossum73624e91994-10-10 17:59:00 +00001191 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001192 if (v == NULL) {
1193 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001194 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001195 }
1196 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001197 PyDict_SetItemString(d, name, v);
1198 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001199 }
1200}
1201
Guido van Rossum30a685f1991-06-27 15:51:29 +00001202
1203/* Initialize this module.
1204 This is called when the first 'import socket' is done,
1205 via a table in config.c, if config.c is compiled with USE_SOCKET
1206 defined. */
1207
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001208void
1209initsocket()
1210{
Guido van Rossum73624e91994-10-10 17:59:00 +00001211 PyObject *m, *d;
1212 m = Py_InitModule("socket", PySocket_methods);
1213 d = PyModule_GetDict(m);
1214 PySocket_Error = PyString_FromString("socket.error");
1215 if (PySocket_Error == NULL ||
1216 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1217 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001218 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001219#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001220 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001221#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001222 insint(d, "SOCK_STREAM", SOCK_STREAM);
1223 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1224 insint(d, "SOCK_RAW", SOCK_RAW);
1225 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1226 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001227
1228#ifdef SO_DEBUG
1229 insint(d, "SO_DEBUG", SO_DEBUG);
1230#endif
1231#ifdef SO_ACCEPTCONN
1232 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1233#endif
1234#ifdef SO_REUSEADDR
1235 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1236#endif
1237#ifdef SO_KEEPALIVE
1238 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1239#endif
1240#ifdef SO_DONTROUTE
1241 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1242#endif
1243#ifdef SO_BROADCAST
1244 insint(d, "SO_BROADCAST", SO_BROADCAST);
1245#endif
1246#ifdef SO_USELOOPBACK
1247 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1248#endif
1249#ifdef SO_LINGER
1250 insint(d, "SO_LINGER", SO_LINGER);
1251#endif
1252#ifdef SO_OOBINLINE
1253 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1254#endif
1255#ifdef SO_REUSEPORT
1256 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1257#endif
1258
1259#ifdef SO_SNDBUF
1260 insint(d, "SO_SNDBUF", SO_SNDBUF);
1261#endif
1262#ifdef SO_RCVBUF
1263 insint(d, "SO_RCVBUF", SO_RCVBUF);
1264#endif
1265#ifdef SO_SNDLOWAT
1266 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1267#endif
1268#ifdef SO_RCVLOWAT
1269 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1270#endif
1271#ifdef SO_SNDTIMEO
1272 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1273#endif
1274#ifdef SO_RCVTIMEO
1275 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1276#endif
1277#ifdef SO_ERROR
1278 insint(d, "SO_ERROR", SO_ERROR);
1279#endif
1280#ifdef SO_TYPE
1281 insint(d, "SO_TYPE", SO_TYPE);
1282#endif
1283
1284 /* Maximum number of connections for "listen" */
1285#ifdef SOMAXCONN
1286 insint(d, "SOMAXCONN", SOMAXCONN);
1287#else
1288 insint(d, "SOMAXCONN", 5); /* Common value */
1289#endif
1290
1291 /* Flags for send, recv */
1292#ifdef MSG_OOB
1293 insint(d, "MSG_OOB", MSG_OOB);
1294#endif
1295#ifdef MSG_PEEK
1296 insint(d, "MSG_PEEK", MSG_PEEK);
1297#endif
1298#ifdef MSG_DONTROUTE
1299 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1300#endif
1301#ifdef MSG_EOR
1302 insint(d, "MSG_EOR", MSG_EOR);
1303#endif
1304#ifdef MSG_TRUNC
1305 insint(d, "MSG_TRUNC", MSG_TRUNC);
1306#endif
1307#ifdef MSG_CTRUNC
1308 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1309#endif
1310#ifdef MSG_WAITALL
1311 insint(d, "MSG_WAITALL", MSG_WAITALL);
1312#endif
1313#ifdef MSG_BTAG
1314 insint(d, "MSG_BTAG", MSG_BTAG);
1315#endif
1316#ifdef MSG_ETAG
1317 insint(d, "MSG_ETAG", MSG_ETAG);
1318#endif
1319
1320 /* Protocol level and numbers, usable for [gs]etsockopt */
1321#ifdef SOL_SOCKET
1322 insint(d, "SOL_SOCKET", SOL_SOCKET);
1323#endif
1324#ifdef IPPROTO_IP
1325 insint(d, "IPPROTO_IP", IPPROTO_IP);
1326#endif
1327#ifdef IPPROTO_ICMP
1328 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1329#endif
1330#ifdef IPPROTO_IGMP
1331 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1332#endif
1333#ifdef IPPROTO_GGP
1334 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1335#endif
1336#ifdef IPPROTO_TCP
1337 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1338#endif
1339#ifdef IPPROTO_EGP
1340 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1341#endif
1342#ifdef IPPROTO_PUP
1343 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1344#endif
1345#ifdef IPPROTO_UDP
1346 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1347#endif
1348#ifdef IPPROTO_IDP
1349 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1350#endif
1351#ifdef IPPROTO_HELLO
1352 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1353#endif
1354#ifdef IPPROTO_ND
1355 insint(d, "IPPROTO_ND", IPPROTO_ND);
1356#endif
1357#ifdef IPPROTO_TP
1358 insint(d, "IPPROTO_TP", IPPROTO_TP);
1359#endif
1360#ifdef IPPROTO_XTP
1361 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1362#endif
1363#ifdef IPPROTO_EON
1364 insint(d, "IPPROTO_EON", IPPROTO_EON);
1365#endif
1366#ifdef IPPROTO_BIP
1367 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1368#endif
1369/**/
1370#ifdef IPPROTO_RAW
1371 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1372#endif
1373#ifdef IPPROTO_MAX
1374 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1375#endif
1376
1377 /* Some port configuration */
1378#ifdef IPPORT_RESERVED
1379 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1380#else
1381 insint(d, "IPPORT_RESERVED", 1024);
1382#endif
1383#ifdef IPPORT_USERRESERVED
1384 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1385#else
1386 insint(d, "IPPORT_USERRESERVED", 5000);
1387#endif
1388
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001389 /* Some reserved IP v.4 addresses */
1390#ifdef INADDR_ANY
1391 insint(d, "INADDR_ANY", INADDR_ANY);
1392#else
1393 insint(d, "INADDR_ANY", 0x00000000);
1394#endif
1395#ifdef INADDR_BROADCAST
1396 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1397#else
1398 insint(d, "INADDR_BROADCAST", 0xffffffff);
1399#endif
1400#ifdef INADDR_LOOPBACK
1401 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1402#else
1403 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1404#endif
1405#ifdef INADDR_UNSPEC_GROUP
1406 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1407#else
1408 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1409#endif
1410#ifdef INADDR_ALLHOSTS_GROUP
1411 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1412#else
1413 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1414#endif
1415#ifdef INADDR_MAX_LOCAL_GROUP
1416 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1417#else
1418 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1419#endif
1420#ifdef INADDR_NONE
1421 insint(d, "INADDR_NONE", INADDR_NONE);
1422#else
1423 insint(d, "INADDR_NONE", 0xffffffff);
1424#endif
1425
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001426 /* IP [gs]etsockopt options */
1427#ifdef IP_OPTIONS
1428 insint(d, "IP_OPTIONS", IP_OPTIONS);
1429#endif
1430#ifdef IP_HDRINCL
1431 insint(d, "IP_HDRINCL", IP_HDRINCL);
1432#endif
1433#ifdef IP_TOS
1434 insint(d, "IP_TOS", IP_TOS);
1435#endif
1436#ifdef IP_TTL
1437 insint(d, "IP_TTL", IP_TTL);
1438#endif
1439#ifdef IP_RECVOPTS
1440 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1441#endif
1442#ifdef IP_RECVRETOPTS
1443 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1444#endif
1445#ifdef IP_RECVDSTADDR
1446 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1447#endif
1448#ifdef IP_RETOPTS
1449 insint(d, "IP_RETOPTS", IP_RETOPTS);
1450#endif
1451#ifdef IP_MULTICAST_IF
1452 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1453#endif
1454#ifdef IP_MULTICAST_TTL
1455 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1456#endif
1457#ifdef IP_MULTICAST_LOOP
1458 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1459#endif
1460#ifdef IP_ADD_MEMBERSHIP
1461 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1462#endif
1463#ifdef IP_DROP_MEMBERSHIP
1464 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1465#endif
Guido van Rossum55558541996-05-23 22:54:50 +00001466
1467#ifdef MS_WIN16
1468/* All windows sockets require a successful WSAStartup() before use */
1469 {
1470 const int opt = SO_SYNCHRONOUS_NONALERT;
1471 WSADATA WSAData;
1472 int ret;
1473 ret = WSAStartup(0x0101, &WSAData); /* request version 1.1 */
1474 switch(ret){
1475 case WSASYSNOTREADY:
1476 PyErr_SetString(PySocket_Error,
1477 "WSAStartup failed: Network not ready\n");
1478 break;
1479 case WSAVERNOTSUPPORTED:
1480 case WSAEINVAL:
1481 PyErr_SetString(PySocket_Error,
1482 "WSAStartup failed: Requested version not supported");
1483 break;
1484 case 0:
1485 /* Setup sockets in non-overlapped mode by default */
1486 if (setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,
1487 (const char *)&opt,sizeof(opt)) != 0)
1488 PyErr_SetString(PySocket_Error,
1489 "setsockopt failed in initsocket");
1490 break;
1491 default:
1492 PyErr_SetString(PySocket_Error,
1493 "WSAStartup failed");
1494 break;
1495 }
1496 }
1497#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001498}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001499
1500#ifdef NT
1501BOOL WINAPI DllMain (HANDLE hInst,
1502 ULONG ul_reason_for_call,
1503 LPVOID lpReserved)
1504{
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001505 const int opt = SO_SYNCHRONOUS_NONALERT;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001506 switch (ul_reason_for_call)
1507 {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001508 case DLL_PROCESS_ATTACH: {
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001509 WSADATA WSAData;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001510 BOOL ok = TRUE;
1511 char buf[100] = "Python can't initialize Windows Sockets Module!\n\r";
1512 if (WSAStartup(MAKEWORD(1,1), &WSAData)) {
1513 wsprintf(buf+strlen(buf), "WSAStartup failed (%d)",WSAGetLastError());
1514 ok = FALSE;
1515 }
1516 /*
1517 ** Setup sockets in non-overlapped mode by default
1518 */
Guido van Rossum55558541996-05-23 22:54:50 +00001519// if (ok && setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(const char *)&opt,sizeof(opt)) != 0) {
1520// wsprintf(buf+strlen(buf),"setsockopt failed (%d)",WSAGetLastError());
1521// ok = FALSE;
1522// }
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001523 if (!ok) {
1524 MessageBox(NULL,buf,"WinSock Error",MB_OK|MB_SETFOREGROUND);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001525 return FALSE;
1526 }
1527 break;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001528 }
1529
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001530 case DLL_PROCESS_DETACH:
1531 WSACleanup();
1532 break;
1533
1534 }
1535 return TRUE;
1536}
1537#endif /* NT */