blob: 82250ee242159a258c2e5d79a6d941b0979dc9b6 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossumb6775db1994-08-01 11:34:53 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossume5372401993-03-16 12:15:04 +00003Amsterdam, The 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 Rossumb6775db1994-08-01 11:34:53 +000033- no asynchronous I/O (but you can use select() on sockets)
Guido van Rossum81194471991-07-27 21:42:02 +000034- no read/write operations (use send/recv or makefile instead)
Guido van Rossum0e69587d1992-06-05 15:11:30 +000035- setsockopt() and getsockopt() only support integer options
Guido van Rossum6574b3e1991-06-25 21:36:08 +000036
37Interface:
38
Guido van Rossum81194471991-07-27 21:42:02 +000039- socket.gethostname() --> host name (string)
Guido van Rossum30a685f1991-06-27 15:51:29 +000040- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000041- socket.getservbyname(servername, protocolname) --> port number
42- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000043- family and type constants from <socket.h> are accessed as socket.AF_INET etc.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044- errors are reported as the exception socket.error
45- an Internet socket address is a pair (hostname, port)
46 where hostname can be anything recognized by gethostbyname()
47 (including the dd.dd.dd.dd notation) and port is in host byte order
48- where a hostname is returned, the dd.dd.dd.dd notation is used
49- a UNIX domain socket is a string specifying the pathname
50
Guido van Rossum30a685f1991-06-27 15:51:29 +000051Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000052
Guido van Rossum81194471991-07-27 21:42:02 +000053- s.accept() --> new socket object, sockaddr
Guido van Rossum0e69587d1992-06-05 15:11:30 +000054- s.setsockopt(level, optname, flag) --> None
55- s.getsockopt(level, optname) --> flag
Guido van Rossum30a685f1991-06-27 15:51:29 +000056- s.bind(sockaddr) --> None
57- s.connect(sockaddr) --> None
Guido van Rossumc89705d1992-11-26 08:54:07 +000058- s.getsockname() --> sockaddr
59- s.getpeername() --> sockaddr
Guido van Rossum30a685f1991-06-27 15:51:29 +000060- s.listen(n) --> None
61- s.makefile(mode) --> file object
Guido van Rossumeb6b33a1993-05-25 09:38:27 +000062- s.recv(nbytes [,flags]) --> string
Guido van Rossum18c9a4f1993-05-25 12:16:29 +000063- s.recvfrom(nbytes [,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 Rossume4485b01994-09-07 14:32:49 +000066- s.setblocking(1 | 0) --> None
Guido van Rossum30a685f1991-06-27 15:51:29 +000067- s.shutdown(how) --> None
68- s.close() --> None
69
Guido van Rossum6574b3e1991-06-25 21:36:08 +000070*/
71
72#include "allobjects.h"
73#include "modsupport.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000074#include "ceval.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000075
Guido van Rossumb6775db1994-08-01 11:34:53 +000076#include <sys/types.h>
77#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000078
Guido van Rossum81194471991-07-27 21:42:02 +000079#include <signal.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000080#ifndef NT
Guido van Rossumb6775db1994-08-01 11:34:53 +000081#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000082#include <sys/socket.h>
83#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +000084#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000085#else
86#include <winsock.h>
87#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 Rossum6a3eb5f1994-08-18 15:42:46 +000094/* Here we have some hacks to choose between K&R or ANSI style function
95 definitions. For NT to build this as an extension module (ie, DLL)
96 it must be compiled by the C++ compiler, as it takes the address of
97 a static data item exported from the main Python DLL.
98*/
99#ifdef NT
100/* seem to be a few differences in the API */
101#define close closesocket
102#define NO_DUP /* I wont trust passing a socket to NT's RTL!! */
103#define FORCE_ANSI_FUNC_DEFS
104#endif
105
106#ifdef FORCE_ANSI_FUNC_DEFS
107#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
108fnname( arg1type arg1name )
109
110#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
111fnname( arg1type arg1name, arg2type arg2name )
112
113#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
114fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
115
116#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
117fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
118
119#else /* !FORCE_ANSI_FN_DEFS */
120#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
121fnname( arg1name ) \
122 arg1type arg1name;
123
124#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
125fnname( arg1name, arg2name ) \
126 arg1type arg1name; \
127 arg2type arg2name;
128
129#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
130fnname( arg1name, arg2name, arg3name ) \
131 arg1type arg1name; \
132 arg2type arg2name; \
133 arg3type arg3name;
134
135#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
136fnname( arg1name, arg2name, arg3name, arg4name ) \
137 arg1type arg1name; \
138 arg2type arg2name; \
139 arg3type arg3name; \
140 arg4type arg4name;
141
142#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000143
144/* Global variable holding the exception type for errors detected
145 by this module (but not argument type or memory errors, etc.). */
146
147static object *SocketError;
148
149
150/* Convenience function to raise an error according to errno
151 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000152
153static object *
154socket_error()
155{
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000156#ifdef NT
157 if (WSAGetLastError()) {
158 object *v;
159 v = mkvalue("(is)", WSAGetLastError(), "winsock error");
160 if (v != NULL) {
161 err_setval(SocketError, v);
162 DECREF(v);
163 }
164 return NULL;
165 }
166 else
167#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000168 return err_errno(SocketError);
169}
170
Guido van Rossum30a685f1991-06-27 15:51:29 +0000171
172/* The object holding a socket. It holds some extra information,
173 like the address family, which is used to decode socket address
174 arguments properly. */
175
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000176typedef struct {
177 OB_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000178 int sock_fd; /* Socket file descriptor */
179 int sock_family; /* Address family, e.g., AF_INET */
180 int sock_type; /* Socket type, e.g., SOCK_STREAM */
181 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000182} sockobject;
183
Guido van Rossum30a685f1991-06-27 15:51:29 +0000184
185/* A forward reference to the Socktype type object.
186 The Socktype variable contains pointers to various functions,
187 some of which call newsocobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000188 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000189
Guido van Rossumb6775db1994-08-01 11:34:53 +0000190staticforward typeobject Socktype;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000191
Guido van Rossum30a685f1991-06-27 15:51:29 +0000192
193/* Create a new socket object.
194 This just creates the object and initializes it.
195 If the creation fails, return NULL and set an exception (implicit
196 in NEWOBJ()). */
197
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000198static sockobject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000199BUILD_FUNC_DEF_4(newsockobject, int, fd, int, family, int, type, int, proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000200{
201 sockobject *s;
202 s = NEWOBJ(sockobject, &Socktype);
203 if (s != NULL) {
204 s->sock_fd = fd;
205 s->sock_family = family;
206 s->sock_type = type;
207 s->sock_proto = proto;
208 }
209 return s;
210}
211
Guido van Rossum30a685f1991-06-27 15:51:29 +0000212
213/* Convert a string specifying a host name or one of a few symbolic
214 names to a numeric IP address. This usually calls gethostbyname()
215 to do the work; the names "" and "<broadcast>" are special.
216 Return the length (should always be 4 bytes), or negative if
217 an error occurred; then an exception is raised. */
218
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000219static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000220BUILD_FUNC_DEF_2(setipaddr, char*, name, struct sockaddr_in *, addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000221{
222 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000223 int d1, d2, d3, d4;
224 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000225
Guido van Rossum30a685f1991-06-27 15:51:29 +0000226 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000227 addr_ret->sin_addr.s_addr = INADDR_ANY;
228 return 4;
229 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000230 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000231 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
232 return 4;
233 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000234 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
235 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
236 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
237 addr_ret->sin_addr.s_addr = htonl(
238 ((long) d1 << 24) | ((long) d2 << 16) |
239 ((long) d3 << 8) | ((long) d4 << 0));
240 return 4;
241 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000242 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000243 hp = gethostbyname(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000244 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000245 if (hp == NULL) {
246 err_setstr(SocketError, "host not found");
247 return -1;
248 }
249 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
250 return hp->h_length;
251}
252
Guido van Rossum30a685f1991-06-27 15:51:29 +0000253
Guido van Rossum30a685f1991-06-27 15:51:29 +0000254/* Create a string object representing an IP address.
255 This is always a string of the form 'dd.dd.dd.dd' (with variable
256 size numbers). */
257
258static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000259BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000260{
261 long x = ntohl(addr->sin_addr.s_addr);
262 char buf[100];
263 sprintf(buf, "%d.%d.%d.%d",
264 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
265 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
266 return newstringobject(buf);
267}
268
269
270/* Create an object representing the given socket address,
271 suitable for passing it back to bind(), connect() etc.
272 The family field of the sockaddr structure is inspected
273 to determine what kind of address it really is. */
274
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000275/*ARGSUSED*/
276static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000277BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *, addr, int, addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000278{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000279 if (addrlen == 0) {
280 /* No address -- may be recvfrom() from known socket */
281 INCREF(None);
282 return None;
283 }
284
Guido van Rossum30a685f1991-06-27 15:51:29 +0000285 switch (addr->sa_family) {
286
287 case AF_INET:
288 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000289 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000290 object *addr = makeipaddr(a);
291 object *ret = mkvalue("Oi", addr, ntohs(a->sin_port));
292 XDECREF(addr);
293 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000294 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000295
Guido van Rossumb6775db1994-08-01 11:34:53 +0000296#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000297 case AF_UNIX:
298 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000299 struct sockaddr_un *a = (struct sockaddr_un *) addr;
300 return newstringobject(a->sun_path);
301 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000302#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000303
304 /* More cases here... */
305
306 default:
307 err_setstr(SocketError, "return unknown socket address type");
308 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000309
Guido van Rossum30a685f1991-06-27 15:51:29 +0000310 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000311}
312
Guido van Rossum30a685f1991-06-27 15:51:29 +0000313
314/* Parse a socket address argument according to the socket object's
315 address family. Return 1 if the address was in the proper format,
316 0 of not. The address is returned through addr_ret, its length
317 through len_ret. */
318
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000319static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000320BUILD_FUNC_DEF_4(
321getsockaddrarg,sockobject *,s, object *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000322{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000323 switch (s->sock_family) {
324
Guido van Rossumb6775db1994-08-01 11:34:53 +0000325#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000326 case AF_UNIX:
327 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000328 static struct sockaddr_un addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000329 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000330 int len;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000331 if (!getargs(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000332 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000333 if (len > sizeof addr.sun_path) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000334 err_setstr(SocketError, "AF_UNIX path too long");
335 return 0;
336 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000337 addr.sun_family = AF_UNIX;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000338 memcpy(addr.sun_path, path, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000339 *addr_ret = (struct sockaddr *) &addr;
340 *len_ret = len + sizeof addr.sun_family;
341 return 1;
342 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000343#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000344
Guido van Rossum30a685f1991-06-27 15:51:29 +0000345 case AF_INET:
346 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000347 static struct sockaddr_in addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000348 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349 int port;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000350 if (!getargs(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000351 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000352 if (setipaddr(host, &addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000353 return 0;
354 addr.sin_family = AF_INET;
355 addr.sin_port = htons(port);
356 *addr_ret = (struct sockaddr *) &addr;
357 *len_ret = sizeof addr;
358 return 1;
359 }
360
Guido van Rossum30a685f1991-06-27 15:51:29 +0000361 /* More cases here... */
362
363 default:
364 err_setstr(SocketError, "getsockaddrarg: bad family");
365 return 0;
366
367 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000368}
369
Guido van Rossum30a685f1991-06-27 15:51:29 +0000370
Guido van Rossum710e1df1992-06-12 10:39:36 +0000371/* Get the address length according to the socket object's address family.
372 Return 1 if the family is known, 0 otherwise. The length is returned
373 through len_ret. */
374
375static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000376BUILD_FUNC_DEF_2(getsockaddrlen,sockobject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000377{
378 switch (s->sock_family) {
379
Guido van Rossumb6775db1994-08-01 11:34:53 +0000380#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000381 case AF_UNIX:
382 {
383 *len_ret = sizeof (struct sockaddr_un);
384 return 1;
385 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000386#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000387
388 case AF_INET:
389 {
390 *len_ret = sizeof (struct sockaddr_in);
391 return 1;
392 }
393
394 /* More cases here... */
395
396 default:
397 err_setstr(SocketError, "getsockaddrarg: bad family");
398 return 0;
399
400 }
401}
402
403
Guido van Rossum30a685f1991-06-27 15:51:29 +0000404/* s.accept() method */
405
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000406static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000407BUILD_FUNC_DEF_2(sock_accept,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000408{
409 char addrbuf[256];
410 int addrlen, newfd;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000411 object *sock, *addr, *res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000412 if (!getnoarg(args))
413 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000414 if (!getsockaddrlen(s, &addrlen))
415 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000416 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000417 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000418 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000419 if (newfd < 0)
420 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000421 /* Create the new object with unspecified family,
422 to avoid calls to bind() etc. on it. */
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000423 sock = (object *) newsockobject(newfd,
424 s->sock_family,
425 s->sock_type,
426 s->sock_proto);
427 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000428 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000429 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
430 res = mkvalue("OO", sock, addr);
431 XDECREF(sock);
432 XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000433 return res;
434}
435
Guido van Rossum30a685f1991-06-27 15:51:29 +0000436
Guido van Rossumc65a5251994-08-05 13:44:50 +0000437#if 0
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000438/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000439/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000440
441static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000442BUILD_FUNC_DEF_2(sock_allowbroadcast,sockobject *,s, object *,args)
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000443{
444 int flag;
445 int res;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000446 if (!getargs(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000447 return NULL;
448 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000449 (ANY *)&flag, sizeof flag);
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000450 if (res < 0)
451 return socket_error();
452 INCREF(None);
453 return None;
454}
Guido van Rossumc65a5251994-08-05 13:44:50 +0000455#endif
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000456
457
Guido van Rossume4485b01994-09-07 14:32:49 +0000458#ifndef NT
459
460/* s.setblocking(1 | 0) method */
461
462static object *
463sock_setblocking(s, args)
464 sockobject *s;
465 object *args;
466{
467 int block;
468 int delay_flag;
469 if (!getintarg(args, &block))
470 return NULL;
471 BGN_SAVE
472 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
473 if (block)
474 delay_flag &= (~O_NDELAY);
475 else
476 delay_flag |= O_NDELAY;
477 fcntl (s->sock_fd, F_SETFL, delay_flag);
478 END_SAVE
479
480 INCREF(None);
481 return None;
482}
483#endif
484
485
Guido van Rossumaee08791992-09-08 09:05:33 +0000486/* s.setsockopt() method.
487 With an integer third argument, sets an integer option.
488 With a string third argument, sets an option from a buffer;
489 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000490
491static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000492BUILD_FUNC_DEF_2(sock_setsockopt,sockobject *,s, object *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000493{
494 int level;
495 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000496 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000497 char *buf;
498 int buflen;
499 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000500
Guido van Rossumaee08791992-09-08 09:05:33 +0000501 if (getargs(args, "(iii)", &level, &optname, &flag)) {
502 buf = (char *) &flag;
503 buflen = sizeof flag;
504 }
505 else {
506 err_clear();
507 if (!getargs(args, "(iis#)", &level, &optname, &buf, &buflen))
508 return NULL;
509 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000510 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000511 if (res < 0)
512 return socket_error();
513 INCREF(None);
514 return None;
515}
516
517
Guido van Rossumaee08791992-09-08 09:05:33 +0000518/* s.getsockopt() method.
519 With two arguments, retrieves an integer option.
520 With a third integer argument, retrieves a string buffer of that size;
521 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000522
523static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000524BUILD_FUNC_DEF_2(sock_getsockopt,sockobject *,s, object *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000525{
526 int level;
527 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000528 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000529 object *buf;
530 int buflen;
531 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000532
Guido van Rossumaee08791992-09-08 09:05:33 +0000533 if (getargs(args, "(ii)", &level, &optname)) {
534 int flag = 0;
535 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000536 res = getsockopt(s->sock_fd, level, optname,
537 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000538 if (res < 0)
539 return socket_error();
540 return newintobject(flag);
541 }
542 err_clear();
543 if (!getargs(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000544 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000545 if (buflen <= 0 || buflen > 1024) {
546 err_setstr(SocketError, "getsockopt buflen out of range");
547 return NULL;
548 }
549 buf = newsizedstringobject((char *)NULL, buflen);
550 if (buf == NULL)
551 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000552 res = getsockopt(s->sock_fd, level, optname,
553 (ANY *)getstringvalue(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000554 if (res < 0) {
555 DECREF(buf);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000556 return socket_error();
Guido van Rossumaee08791992-09-08 09:05:33 +0000557 }
558 resizestring(&buf, buflen);
559 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000560}
561
562
Guido van Rossum30a685f1991-06-27 15:51:29 +0000563/* s.bind(sockaddr) method */
564
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000566BUILD_FUNC_DEF_2(sock_bind,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000567{
568 struct sockaddr *addr;
569 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000570 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000571 if (!getsockaddrarg(s, args, &addr, &addrlen))
572 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000573 BGN_SAVE
574 res = bind(s->sock_fd, addr, addrlen);
575 END_SAVE
576 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577 return socket_error();
578 INCREF(None);
579 return None;
580}
581
Guido van Rossum30a685f1991-06-27 15:51:29 +0000582
583/* s.close() method.
584 Set the file descriptor to -1 so operations tried subsequently
585 will surely fail. */
586
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000587static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000588BUILD_FUNC_DEF_2(sock_close,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000589{
590 if (!getnoarg(args))
591 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000592 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593 (void) close(s->sock_fd);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000594 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000595 s->sock_fd = -1;
596 INCREF(None);
597 return None;
598}
599
Guido van Rossum30a685f1991-06-27 15:51:29 +0000600
601/* s.connect(sockaddr) method */
602
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000603static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000604BUILD_FUNC_DEF_2(sock_connect,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000605{
606 struct sockaddr *addr;
607 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000608 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000609 if (!getsockaddrarg(s, args, &addr, &addrlen))
610 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000611 BGN_SAVE
612 res = connect(s->sock_fd, addr, addrlen);
613 END_SAVE
614 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000615 return socket_error();
616 INCREF(None);
617 return None;
618}
619
Guido van Rossum30a685f1991-06-27 15:51:29 +0000620
Guido van Rossumed233a51992-06-23 09:07:03 +0000621/* s.fileno() method */
622
623static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000624BUILD_FUNC_DEF_2(sock_fileno,sockobject *,s, object *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000625{
626 if (!getnoarg(args))
627 return NULL;
628 return newintobject((long) s->sock_fd);
629}
630
631
Guido van Rossumc89705d1992-11-26 08:54:07 +0000632/* s.getsockname() method */
633
634static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000635BUILD_FUNC_DEF_2(sock_getsockname,sockobject *,s, object *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000636{
637 char addrbuf[256];
638 int addrlen, res;
639 if (!getnoarg(args))
640 return NULL;
641 if (!getsockaddrlen(s, &addrlen))
642 return NULL;
643 BGN_SAVE
644 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
645 END_SAVE
646 if (res < 0)
647 return socket_error();
648 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
649}
650
651
Guido van Rossumb6775db1994-08-01 11:34:53 +0000652#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000653/* s.getpeername() method */
654
655static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000656BUILD_FUNC_DEF_2(sock_getpeername,sockobject *,s, object *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000657{
658 char addrbuf[256];
659 int addrlen, res;
660 if (!getnoarg(args))
661 return NULL;
662 if (!getsockaddrlen(s, &addrlen))
663 return NULL;
664 BGN_SAVE
665 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
666 END_SAVE
667 if (res < 0)
668 return socket_error();
669 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
670}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000671#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000672
673
Guido van Rossum30a685f1991-06-27 15:51:29 +0000674/* s.listen(n) method */
675
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000676static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000677BUILD_FUNC_DEF_2(sock_listen,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000678{
679 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000680 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000681 if (!getintarg(args, &backlog))
682 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000683 BGN_SAVE
Guido van Rossumb6775db1994-08-01 11:34:53 +0000684 if (backlog < 1)
685 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000686 res = listen(s->sock_fd, backlog);
687 END_SAVE
688 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000689 return socket_error();
690 INCREF(None);
691 return None;
692}
693
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000694#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000695/* s.makefile(mode) method.
696 Create a new open file object referring to a dupped version of
697 the socket's file descriptor. (The dup() call is necessary so
698 that the open file and socket objects may be closed independent
699 of each other.)
700 The mode argument specifies 'r' or 'w' passed to fdopen(). */
701
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000703BUILD_FUNC_DEF_2(sock_makefile,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000704{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000705 extern int fclose PROTO((FILE *));
Guido van Rossumff4949e1992-08-05 19:58:53 +0000706 char *mode;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000707 int fd;
708 FILE *fp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000709 if (!getargs(args, "s", &mode))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000710 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000711 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossumff4949e1992-08-05 19:58:53 +0000712 (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000713 return socket_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000714 return newopenfileobject(fp, "<socket>", mode, fclose);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000716#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000717
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000718/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000719
720static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000721BUILD_FUNC_DEF_2(sock_recv,sockobject *,s, object *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000722{
723 int len, n, flags;
724 object *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000725 flags = 0;
726 if (!getargs(args, "i", &len)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000727 err_clear();
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000728 if (!getargs(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000729 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000730 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731 buf = newsizedstringobject((char *) 0, len);
732 if (buf == NULL)
733 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000734 BGN_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000735 n = recv(s->sock_fd, getstringvalue(buf), len, flags);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000736 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000737 if (n < 0)
738 return socket_error();
739 if (resizestring(&buf, n) < 0)
740 return NULL;
741 return buf;
742}
743
Guido van Rossum30a685f1991-06-27 15:51:29 +0000744
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000745/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000746
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000747static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000748BUILD_FUNC_DEF_2(sock_recvfrom,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000749{
750 char addrbuf[256];
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000751 object *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000752 int addrlen, len, n, flags;
753 flags = 0;
754 if (!getargs(args, "i", &len)) {
755 err_clear();
756 if (!getargs(args, "(ii)", &len, &flags))
757 return NULL;
758 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000759 if (!getsockaddrlen(s, &addrlen))
760 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000761 buf = newsizedstringobject((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000762 if (buf == NULL)
763 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000764 BGN_SAVE
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000765 n = recvfrom(s->sock_fd, getstringvalue(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000766#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000767 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000768#else
769 (struct sockaddr *)addrbuf, &addrlen);
770#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +0000771 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772 if (n < 0)
773 return socket_error();
774 if (resizestring(&buf, n) < 0)
775 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000776 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
777 ret = mkvalue("OO", buf, addr);
778 XDECREF(addr);
779 XDECREF(buf);
780 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781}
782
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000784/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000785
786static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000787BUILD_FUNC_DEF_2(sock_send,sockobject *,s, object *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000789 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000790 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000791 flags = 0;
Guido van Rossum234f9421993-06-17 12:35:49 +0000792 if (!getargs(args, "s#", &buf, &len)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000793 err_clear();
Guido van Rossum234f9421993-06-17 12:35:49 +0000794 if (!getargs(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000795 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000796 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000797 BGN_SAVE
798 n = send(s->sock_fd, buf, len, flags);
799 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000800 if (n < 0)
801 return socket_error();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000802 return newintobject((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000803}
804
805
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000806/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000807
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000808static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000809BUILD_FUNC_DEF_2(sock_sendto,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000811 object *addro;
812 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000814 int addrlen, len, n, flags;
815 flags = 0;
816 if (!getargs(args, "(s#O)", &buf, &len, &addro)) {
817 err_clear();
818 if (!getargs(args, "(s#iO)", &buf, &len, &flags, &addro))
819 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000820 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000821 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000823 BGN_SAVE
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000824 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000825 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000826 if (n < 0)
827 return socket_error();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000828 return newintobject((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829}
830
Guido van Rossum30a685f1991-06-27 15:51:29 +0000831
832/* s.shutdown(how) method */
833
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000835BUILD_FUNC_DEF_2(sock_shutdown,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000836{
837 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000838 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000839 if (!getintarg(args, &how))
840 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000841 BGN_SAVE
842 res = shutdown(s->sock_fd, how);
843 END_SAVE
844 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000845 return socket_error();
846 INCREF(None);
847 return None;
848}
849
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850
851/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852
853static struct methodlist sock_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000854 {"accept", (method)sock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000855#if 0
Guido van Rossumb6775db1994-08-01 11:34:53 +0000856 {"allowbroadcast", (method)sock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000857#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000858#ifndef NT
859 {"setblocking", (method)sock_setblocking},
860#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000861 {"setsockopt", (method)sock_setsockopt},
862 {"getsockopt", (method)sock_getsockopt},
863 {"bind", (method)sock_bind},
864 {"close", (method)sock_close},
865 {"connect", (method)sock_connect},
866 {"fileno", (method)sock_fileno},
867 {"getsockname", (method)sock_getsockname},
868#ifdef HAVE_GETPEERNAME
869 {"getpeername", (method)sock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000870#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000871 {"listen", (method)sock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000872#ifndef NO_DUP
Guido van Rossumb6775db1994-08-01 11:34:53 +0000873 {"makefile", (method)sock_makefile},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000874#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000875 {"recv", (method)sock_recv},
876 {"recvfrom", (method)sock_recvfrom},
877 {"send", (method)sock_send},
878 {"sendto", (method)sock_sendto},
879 {"shutdown", (method)sock_shutdown},
880 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000881};
882
Guido van Rossum30a685f1991-06-27 15:51:29 +0000883
884/* Deallocate a socket object in response to the last DECREF().
885 First close the file description. */
886
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000887static void
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000888BUILD_FUNC_DEF_1(sock_dealloc, sockobject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000889{
890 (void) close(s->sock_fd);
891 DEL(s);
892}
893
Guido van Rossum30a685f1991-06-27 15:51:29 +0000894
895/* Return a socket object's named attribute. */
896
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000898BUILD_FUNC_DEF_2(sock_getattr,sockobject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000899{
900 return findmethod(sock_methods, (object *) s, name);
901}
902
Guido van Rossum30a685f1991-06-27 15:51:29 +0000903
Guido van Rossumb6775db1994-08-01 11:34:53 +0000904/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000905
Guido van Rossumb6775db1994-08-01 11:34:53 +0000906static typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000907 OB_HEAD_INIT(&Typetype)
908 0,
909 "socket",
910 sizeof(sockobject),
911 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000912 (destructor)sock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000913 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000914 (getattrfunc)sock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000915 0, /*tp_setattr*/
916 0, /*tp_compare*/
917 0, /*tp_repr*/
918 0, /*tp_as_number*/
919 0, /*tp_as_sequence*/
920 0, /*tp_as_mapping*/
921};
922
Guido van Rossum30a685f1991-06-27 15:51:29 +0000923
Guido van Rossum81194471991-07-27 21:42:02 +0000924/* Python interface to gethostname(). */
925
926/*ARGSUSED*/
927static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000928BUILD_FUNC_DEF_2(socket_gethostname,object *,self, object *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000929{
930 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000931 int res;
Guido van Rossum81194471991-07-27 21:42:02 +0000932 if (!getnoarg(args))
933 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000934 BGN_SAVE
935 res = gethostname(buf, (int) sizeof buf - 1);
936 END_SAVE
937 if (res < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000938 return socket_error();
939 buf[sizeof buf - 1] = '\0';
940 return newstringobject(buf);
941}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000942
943
Guido van Rossum30a685f1991-06-27 15:51:29 +0000944/* Python interface to gethostbyname(name). */
945
946/*ARGSUSED*/
947static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000948BUILD_FUNC_DEF_2(socket_gethostbyname,object *,self, object *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000949{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000950 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000951 struct sockaddr_in addrbuf;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000952 if (!getargs(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000954 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000955 return NULL;
956 return makeipaddr(&addrbuf);
957}
958
959
960/* Python interface to getservbyname(name).
961 This only returns the port number, since the other info is already
962 known or not useful (like the list of aliases). */
963
964/*ARGSUSED*/
965static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000966BUILD_FUNC_DEF_2(socket_getservbyname,object *,self, object *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000967{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000968 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000969 struct servent *sp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000970 if (!getargs(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000971 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000972 BGN_SAVE
973 sp = getservbyname(name, proto);
974 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000975 if (sp == NULL) {
976 err_setstr(SocketError, "service/proto not found");
977 return NULL;
978 }
979 return newintobject((long) ntohs(sp->s_port));
980}
981
982
983/* Python interface to socket(family, type, proto).
984 The third (protocol) argument is optional.
985 Return a new socket object. */
986
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000987/*ARGSUSED*/
988static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000989BUILD_FUNC_DEF_2(socket_socket,object *,self,object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000990{
991 sockobject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000992 int fd, family, type, proto;
993 proto = 0;
994 if (!getargs(args, "(ii)", &family, &type)) {
995 err_clear();
996 if (!getargs(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000997 return NULL;
998 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000999 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001000 fd = socket(family, type, proto);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001001 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001002 if (fd < 0)
1003 return socket_error();
1004 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001005 /* If the object can't be created, don't forget to close the
1006 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001007 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001008 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +00001009 /* From now on, ignore SIGPIPE and let the error checking
1010 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001011#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001012 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001013#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001014 return (object *) s;
1015}
1016
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001017#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001018/* Create a socket object from a numeric file description.
1019 Useful e.g. if stdin is a socket.
1020 Additional arguments as for socket(). */
1021
1022/*ARGSUSED*/
1023static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001024BUILD_FUNC_DEF_2(socket_fromfd,object *,self,object *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001025{
1026 sockobject *s;
1027 int fd, family, type, proto;
1028 proto = 0;
1029 if (!getargs(args, "(iii)", &fd, &family, &type)) {
1030 err_clear();
1031 if (!getargs(args, "(iiii)", &fd, &family, &type, &proto))
1032 return NULL;
1033 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001034 /* Dup the fd so it and the socket can be closed independently */
1035 fd = dup(fd);
1036 if (fd < 0)
1037 return socket_error();
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001038 s = newsockobject(fd, family, type, proto);
1039 /* From now on, ignore SIGPIPE and let the error checking
1040 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001041#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001042 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001043#endif
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001044 return (object *) s;
1045}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001046#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001047
Guido van Rossum30a685f1991-06-27 15:51:29 +00001048/* List of functions exported by this module. */
1049
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001050static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001051 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +00001052 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001053 {"getservbyname", socket_getservbyname},
1054 {"socket", socket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001055#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001056 {"fromfd", socket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001057#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001058 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001059};
1060
Guido van Rossum30a685f1991-06-27 15:51:29 +00001061
1062/* Convenience routine to export an integer value.
1063 For simplicity, errors (which are unlikely anyway) are ignored. */
1064
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001065static void
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001066BUILD_FUNC_DEF_3(insint,object *,d,char *,name,int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001067{
1068 object *v = newintobject((long) value);
1069 if (v == NULL) {
1070 /* Don't bother reporting this error */
1071 err_clear();
1072 }
1073 else {
1074 dictinsert(d, name, v);
1075 DECREF(v);
1076 }
1077}
1078
Guido van Rossum30a685f1991-06-27 15:51:29 +00001079
1080/* Initialize this module.
1081 This is called when the first 'import socket' is done,
1082 via a table in config.c, if config.c is compiled with USE_SOCKET
1083 defined. */
1084
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001085void
1086initsocket()
1087{
1088 object *m, *d;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001089 m = initmodule("socket", socket_methods);
1090 d = getmoduledict(m);
1091 SocketError = newstringobject("socket.error");
1092 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
1093 fatal("can't define socket.error");
1094 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001095#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001096 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001097#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001098 insint(d, "SOCK_STREAM", SOCK_STREAM);
1099 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1100 insint(d, "SOCK_RAW", SOCK_RAW);
1101 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1102 insint(d, "SOCK_RDM", SOCK_RDM);
1103}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001104
1105#ifdef NT
1106BOOL WINAPI DllMain (HANDLE hInst,
1107 ULONG ul_reason_for_call,
1108 LPVOID lpReserved)
1109{
1110 switch (ul_reason_for_call)
1111 {
1112 case DLL_PROCESS_ATTACH:
1113 WSADATA WSAData;
1114 if (WSAStartup(MAKEWORD(2,0), &WSAData)) {
1115 OutputDebugString("Python can't initialize Windows Sockets DLL!");
1116 return FALSE;
1117 }
1118 break;
1119 case DLL_PROCESS_DETACH:
1120 WSACleanup();
1121 break;
1122
1123 }
1124 return TRUE;
1125}
1126#endif /* NT */