blob: ebdda8969db6c207a47bd9c06448efc2aa49f830 [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 Rossum006bf911996-06-12 04:04:55 +000043- socket.ntohs(16 bit value) --> new int object
44- socket.ntohl(32 bit value) --> new int object
45- socket.htons(16 bit value) --> new int object
46- socket.htonl(32 bit value) --> new int object
Guido van Rossum27e177d1995-03-16 15:43:47 +000047- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Guido van Rossum6574b3e1991-06-25 21:36:08 +000053
Guido van Rossum30a685f1991-06-27 15:51:29 +000054Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000055
Guido van Rossum81194471991-07-27 21:42:02 +000056- s.accept() --> new socket object, sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000057- s.bind(sockaddr) --> None
58- s.close() --> None
59- s.connect(sockaddr) --> None
60- s.fileno() --> file descriptor
Guido van Rossumc89705d1992-11-26 08:54:07 +000061- s.getpeername() --> sockaddr
Guido van Rossum27e177d1995-03-16 15:43:47 +000062- s.getsockname() --> sockaddr
63- s.getsockopt(level, optname[, buflen]) --> int or string
64- s.listen(backlog) --> None
Guido van Rossum6b144911995-03-14 15:05:13 +000065- s.makefile([mode[, bufsize]]) --> file object
Guido van Rossum27e177d1995-03-16 15:43:47 +000066- s.recv(buflen [,flags]) --> string
67- s.recvfrom(buflen [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000068- s.send(string [,flags]) --> nbytes
69- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossum27e177d1995-03-16 15:43:47 +000070- s.setblocking(0 | 1) --> None
71- s.setsockopt(level, optname, value) --> None
72- s.shutdown(how) --> None
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000073- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
Guido van Rossum30a685f1991-06-27 15:51:29 +000074
Guido van Rossum6574b3e1991-06-25 21:36:08 +000075*/
76
Guido van Rossum73624e91994-10-10 17:59:00 +000077#include "Python.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000078
Guido van Rossumb6775db1994-08-01 11:34:53 +000079#include <sys/types.h>
80#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000081
Guido van Rossum81194471991-07-27 21:42:02 +000082#include <signal.h>
Guido van Rossum55558541996-05-23 22:54:50 +000083#ifndef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +000084#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000085#include <sys/socket.h>
86#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +000087#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000088#else
89#include <winsock.h>
Guido van Rossum30b6b2b1995-06-14 22:28:08 +000090#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000091#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000092#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +000093#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000094#else
95#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +000096#endif
97
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000098#ifndef O_NDELAY
99#define O_NDELAY O_NONBLOCK /* For QNX only? */
100#endif
101
Jack Jansen508537b1996-02-14 15:57:45 +0000102#ifdef USE_GUSI
103/* fdopen() isn't declared in stdio.h (sigh) */
104#include <GUSI.h>
105#endif
106
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000107
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000108/* Here we have some hacks to choose between K&R or ANSI style function
109 definitions. For NT to build this as an extension module (ie, DLL)
110 it must be compiled by the C++ compiler, as it takes the address of
111 a static data item exported from the main Python DLL.
112*/
113#ifdef NT
114/* seem to be a few differences in the API */
115#define close closesocket
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000116#define NO_DUP /* Define for NT 3.1, Win3.1 and Win95, Undefine for NT3.5 */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000117#define FORCE_ANSI_FUNC_DEFS
118#endif
119
120#ifdef FORCE_ANSI_FUNC_DEFS
121#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
122fnname( arg1type arg1name )
123
124#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
125fnname( arg1type arg1name, arg2type arg2name )
126
127#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
128fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
129
130#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
131fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
132
133#else /* !FORCE_ANSI_FN_DEFS */
134#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
135fnname( arg1name ) \
136 arg1type arg1name;
137
138#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
139fnname( arg1name, arg2name ) \
140 arg1type arg1name; \
141 arg2type arg2name;
142
143#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
144fnname( arg1name, arg2name, arg3name ) \
145 arg1type arg1name; \
146 arg2type arg2name; \
147 arg3type arg3name;
148
149#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
150fnname( arg1name, arg2name, arg3name, arg4name ) \
151 arg1type arg1name; \
152 arg2type arg2name; \
153 arg3type arg3name; \
154 arg4type arg4name;
155
156#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000157
158/* Global variable holding the exception type for errors detected
159 by this module (but not argument type or memory errors, etc.). */
160
Guido van Rossum73624e91994-10-10 17:59:00 +0000161static PyObject *PySocket_Error;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000162
163
164/* Convenience function to raise an error according to errno
165 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000166
Guido van Rossum73624e91994-10-10 17:59:00 +0000167static PyObject *
168PySocket_Err()
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000169{
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000170#ifdef NT
171 if (WSAGetLastError()) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000172 PyObject *v;
173 v = Py_BuildValue("(is)", WSAGetLastError(), "winsock error");
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000174 if (v != NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000175 PyErr_SetObject(PySocket_Error, v);
176 Py_DECREF(v);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000177 }
178 return NULL;
179 }
180 else
181#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000182 return PyErr_SetFromErrno(PySocket_Error);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000183}
184
Guido van Rossum30a685f1991-06-27 15:51:29 +0000185
186/* The object holding a socket. It holds some extra information,
187 like the address family, which is used to decode socket address
188 arguments properly. */
189
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000190typedef struct {
Guido van Rossum73624e91994-10-10 17:59:00 +0000191 PyObject_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000192 int sock_fd; /* Socket file descriptor */
193 int sock_family; /* Address family, e.g., AF_INET */
194 int sock_type; /* Socket type, e.g., SOCK_STREAM */
195 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000196 union sock_addr {
197 struct sockaddr_in in;
198#ifdef AF_UNIX
199 struct sockaddr_un un;
200#endif
201 } sock_addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000202} PySocketSockObject;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000203
Guido van Rossum30a685f1991-06-27 15:51:29 +0000204
205/* A forward reference to the Socktype type object.
206 The Socktype variable contains pointers to various functions,
Guido van Rossum73624e91994-10-10 17:59:00 +0000207 some of which call newsockobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000208 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000209
Guido van Rossum73624e91994-10-10 17:59:00 +0000210staticforward PyTypeObject PySocketSock_Type;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000211
Guido van Rossum30a685f1991-06-27 15:51:29 +0000212
213/* Create a new socket object.
214 This just creates the object and initializes it.
215 If the creation fails, return NULL and set an exception (implicit
216 in NEWOBJ()). */
217
Guido van Rossum73624e91994-10-10 17:59:00 +0000218static PySocketSockObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000219BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000220{
Guido van Rossum73624e91994-10-10 17:59:00 +0000221 PySocketSockObject *s;
Guido van Rossum55558541996-05-23 22:54:50 +0000222 PySocketSock_Type.ob_type = &PyType_Type;
Guido van Rossum73624e91994-10-10 17:59:00 +0000223 s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000224 if (s != NULL) {
225 s->sock_fd = fd;
226 s->sock_family = family;
227 s->sock_type = type;
228 s->sock_proto = proto;
229 }
230 return s;
231}
232
Guido van Rossum30a685f1991-06-27 15:51:29 +0000233
234/* Convert a string specifying a host name or one of a few symbolic
235 names to a numeric IP address. This usually calls gethostbyname()
236 to do the work; the names "" and "<broadcast>" are special.
237 Return the length (should always be 4 bytes), or negative if
238 an error occurred; then an exception is raised. */
239
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000240static int
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000241BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000242{
243 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000244 int d1, d2, d3, d4;
245 char ch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000246#ifdef HAVE_GETHOSTBYNAME_R
247 struct hostent hp_allocated;
248 char buf[1001];
249 int buf_len = (sizeof buf) - 1;
250 int errnop;
251#endif /* HAVE_GETHOSTBYNAME_R */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000252
Guido van Rossum30a685f1991-06-27 15:51:29 +0000253 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000254 addr_ret->sin_addr.s_addr = INADDR_ANY;
255 return 4;
256 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000257 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000258 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
259 return 4;
260 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000261 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
262 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
263 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
264 addr_ret->sin_addr.s_addr = htonl(
265 ((long) d1 << 24) | ((long) d2 << 16) |
266 ((long) d3 << 8) | ((long) d4 << 0));
267 return 4;
268 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000269#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum73624e91994-10-10 17:59:00 +0000270 Py_BEGIN_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000271 hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum73624e91994-10-10 17:59:00 +0000272 Py_END_ALLOW_THREADS
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000273#else /* not HAVE_GETHOSTBYNAME_R */
274 hp = gethostbyname(name);
275#endif /* HAVE_GETHOSTBYNAME_R */
276
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000277 if (hp == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +0000278#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000279 /* Let's get real error message to return */
280 extern int h_errno;
281 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
282#else
Guido van Rossum73624e91994-10-10 17:59:00 +0000283 PyErr_SetString(PySocket_Error, "host not found");
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000284#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000285 return -1;
286 }
287 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
288 return hp->h_length;
289}
290
Guido van Rossum30a685f1991-06-27 15:51:29 +0000291
Guido van Rossum30a685f1991-06-27 15:51:29 +0000292/* Create a string object representing an IP address.
293 This is always a string of the form 'dd.dd.dd.dd' (with variable
294 size numbers). */
295
Guido van Rossum73624e91994-10-10 17:59:00 +0000296static PyObject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000297BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000298{
299 long x = ntohl(addr->sin_addr.s_addr);
300 char buf[100];
301 sprintf(buf, "%d.%d.%d.%d",
302 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
303 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
Guido van Rossum73624e91994-10-10 17:59:00 +0000304 return PyString_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000305}
306
307
308/* Create an object representing the given socket address,
309 suitable for passing it back to bind(), connect() etc.
310 The family field of the sockaddr structure is inspected
311 to determine what kind of address it really is. */
312
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000313/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000314static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000315BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000316{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000317 if (addrlen == 0) {
318 /* No address -- may be recvfrom() from known socket */
Guido van Rossum73624e91994-10-10 17:59:00 +0000319 Py_INCREF(Py_None);
320 return Py_None;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000321 }
322
Guido van Rossum30a685f1991-06-27 15:51:29 +0000323 switch (addr->sa_family) {
324
325 case AF_INET:
326 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000327 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000328 PyObject *addr = makeipaddr(a);
329 PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port));
330 Py_XDECREF(addr);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000331 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000332 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000333
Guido van Rossumb6775db1994-08-01 11:34:53 +0000334#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000335 case AF_UNIX:
336 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000337 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Guido van Rossum73624e91994-10-10 17:59:00 +0000338 return PyString_FromString(a->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000339 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000340#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000341
342 /* More cases here... */
343
344 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000345 PyErr_SetString(PySocket_Error, "return unknown socket address type");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000346 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000347
Guido van Rossum30a685f1991-06-27 15:51:29 +0000348 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349}
350
Guido van Rossum30a685f1991-06-27 15:51:29 +0000351
352/* Parse a socket address argument according to the socket object's
353 address family. Return 1 if the address was in the proper format,
354 0 of not. The address is returned through addr_ret, its length
355 through len_ret. */
356
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000357static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000358BUILD_FUNC_DEF_4(
Guido van Rossum73624e91994-10-10 17:59:00 +0000359getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000360{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000361 switch (s->sock_family) {
362
Guido van Rossumb6775db1994-08-01 11:34:53 +0000363#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000364 case AF_UNIX:
365 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000366 struct sockaddr_un* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000367 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000368 int len;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000369 addr = (struct sockaddr_un* )&(s->sock_addr).un;
Guido van Rossum73624e91994-10-10 17:59:00 +0000370 if (!PyArg_Parse(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000371 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000372 if (len > sizeof addr->sun_path) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000373 PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000374 return 0;
375 }
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000376 addr->sun_family = AF_UNIX;
377 memcpy(addr->sun_path, path, len);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000378 addr->sun_path[len] = 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000379 *addr_ret = (struct sockaddr *) addr;
Guido van Rossum65af28a1996-06-11 18:36:33 +0000380 *len_ret = len + sizeof(*addr) - sizeof(addr->sun_path);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000381 return 1;
382 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000383#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000384
Guido van Rossum30a685f1991-06-27 15:51:29 +0000385 case AF_INET:
386 {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000387 struct sockaddr_in* addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000388 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000389 int port;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000390 addr=(struct sockaddr_in*)&(s->sock_addr).in;
Guido van Rossum73624e91994-10-10 17:59:00 +0000391 if (!PyArg_Parse(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000392 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000393 if (setipaddr(host, addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000394 return 0;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000395 addr->sin_family = AF_INET;
396 addr->sin_port = htons(port);
397 *addr_ret = (struct sockaddr *) addr;
398 *len_ret = sizeof *addr;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000399 return 1;
400 }
401
Guido van Rossum30a685f1991-06-27 15:51:29 +0000402 /* More cases here... */
403
404 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000405 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum30a685f1991-06-27 15:51:29 +0000406 return 0;
407
408 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000409}
410
Guido van Rossum30a685f1991-06-27 15:51:29 +0000411
Guido van Rossum710e1df1992-06-12 10:39:36 +0000412/* Get the address length according to the socket object's address family.
413 Return 1 if the family is known, 0 otherwise. The length is returned
414 through len_ret. */
415
416static int
Guido van Rossum73624e91994-10-10 17:59:00 +0000417BUILD_FUNC_DEF_2(getsockaddrlen,PySocketSockObject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000418{
419 switch (s->sock_family) {
420
Guido van Rossumb6775db1994-08-01 11:34:53 +0000421#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000422 case AF_UNIX:
423 {
424 *len_ret = sizeof (struct sockaddr_un);
425 return 1;
426 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000427#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000428
429 case AF_INET:
430 {
431 *len_ret = sizeof (struct sockaddr_in);
432 return 1;
433 }
434
435 /* More cases here... */
436
437 default:
Guido van Rossum73624e91994-10-10 17:59:00 +0000438 PyErr_SetString(PySocket_Error, "getsockaddrarg: bad family");
Guido van Rossum710e1df1992-06-12 10:39:36 +0000439 return 0;
440
441 }
442}
443
444
Guido van Rossum30a685f1991-06-27 15:51:29 +0000445/* s.accept() method */
446
Guido van Rossum73624e91994-10-10 17:59:00 +0000447static PyObject *
448BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000449{
450 char addrbuf[256];
451 int addrlen, newfd;
Guido van Rossum73624e91994-10-10 17:59:00 +0000452 PyObject *sock, *addr, *res;
453 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000454 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000455 if (!getsockaddrlen(s, &addrlen))
456 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000457 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000458 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000459 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000460 if (newfd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000461 return PySocket_Err();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000462 /* Create the new object with unspecified family,
463 to avoid calls to bind() etc. on it. */
Guido van Rossum73624e91994-10-10 17:59:00 +0000464 sock = (PyObject *) PySocketSock_New(newfd,
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000465 s->sock_family,
466 s->sock_type,
467 s->sock_proto);
468 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000469 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000470 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000471 res = Py_BuildValue("OO", sock, addr);
472 Py_XDECREF(sock);
473 Py_XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000474 return res;
475}
476
Guido van Rossum30a685f1991-06-27 15:51:29 +0000477
Guido van Rossume4485b01994-09-07 14:32:49 +0000478/* s.setblocking(1 | 0) method */
479
Guido van Rossum73624e91994-10-10 17:59:00 +0000480static PyObject *
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000481BUILD_FUNC_DEF_2(PySocketSock_setblocking,PySocketSockObject*,s,PyObject*,args)
Guido van Rossume4485b01994-09-07 14:32:49 +0000482{
483 int block;
484 int delay_flag;
Guido van Rossum73624e91994-10-10 17:59:00 +0000485 if (!PyArg_GetInt(args, &block))
Guido van Rossume4485b01994-09-07 14:32:49 +0000486 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000487 Py_BEGIN_ALLOW_THREADS
Guido van Rossum55558541996-05-23 22:54:50 +0000488#ifndef _MSC_VER
Guido van Rossume4485b01994-09-07 14:32:49 +0000489 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
490 if (block)
491 delay_flag &= (~O_NDELAY);
492 else
493 delay_flag |= O_NDELAY;
494 fcntl (s->sock_fd, F_SETFL, delay_flag);
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000495#else
496 block = !block;
497 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
498#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000499 Py_END_ALLOW_THREADS
Guido van Rossume4485b01994-09-07 14:32:49 +0000500
Guido van Rossum73624e91994-10-10 17:59:00 +0000501 Py_INCREF(Py_None);
502 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +0000503}
Guido van Rossume4485b01994-09-07 14:32:49 +0000504
505
Guido van Rossumaee08791992-09-08 09:05:33 +0000506/* s.setsockopt() method.
507 With an integer third argument, sets an integer option.
508 With a string third argument, sets an option from a buffer;
509 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000510
Guido van Rossum73624e91994-10-10 17:59:00 +0000511static PyObject *
512BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000513{
514 int level;
515 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000516 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000517 char *buf;
518 int buflen;
519 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000520
Guido van Rossum73624e91994-10-10 17:59:00 +0000521 if (PyArg_Parse(args, "(iii)", &level, &optname, &flag)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000522 buf = (char *) &flag;
523 buflen = sizeof flag;
524 }
525 else {
Guido van Rossum73624e91994-10-10 17:59:00 +0000526 PyErr_Clear();
527 if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen))
Guido van Rossumaee08791992-09-08 09:05:33 +0000528 return NULL;
529 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000530 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000531 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000532 return PySocket_Err();
533 Py_INCREF(Py_None);
534 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000535}
536
537
Guido van Rossumaee08791992-09-08 09:05:33 +0000538/* s.getsockopt() method.
539 With two arguments, retrieves an integer option.
540 With a third integer argument, retrieves a string buffer of that size;
541 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000542
Guido van Rossum73624e91994-10-10 17:59:00 +0000543static PyObject *
544BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000545{
546 int level;
547 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000548 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000549 PyObject *buf;
Guido van Rossumaee08791992-09-08 09:05:33 +0000550 int buflen;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000551
Guido van Rossum73624e91994-10-10 17:59:00 +0000552 if (PyArg_Parse(args, "(ii)", &level, &optname)) {
Guido van Rossumaee08791992-09-08 09:05:33 +0000553 int flag = 0;
554 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000555 res = getsockopt(s->sock_fd, level, optname,
556 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000557 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000558 return PySocket_Err();
559 return PyInt_FromLong(flag);
Guido van Rossumaee08791992-09-08 09:05:33 +0000560 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000561 PyErr_Clear();
562 if (!PyArg_Parse(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000563 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000564 if (buflen <= 0 || buflen > 1024) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000565 PyErr_SetString(PySocket_Error, "getsockopt buflen out of range");
Guido van Rossumaee08791992-09-08 09:05:33 +0000566 return NULL;
567 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000568 buf = PyString_FromStringAndSize((char *)NULL, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000569 if (buf == NULL)
570 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000571 res = getsockopt(s->sock_fd, level, optname,
Guido van Rossuma597dde1995-01-10 20:56:29 +0000572 (ANY *)PyString_AsString(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000573 if (res < 0) {
Guido van Rossum73624e91994-10-10 17:59:00 +0000574 Py_DECREF(buf);
575 return PySocket_Err();
Guido van Rossumaee08791992-09-08 09:05:33 +0000576 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000577 _PyString_Resize(&buf, buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000578 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000579}
580
581
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582/* s.bind(sockaddr) method */
583
Guido van Rossum73624e91994-10-10 17:59:00 +0000584static PyObject *
585BUILD_FUNC_DEF_2(PySocketSock_bind,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000586{
587 struct sockaddr *addr;
588 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000589 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000590 if (!getsockaddrarg(s, args, &addr, &addrlen))
591 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000592 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000593 res = bind(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000594 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000595 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000596 return PySocket_Err();
597 Py_INCREF(Py_None);
598 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000599}
600
Guido van Rossum30a685f1991-06-27 15:51:29 +0000601
602/* s.close() method.
603 Set the file descriptor to -1 so operations tried subsequently
604 will surely fail. */
605
Guido van Rossum73624e91994-10-10 17:59:00 +0000606static PyObject *
607BUILD_FUNC_DEF_2(PySocketSock_close,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000608{
Guido van Rossum73624e91994-10-10 17:59:00 +0000609 if (!PyArg_NoArgs(args))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000610 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000611 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000612 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000613 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000614 s->sock_fd = -1;
Guido van Rossum73624e91994-10-10 17:59:00 +0000615 Py_INCREF(Py_None);
616 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000617}
618
Guido van Rossum30a685f1991-06-27 15:51:29 +0000619
620/* s.connect(sockaddr) method */
621
Guido van Rossum73624e91994-10-10 17:59:00 +0000622static PyObject *
623BUILD_FUNC_DEF_2(PySocketSock_connect,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624{
625 struct sockaddr *addr;
626 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000627 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000628 if (!getsockaddrarg(s, args, &addr, &addrlen))
629 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000630 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000631 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000632 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000633 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000634 return PySocket_Err();
635 Py_INCREF(Py_None);
636 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000637}
638
Guido van Rossum30a685f1991-06-27 15:51:29 +0000639
Guido van Rossumed233a51992-06-23 09:07:03 +0000640/* s.fileno() method */
641
Guido van Rossum73624e91994-10-10 17:59:00 +0000642static PyObject *
643BUILD_FUNC_DEF_2(PySocketSock_fileno,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000644{
Guido van Rossum73624e91994-10-10 17:59:00 +0000645 if (!PyArg_NoArgs(args))
Guido van Rossumed233a51992-06-23 09:07:03 +0000646 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000647 return PyInt_FromLong((long) s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +0000648}
649
650
Guido van Rossumc89705d1992-11-26 08:54:07 +0000651/* s.getsockname() method */
652
Guido van Rossum73624e91994-10-10 17:59:00 +0000653static PyObject *
654BUILD_FUNC_DEF_2(PySocketSock_getsockname,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000655{
656 char addrbuf[256];
657 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000658 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000659 return NULL;
660 if (!getsockaddrlen(s, &addrlen))
661 return NULL;
Guido van Rossumca42b161996-01-12 01:36:05 +0000662 memset(addrbuf, 0, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000663 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000664 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000665 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000666 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000667 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000668 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
669}
670
671
Guido van Rossumb6775db1994-08-01 11:34:53 +0000672#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000673/* s.getpeername() method */
674
Guido van Rossum73624e91994-10-10 17:59:00 +0000675static PyObject *
676BUILD_FUNC_DEF_2(PySocketSock_getpeername,PySocketSockObject *,s, PyObject *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000677{
678 char addrbuf[256];
679 int addrlen, res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000680 if (!PyArg_NoArgs(args))
Guido van Rossumc89705d1992-11-26 08:54:07 +0000681 return NULL;
682 if (!getsockaddrlen(s, &addrlen))
683 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000684 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000685 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000686 Py_END_ALLOW_THREADS
Guido van Rossumc89705d1992-11-26 08:54:07 +0000687 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000688 return PySocket_Err();
Guido van Rossumc89705d1992-11-26 08:54:07 +0000689 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
690}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000691#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000692
693
Guido van Rossum30a685f1991-06-27 15:51:29 +0000694/* s.listen(n) method */
695
Guido van Rossum73624e91994-10-10 17:59:00 +0000696static PyObject *
697BUILD_FUNC_DEF_2(PySocketSock_listen,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000698{
699 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000700 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000701 if (!PyArg_GetInt(args, &backlog))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000703 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000704 if (backlog < 1)
705 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000706 res = listen(s->sock_fd, backlog);
Guido van Rossum73624e91994-10-10 17:59:00 +0000707 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000708 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000709 return PySocket_Err();
710 Py_INCREF(Py_None);
711 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000712}
713
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000714#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715/* s.makefile(mode) method.
716 Create a new open file object referring to a dupped version of
717 the socket's file descriptor. (The dup() call is necessary so
718 that the open file and socket objects may be closed independent
719 of each other.)
720 The mode argument specifies 'r' or 'w' passed to fdopen(). */
721
Guido van Rossum73624e91994-10-10 17:59:00 +0000722static PyObject *
723BUILD_FUNC_DEF_2(PySocketSock_makefile,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000724{
Guido van Rossuma597dde1995-01-10 20:56:29 +0000725 extern int fclose Py_PROTO((FILE *));
Guido van Rossum6b144911995-03-14 15:05:13 +0000726 char *mode = "r";
727 int bufsize = -1;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000728 int fd;
729 FILE *fp;
Guido van Rossum6b144911995-03-14 15:05:13 +0000730 PyObject *f;
731
732 if (!PyArg_ParseTuple(args, "|si", &mode, &bufsize))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000733 return NULL;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000734#ifdef NT
735 if ( ((fd = _open_osfhandle( s->sock_fd, _O_BINARY )) < 0) ||
736 ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL)) {
737#else
Guido van Rossum30a685f1991-06-27 15:51:29 +0000738 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossum6b144911995-03-14 15:05:13 +0000739 (fp = fdopen(fd, mode)) == NULL) {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +0000740#endif
Guido van Rossum6b144911995-03-14 15:05:13 +0000741 if (fd >= 0)
742 close(fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000743 return PySocket_Err();
Guido van Rossum6b144911995-03-14 15:05:13 +0000744 }
745 f = PyFile_FromFile(fp, "<socket>", mode, fclose);
746 if (f != NULL)
747 PyFile_SetBufSize(f, bufsize);
748 return f;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000749}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000750#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000752/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000753
Guido van Rossum73624e91994-10-10 17:59:00 +0000754static PyObject *
755BUILD_FUNC_DEF_2(PySocketSock_recv,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000756{
757 int len, n, flags;
Guido van Rossum73624e91994-10-10 17:59:00 +0000758 PyObject *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000759 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000760 if (!PyArg_Parse(args, "i", &len)) {
761 PyErr_Clear();
762 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000763 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000765 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000766 if (buf == NULL)
767 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000768 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma597dde1995-01-10 20:56:29 +0000769 n = recv(s->sock_fd, PyString_AsString(buf), len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000770 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000771 if (n < 0) {
772 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000773 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000774 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000775 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000776 return NULL;
777 return buf;
778}
779
Guido van Rossum30a685f1991-06-27 15:51:29 +0000780
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000781/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782
Guido van Rossum73624e91994-10-10 17:59:00 +0000783static PyObject *
784BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785{
786 char addrbuf[256];
Guido van Rossum73624e91994-10-10 17:59:00 +0000787 PyObject *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000788 int addrlen, len, n, flags;
789 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000790 if (!PyArg_Parse(args, "i", &len)) {
791 PyErr_Clear();
792 if (!PyArg_Parse(args, "(ii)", &len, &flags))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000793 return NULL;
794 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000795 if (!getsockaddrlen(s, &addrlen))
796 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000797 buf = PyString_FromStringAndSize((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000798 if (buf == NULL)
799 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000800 Py_BEGIN_ALLOW_THREADS
801 n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000802#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000803 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000804#else
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000805 (struct sockaddr *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000806#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000807 Py_END_ALLOW_THREADS
Guido van Rossum7c53b771995-09-13 18:39:47 +0000808 if (n < 0) {
809 Py_DECREF(buf);
Guido van Rossum73624e91994-10-10 17:59:00 +0000810 return PySocket_Err();
Guido van Rossum7c53b771995-09-13 18:39:47 +0000811 }
Guido van Rossum53a9bf81996-06-11 18:35:24 +0000812 if (n != len && _PyString_Resize(&buf, n) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000814 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000815 ret = Py_BuildValue("OO", buf, addr);
816 Py_XDECREF(addr);
817 Py_XDECREF(buf);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000818 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819}
820
Guido van Rossum30a685f1991-06-27 15:51:29 +0000821
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000822/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823
Guido van Rossum73624e91994-10-10 17:59:00 +0000824static PyObject *
825BUILD_FUNC_DEF_2(PySocketSock_send,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000826{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000827 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000828 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000829 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000830 if (!PyArg_Parse(args, "s#", &buf, &len)) {
831 PyErr_Clear();
832 if (!PyArg_Parse(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000834 }
Guido van Rossum73624e91994-10-10 17:59:00 +0000835 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000836 n = send(s->sock_fd, buf, len, flags);
Guido van Rossum73624e91994-10-10 17:59:00 +0000837 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000839 return PySocket_Err();
840 return PyInt_FromLong((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841}
842
843
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000844/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000845
Guido van Rossum73624e91994-10-10 17:59:00 +0000846static PyObject *
847BUILD_FUNC_DEF_2(PySocketSock_sendto,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000848{
Guido van Rossum73624e91994-10-10 17:59:00 +0000849 PyObject *addro;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000850 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000851 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000852 int addrlen, len, n, flags;
853 flags = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +0000854 if (!PyArg_Parse(args, "(s#O)", &buf, &len, &addro)) {
855 PyErr_Clear();
856 if (!PyArg_Parse(args, "(s#iO)", &buf, &len, &flags, &addro))
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000857 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000858 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000859 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000860 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000861 Py_BEGIN_ALLOW_THREADS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000862 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossum73624e91994-10-10 17:59:00 +0000863 Py_END_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000864 if (n < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000865 return PySocket_Err();
866 return PyInt_FromLong((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000867}
868
Guido van Rossum30a685f1991-06-27 15:51:29 +0000869
870/* s.shutdown(how) method */
871
Guido van Rossum73624e91994-10-10 17:59:00 +0000872static PyObject *
873BUILD_FUNC_DEF_2(PySocketSock_shutdown,PySocketSockObject *,s, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874{
875 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000876 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000877 if (!PyArg_GetInt(args, &how))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000878 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000879 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000880 res = shutdown(s->sock_fd, how);
Guido van Rossum73624e91994-10-10 17:59:00 +0000881 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000882 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000883 return PySocket_Err();
884 Py_INCREF(Py_None);
885 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000886}
887
Guido van Rossum30a685f1991-06-27 15:51:29 +0000888
889/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000890
Guido van Rossum73624e91994-10-10 17:59:00 +0000891static PyMethodDef PySocketSock_methods[] = {
892 {"accept", (PyCFunction)PySocketSock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000893#if 0
Guido van Rossum73624e91994-10-10 17:59:00 +0000894 {"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000895#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000896 {"setblocking", (PyCFunction)PySocketSock_setblocking},
Guido van Rossum73624e91994-10-10 17:59:00 +0000897 {"setsockopt", (PyCFunction)PySocketSock_setsockopt},
898 {"getsockopt", (PyCFunction)PySocketSock_getsockopt},
899 {"bind", (PyCFunction)PySocketSock_bind},
900 {"close", (PyCFunction)PySocketSock_close},
901 {"connect", (PyCFunction)PySocketSock_connect},
902 {"fileno", (PyCFunction)PySocketSock_fileno},
903 {"getsockname", (PyCFunction)PySocketSock_getsockname},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000904#ifdef HAVE_GETPEERNAME
Guido van Rossum73624e91994-10-10 17:59:00 +0000905 {"getpeername", (PyCFunction)PySocketSock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000906#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000907 {"listen", (PyCFunction)PySocketSock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000908#ifndef NO_DUP
Guido van Rossum6b144911995-03-14 15:05:13 +0000909 {"makefile", (PyCFunction)PySocketSock_makefile, 1},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000910#endif
Guido van Rossum73624e91994-10-10 17:59:00 +0000911 {"recv", (PyCFunction)PySocketSock_recv},
912 {"recvfrom", (PyCFunction)PySocketSock_recvfrom},
913 {"send", (PyCFunction)PySocketSock_send},
914 {"sendto", (PyCFunction)PySocketSock_sendto},
915 {"shutdown", (PyCFunction)PySocketSock_shutdown},
Guido van Rossumb6775db1994-08-01 11:34:53 +0000916 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000917};
918
Guido van Rossum30a685f1991-06-27 15:51:29 +0000919
Guido van Rossum73624e91994-10-10 17:59:00 +0000920/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +0000921 First close the file description. */
922
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000923static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000924BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000925{
926 (void) close(s->sock_fd);
Guido van Rossum73624e91994-10-10 17:59:00 +0000927 PyMem_DEL(s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000928}
929
Guido van Rossum30a685f1991-06-27 15:51:29 +0000930
931/* Return a socket object's named attribute. */
932
Guido van Rossum73624e91994-10-10 17:59:00 +0000933static PyObject *
934BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000935{
Guido van Rossum73624e91994-10-10 17:59:00 +0000936 return Py_FindMethod(PySocketSock_methods, (PyObject *) s, name);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937}
938
Guido van Rossum30a685f1991-06-27 15:51:29 +0000939
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000940static PyObject *
941BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
942{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000943 char buf[512];
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000944 sprintf(buf,
945 "<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
946 s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
Guido van Rossumdc1c64a1996-02-27 15:21:19 +0000947 return PyString_FromString(buf);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000948}
949
950
Guido van Rossumb6775db1994-08-01 11:34:53 +0000951/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952
Guido van Rossum73624e91994-10-10 17:59:00 +0000953static PyTypeObject PySocketSock_Type = {
Guido van Rossum55558541996-05-23 22:54:50 +0000954 PyObject_HEAD_INIT(0) /* Must fill in type value later */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000955 0,
956 "socket",
Guido van Rossum73624e91994-10-10 17:59:00 +0000957 sizeof(PySocketSockObject),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000958 0,
Guido van Rossum73624e91994-10-10 17:59:00 +0000959 (destructor)PySocketSock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000960 0, /*tp_print*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000961 (getattrfunc)PySocketSock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000962 0, /*tp_setattr*/
963 0, /*tp_compare*/
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000964 (reprfunc)PySocketSock_repr, /*tp_repr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965 0, /*tp_as_number*/
966 0, /*tp_as_sequence*/
967 0, /*tp_as_mapping*/
968};
969
Guido van Rossum30a685f1991-06-27 15:51:29 +0000970
Guido van Rossum81194471991-07-27 21:42:02 +0000971/* Python interface to gethostname(). */
972
973/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000974static PyObject *
975BUILD_FUNC_DEF_2(PySocket_gethostname,PyObject *,self, PyObject *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000976{
977 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000978 int res;
Guido van Rossum73624e91994-10-10 17:59:00 +0000979 if (!PyArg_NoArgs(args))
Guido van Rossum81194471991-07-27 21:42:02 +0000980 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +0000981 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000982 res = gethostname(buf, (int) sizeof buf - 1);
Guido van Rossum73624e91994-10-10 17:59:00 +0000983 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000984 if (res < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +0000985 return PySocket_Err();
Guido van Rossum81194471991-07-27 21:42:02 +0000986 buf[sizeof buf - 1] = '\0';
Guido van Rossum73624e91994-10-10 17:59:00 +0000987 return PyString_FromString(buf);
Guido van Rossum81194471991-07-27 21:42:02 +0000988}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000989
990
Guido van Rossum30a685f1991-06-27 15:51:29 +0000991/* Python interface to gethostbyname(name). */
992
993/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000994static PyObject *
995BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000996{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000997 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000998 struct sockaddr_in addrbuf;
Guido van Rossum73624e91994-10-10 17:59:00 +0000999 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001000 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001001 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001002 return NULL;
1003 return makeipaddr(&addrbuf);
1004}
1005
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001006/* Python interface to gethostbyaddr(IP). */
1007
1008/*ARGSUSED*/
1009static PyObject *
1010BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
1011{
1012 struct sockaddr_in addr;
1013 char *ip_num;
1014 struct hostent *h;
Guido van Rossumdc1c64a1996-02-27 15:21:19 +00001015 char **pch;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001016 PyObject *rtn_tuple = (PyObject *)NULL;
1017 PyObject *name_list = (PyObject *)NULL;
1018 PyObject *addr_list = (PyObject *)NULL;
1019 PyObject *tmp;
1020
1021 if (!PyArg_Parse(args, "s", &ip_num))
1022 return NULL;
1023 if (setipaddr(ip_num, &addr) < 0)
1024 return NULL;
1025 h = gethostbyaddr((char *)&addr.sin_addr,
1026 sizeof(addr.sin_addr),
1027 AF_INET);
1028 if (h == NULL) {
Guido van Rossumca9b3231995-01-10 16:30:54 +00001029#ifdef HAVE_HSTRERROR
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001030 /* Let's get real error message to return */
1031 extern int h_errno;
1032 PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
1033#else
1034 PyErr_SetString(PySocket_Error, "host not found");
1035#endif
1036 return NULL;
1037 }
1038 if ((name_list = PyList_New(0)) == NULL)
1039 goto err;
1040 if ((addr_list = PyList_New(0)) == NULL)
1041 goto err;
1042 for (pch = h->h_aliases; *pch != NULL; pch++) {
1043 tmp = PyString_FromString(*pch);
1044 if (tmp == NULL)
1045 goto err;
1046 PyList_Append(name_list, tmp);
1047 Py_DECREF(tmp);
1048 }
1049 for (pch = h->h_addr_list; *pch != NULL; pch++) {
1050 memcpy((char *) &addr.sin_addr, *pch, h->h_length);
1051 tmp = makeipaddr(&addr);
1052 if (tmp == NULL)
1053 goto err;
1054 PyList_Append(addr_list, tmp);
1055 Py_DECREF(tmp);
1056 }
1057 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
1058 err:
1059 Py_XDECREF(name_list);
1060 Py_XDECREF(addr_list);
1061 return rtn_tuple;
1062}
1063
Guido van Rossum30a685f1991-06-27 15:51:29 +00001064
1065/* Python interface to getservbyname(name).
1066 This only returns the port number, since the other info is already
1067 known or not useful (like the list of aliases). */
1068
1069/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001070static PyObject *
1071BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001072{
Guido van Rossumff4949e1992-08-05 19:58:53 +00001073 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001074 struct servent *sp;
Guido van Rossum73624e91994-10-10 17:59:00 +00001075 if (!PyArg_Parse(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001076 return NULL;
Guido van Rossum73624e91994-10-10 17:59:00 +00001077 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001078 sp = getservbyname(name, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001079 Py_END_ALLOW_THREADS
Guido van Rossum30a685f1991-06-27 15:51:29 +00001080 if (sp == NULL) {
Guido van Rossum73624e91994-10-10 17:59:00 +00001081 PyErr_SetString(PySocket_Error, "service/proto not found");
Guido van Rossum30a685f1991-06-27 15:51:29 +00001082 return NULL;
1083 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001084 return PyInt_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00001085}
1086
1087
1088/* Python interface to socket(family, type, proto).
1089 The third (protocol) argument is optional.
1090 Return a new socket object. */
1091
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001092/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001093static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001094BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001095{
Guido van Rossum73624e91994-10-10 17:59:00 +00001096 PySocketSockObject *s;
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001097#ifdef _MSC_VER
1098 SOCKET fd;
1099#else
1100 int fd;
1101#endif
1102 int family, type, proto;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001103 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001104 if (!PyArg_Parse(args, "(ii)", &family, &type)) {
1105 PyErr_Clear();
1106 if (!PyArg_Parse(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +00001107 return NULL;
1108 }
Guido van Rossum73624e91994-10-10 17:59:00 +00001109 Py_BEGIN_ALLOW_THREADS
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001110 fd = socket(family, type, proto);
Guido van Rossum73624e91994-10-10 17:59:00 +00001111 Py_END_ALLOW_THREADS
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001112#ifdef _MSC_VER
1113 if (fd == INVALID_SOCKET)
1114#else
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001115 if (fd < 0)
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001116#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001117 return PySocket_Err();
1118 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001119 /* If the object can't be created, don't forget to close the
1120 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001121 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001122 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001123 /* From now on, ignore SIGPIPE and let the error checking
1124 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001125#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001126 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001127#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001128 return (PyObject *) s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001129}
1130
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001131#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001132/* Create a socket object from a numeric file description.
1133 Useful e.g. if stdin is a socket.
1134 Additional arguments as for socket(). */
1135
1136/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001137static PyObject *
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001138BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001139{
Guido van Rossum73624e91994-10-10 17:59:00 +00001140 PySocketSockObject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001141 int fd, family, type, proto;
1142 proto = 0;
Guido van Rossum73624e91994-10-10 17:59:00 +00001143 if (!PyArg_Parse(args, "(iii)", &fd, &family, &type)) {
1144 PyErr_Clear();
1145 if (!PyArg_Parse(args, "(iiii)", &fd, &family, &type, &proto))
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001146 return NULL;
1147 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001148 /* Dup the fd so it and the socket can be closed independently */
1149 fd = dup(fd);
1150 if (fd < 0)
Guido van Rossum73624e91994-10-10 17:59:00 +00001151 return PySocket_Err();
1152 s = PySocketSock_New(fd, family, type, proto);
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001153 /* From now on, ignore SIGPIPE and let the error checking
1154 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001155#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001156 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001157#endif
Guido van Rossum73624e91994-10-10 17:59:00 +00001158 return (PyObject *) s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001159}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001160#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001161
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001162static PyObject * PySocket_WSAStartup(self, args)
1163 PyObject *self, *args;
1164{
1165#ifdef _MSC_VER
1166 WSADATA WSAData;
1167 int ret;
1168
1169 if (!PyArg_NoArgs(args))
1170 return NULL;
1171 ret = WSAStartup(0x0101, &WSAData); /* request version 1.1 */
1172 switch(ret){
1173 case WSASYSNOTREADY:
1174 PyErr_SetString(PySocket_Error,
1175 "WSAStartup failed: Network not ready\n");
1176 break;
1177 case WSAVERNOTSUPPORTED:
1178 case WSAEINVAL:
1179 PyErr_SetString(PySocket_Error,
1180 "WSAStartup failed: Requested version not supported");
1181 break;
1182 case 0: /* no error */
1183 break;
1184 default:
1185 PyErr_SetString(PySocket_Error,
1186 "WSAStartup failed");
1187 break;
1188 }
1189#endif
1190 Py_INCREF(Py_None);
1191 return Py_None;
1192}
1193
1194static PyObject * PySocket_WSACleanup(self, args)
1195 PyObject *self, *args;
1196{
1197 if (!PyArg_NoArgs(args))
1198 return NULL;
1199#ifdef _MSC_VER
1200 WSACleanup();
1201#endif
1202 Py_INCREF(Py_None);
1203 return Py_None;
1204}
1205
Guido van Rossum006bf911996-06-12 04:04:55 +00001206static PyObject *
1207BUILD_FUNC_DEF_2(PySocket_ntohs, PyObject *, self, PyObject *, args)
1208{
1209 int x1, x2;
1210
1211 if (!PyArg_Parse(args, "i", &x1)) {
1212 return NULL;
1213 }
1214 x2 = (int)ntohs((short)x1);
1215 return PyInt_FromLong(x2);
1216}
1217
1218static PyObject *
1219BUILD_FUNC_DEF_2(PySocket_ntohl, PyObject *, self, PyObject *, args)
1220{
1221 int x1, x2;
1222
1223 if (!PyArg_Parse(args, "i", &x1)) {
1224 return NULL;
1225 }
1226 x2 = ntohl(x1);
1227 return PyInt_FromLong(x2);
1228}
1229
1230static PyObject *
1231BUILD_FUNC_DEF_2(PySocket_htons, PyObject *, self, PyObject *, args)
1232{
1233 int x1, x2;
1234
1235 if (!PyArg_Parse(args, "i", &x1)) {
1236 return NULL;
1237 }
1238 x2 = (int)htons((short)x1);
1239 return PyInt_FromLong(x2);
1240}
1241
1242static PyObject *
1243BUILD_FUNC_DEF_2(PySocket_htonl, PyObject *, self, PyObject *, args)
1244{
1245 int x1, x2;
1246
1247 if (!PyArg_Parse(args, "i", &x1)) {
1248 return NULL;
1249 }
1250 x2 = htonl(x1);
1251 return PyInt_FromLong(x2);
1252}
1253
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254/* List of functions exported by this module. */
1255
Guido van Rossum73624e91994-10-10 17:59:00 +00001256static PyMethodDef PySocket_methods[] = {
1257 {"gethostbyname", PySocket_gethostbyname},
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001258 {"gethostbyaddr", PySocket_gethostbyaddr},
Guido van Rossum73624e91994-10-10 17:59:00 +00001259 {"gethostname", PySocket_gethostname},
1260 {"getservbyname", PySocket_getservbyname},
1261 {"socket", PySocket_socket},
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001262 {"WSAStartup", PySocket_WSAStartup},
1263 {"WSACleanup", PySocket_WSACleanup},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001264#ifndef NO_DUP
Guido van Rossum73624e91994-10-10 17:59:00 +00001265 {"fromfd", PySocket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001266#endif
Guido van Rossum006bf911996-06-12 04:04:55 +00001267 {"ntohs", PySocket_ntohs},
1268 {"ntohl", PySocket_ntohl},
1269 {"htons", PySocket_htons},
1270 {"htonl", PySocket_htonl},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001271 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001272};
1273
Guido van Rossum30a685f1991-06-27 15:51:29 +00001274
1275/* Convenience routine to export an integer value.
1276 For simplicity, errors (which are unlikely anyway) are ignored. */
1277
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001278static void
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00001279BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001280{
Guido van Rossum73624e91994-10-10 17:59:00 +00001281 PyObject *v = PyInt_FromLong((long) value);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001282 if (v == NULL) {
1283 /* Don't bother reporting this error */
Guido van Rossum73624e91994-10-10 17:59:00 +00001284 PyErr_Clear();
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001285 }
1286 else {
Guido van Rossum73624e91994-10-10 17:59:00 +00001287 PyDict_SetItemString(d, name, v);
1288 Py_DECREF(v);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001289 }
1290}
1291
Guido van Rossum30a685f1991-06-27 15:51:29 +00001292
1293/* Initialize this module.
1294 This is called when the first 'import socket' is done,
1295 via a table in config.c, if config.c is compiled with USE_SOCKET
1296 defined. */
1297
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001298void
1299initsocket()
1300{
Guido van Rossum73624e91994-10-10 17:59:00 +00001301 PyObject *m, *d;
1302 m = Py_InitModule("socket", PySocket_methods);
1303 d = PyModule_GetDict(m);
1304 PySocket_Error = PyString_FromString("socket.error");
1305 if (PySocket_Error == NULL ||
1306 PyDict_SetItemString(d, "error", PySocket_Error) != 0)
1307 Py_FatalError("can't define socket.error");
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001308 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001309#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001310 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001311#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001312 insint(d, "SOCK_STREAM", SOCK_STREAM);
1313 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1314 insint(d, "SOCK_RAW", SOCK_RAW);
1315 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1316 insint(d, "SOCK_RDM", SOCK_RDM);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001317
1318#ifdef SO_DEBUG
1319 insint(d, "SO_DEBUG", SO_DEBUG);
1320#endif
1321#ifdef SO_ACCEPTCONN
1322 insint(d, "SO_ACCEPTCONN", SO_ACCEPTCONN);
1323#endif
1324#ifdef SO_REUSEADDR
1325 insint(d, "SO_REUSEADDR", SO_REUSEADDR);
1326#endif
1327#ifdef SO_KEEPALIVE
1328 insint(d, "SO_KEEPALIVE", SO_KEEPALIVE);
1329#endif
1330#ifdef SO_DONTROUTE
1331 insint(d, "SO_DONTROUTE", SO_DONTROUTE);
1332#endif
1333#ifdef SO_BROADCAST
1334 insint(d, "SO_BROADCAST", SO_BROADCAST);
1335#endif
1336#ifdef SO_USELOOPBACK
1337 insint(d, "SO_USELOOPBACK", SO_USELOOPBACK);
1338#endif
1339#ifdef SO_LINGER
1340 insint(d, "SO_LINGER", SO_LINGER);
1341#endif
1342#ifdef SO_OOBINLINE
1343 insint(d, "SO_OOBINLINE", SO_OOBINLINE);
1344#endif
1345#ifdef SO_REUSEPORT
1346 insint(d, "SO_REUSEPORT", SO_REUSEPORT);
1347#endif
1348
1349#ifdef SO_SNDBUF
1350 insint(d, "SO_SNDBUF", SO_SNDBUF);
1351#endif
1352#ifdef SO_RCVBUF
1353 insint(d, "SO_RCVBUF", SO_RCVBUF);
1354#endif
1355#ifdef SO_SNDLOWAT
1356 insint(d, "SO_SNDLOWAT", SO_SNDLOWAT);
1357#endif
1358#ifdef SO_RCVLOWAT
1359 insint(d, "SO_RCVLOWAT", SO_RCVLOWAT);
1360#endif
1361#ifdef SO_SNDTIMEO
1362 insint(d, "SO_SNDTIMEO", SO_SNDTIMEO);
1363#endif
1364#ifdef SO_RCVTIMEO
1365 insint(d, "SO_RCVTIMEO", SO_RCVTIMEO);
1366#endif
1367#ifdef SO_ERROR
1368 insint(d, "SO_ERROR", SO_ERROR);
1369#endif
1370#ifdef SO_TYPE
1371 insint(d, "SO_TYPE", SO_TYPE);
1372#endif
1373
1374 /* Maximum number of connections for "listen" */
1375#ifdef SOMAXCONN
1376 insint(d, "SOMAXCONN", SOMAXCONN);
1377#else
1378 insint(d, "SOMAXCONN", 5); /* Common value */
1379#endif
1380
1381 /* Flags for send, recv */
1382#ifdef MSG_OOB
1383 insint(d, "MSG_OOB", MSG_OOB);
1384#endif
1385#ifdef MSG_PEEK
1386 insint(d, "MSG_PEEK", MSG_PEEK);
1387#endif
1388#ifdef MSG_DONTROUTE
1389 insint(d, "MSG_DONTROUTE", MSG_DONTROUTE);
1390#endif
1391#ifdef MSG_EOR
1392 insint(d, "MSG_EOR", MSG_EOR);
1393#endif
1394#ifdef MSG_TRUNC
1395 insint(d, "MSG_TRUNC", MSG_TRUNC);
1396#endif
1397#ifdef MSG_CTRUNC
1398 insint(d, "MSG_CTRUNC", MSG_CTRUNC);
1399#endif
1400#ifdef MSG_WAITALL
1401 insint(d, "MSG_WAITALL", MSG_WAITALL);
1402#endif
1403#ifdef MSG_BTAG
1404 insint(d, "MSG_BTAG", MSG_BTAG);
1405#endif
1406#ifdef MSG_ETAG
1407 insint(d, "MSG_ETAG", MSG_ETAG);
1408#endif
1409
1410 /* Protocol level and numbers, usable for [gs]etsockopt */
1411#ifdef SOL_SOCKET
1412 insint(d, "SOL_SOCKET", SOL_SOCKET);
1413#endif
1414#ifdef IPPROTO_IP
1415 insint(d, "IPPROTO_IP", IPPROTO_IP);
1416#endif
1417#ifdef IPPROTO_ICMP
1418 insint(d, "IPPROTO_ICMP", IPPROTO_ICMP);
1419#endif
1420#ifdef IPPROTO_IGMP
1421 insint(d, "IPPROTO_IGMP", IPPROTO_IGMP);
1422#endif
1423#ifdef IPPROTO_GGP
1424 insint(d, "IPPROTO_GGP", IPPROTO_GGP);
1425#endif
1426#ifdef IPPROTO_TCP
1427 insint(d, "IPPROTO_TCP", IPPROTO_TCP);
1428#endif
1429#ifdef IPPROTO_EGP
1430 insint(d, "IPPROTO_EGP", IPPROTO_EGP);
1431#endif
1432#ifdef IPPROTO_PUP
1433 insint(d, "IPPROTO_PUP", IPPROTO_PUP);
1434#endif
1435#ifdef IPPROTO_UDP
1436 insint(d, "IPPROTO_UDP", IPPROTO_UDP);
1437#endif
1438#ifdef IPPROTO_IDP
1439 insint(d, "IPPROTO_IDP", IPPROTO_IDP);
1440#endif
1441#ifdef IPPROTO_HELLO
1442 insint(d, "IPPROTO_HELLO", IPPROTO_HELLO);
1443#endif
1444#ifdef IPPROTO_ND
1445 insint(d, "IPPROTO_ND", IPPROTO_ND);
1446#endif
1447#ifdef IPPROTO_TP
1448 insint(d, "IPPROTO_TP", IPPROTO_TP);
1449#endif
1450#ifdef IPPROTO_XTP
1451 insint(d, "IPPROTO_XTP", IPPROTO_XTP);
1452#endif
1453#ifdef IPPROTO_EON
1454 insint(d, "IPPROTO_EON", IPPROTO_EON);
1455#endif
1456#ifdef IPPROTO_BIP
1457 insint(d, "IPPROTO_BIP", IPPROTO_BIP);
1458#endif
1459/**/
1460#ifdef IPPROTO_RAW
1461 insint(d, "IPPROTO_RAW", IPPROTO_RAW);
1462#endif
1463#ifdef IPPROTO_MAX
1464 insint(d, "IPPROTO_MAX", IPPROTO_MAX);
1465#endif
1466
1467 /* Some port configuration */
1468#ifdef IPPORT_RESERVED
1469 insint(d, "IPPORT_RESERVED", IPPORT_RESERVED);
1470#else
1471 insint(d, "IPPORT_RESERVED", 1024);
1472#endif
1473#ifdef IPPORT_USERRESERVED
1474 insint(d, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);
1475#else
1476 insint(d, "IPPORT_USERRESERVED", 5000);
1477#endif
1478
Guido van Rossum5f05eb41995-02-17 15:11:07 +00001479 /* Some reserved IP v.4 addresses */
1480#ifdef INADDR_ANY
1481 insint(d, "INADDR_ANY", INADDR_ANY);
1482#else
1483 insint(d, "INADDR_ANY", 0x00000000);
1484#endif
1485#ifdef INADDR_BROADCAST
1486 insint(d, "INADDR_BROADCAST", INADDR_BROADCAST);
1487#else
1488 insint(d, "INADDR_BROADCAST", 0xffffffff);
1489#endif
1490#ifdef INADDR_LOOPBACK
1491 insint(d, "INADDR_LOOPBACK", INADDR_LOOPBACK);
1492#else
1493 insint(d, "INADDR_LOOPBACK", 0x7F000001);
1494#endif
1495#ifdef INADDR_UNSPEC_GROUP
1496 insint(d, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);
1497#else
1498 insint(d, "INADDR_UNSPEC_GROUP", 0xe0000000);
1499#endif
1500#ifdef INADDR_ALLHOSTS_GROUP
1501 insint(d, "INADDR_ALLHOSTS_GROUP", INADDR_ALLHOSTS_GROUP);
1502#else
1503 insint(d, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
1504#endif
1505#ifdef INADDR_MAX_LOCAL_GROUP
1506 insint(d, "INADDR_MAX_LOCAL_GROUP", INADDR_MAX_LOCAL_GROUP);
1507#else
1508 insint(d, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
1509#endif
1510#ifdef INADDR_NONE
1511 insint(d, "INADDR_NONE", INADDR_NONE);
1512#else
1513 insint(d, "INADDR_NONE", 0xffffffff);
1514#endif
1515
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00001516 /* IP [gs]etsockopt options */
1517#ifdef IP_OPTIONS
1518 insint(d, "IP_OPTIONS", IP_OPTIONS);
1519#endif
1520#ifdef IP_HDRINCL
1521 insint(d, "IP_HDRINCL", IP_HDRINCL);
1522#endif
1523#ifdef IP_TOS
1524 insint(d, "IP_TOS", IP_TOS);
1525#endif
1526#ifdef IP_TTL
1527 insint(d, "IP_TTL", IP_TTL);
1528#endif
1529#ifdef IP_RECVOPTS
1530 insint(d, "IP_RECVOPTS", IP_RECVOPTS);
1531#endif
1532#ifdef IP_RECVRETOPTS
1533 insint(d, "IP_RECVRETOPTS", IP_RECVRETOPTS);
1534#endif
1535#ifdef IP_RECVDSTADDR
1536 insint(d, "IP_RECVDSTADDR", IP_RECVDSTADDR);
1537#endif
1538#ifdef IP_RETOPTS
1539 insint(d, "IP_RETOPTS", IP_RETOPTS);
1540#endif
1541#ifdef IP_MULTICAST_IF
1542 insint(d, "IP_MULTICAST_IF", IP_MULTICAST_IF);
1543#endif
1544#ifdef IP_MULTICAST_TTL
1545 insint(d, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);
1546#endif
1547#ifdef IP_MULTICAST_LOOP
1548 insint(d, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);
1549#endif
1550#ifdef IP_ADD_MEMBERSHIP
1551 insint(d, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);
1552#endif
1553#ifdef IP_DROP_MEMBERSHIP
1554 insint(d, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);
1555#endif
Guido van Rossum55558541996-05-23 22:54:50 +00001556
1557#ifdef MS_WIN16
1558/* All windows sockets require a successful WSAStartup() before use */
Guido van Rossumd639d4d1996-06-12 04:04:22 +00001559 Py_XDECREF(PySocket_WSAStartup(NULL, NULL));
Guido van Rossum55558541996-05-23 22:54:50 +00001560#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001561}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001562
1563#ifdef NT
1564BOOL WINAPI DllMain (HANDLE hInst,
1565 ULONG ul_reason_for_call,
1566 LPVOID lpReserved)
1567{
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001568 const int opt = SO_SYNCHRONOUS_NONALERT;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001569 switch (ul_reason_for_call)
1570 {
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001571 case DLL_PROCESS_ATTACH: {
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001572 WSADATA WSAData;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001573 BOOL ok = TRUE;
1574 char buf[100] = "Python can't initialize Windows Sockets Module!\n\r";
1575 if (WSAStartup(MAKEWORD(1,1), &WSAData)) {
1576 wsprintf(buf+strlen(buf), "WSAStartup failed (%d)",WSAGetLastError());
1577 ok = FALSE;
1578 }
1579 /*
1580 ** Setup sockets in non-overlapped mode by default
1581 */
Guido van Rossum55558541996-05-23 22:54:50 +00001582// if (ok && setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(const char *)&opt,sizeof(opt)) != 0) {
1583// wsprintf(buf+strlen(buf),"setsockopt failed (%d)",WSAGetLastError());
1584// ok = FALSE;
1585// }
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001586 if (!ok) {
1587 MessageBox(NULL,buf,"WinSock Error",MB_OK|MB_SETFOREGROUND);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001588 return FALSE;
1589 }
1590 break;
Guido van Rossum30b6b2b1995-06-14 22:28:08 +00001591 }
1592
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001593 case DLL_PROCESS_DETACH:
1594 WSACleanup();
1595 break;
1596
1597 }
1598 return TRUE;
1599}
1600#endif /* NT */