blob: b1fc81f40e47771cf490d7ae0f5864ee215c38c3 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003Netherlands.
4
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
Guido van Rossum9c16d7f1992-01-27 16:49:54 +000027/* XXX Ought to fix getStr*arg calls to use getargs(args, "s#", ...) */
28
Guido van Rossum6574b3e1991-06-25 21:36:08 +000029/*
30This module provides an interface to Berkeley socket IPC.
31
32Limitations:
33
Guido van Rossum30a685f1991-06-27 15:51:29 +000034- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000035- no asynchronous I/O (but read polling: avail)
36- no read/write operations (use send/recv or makefile instead)
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000037- no flags on sendto/recvfrom operations
Guido van Rossum0e69587d1992-06-05 15:11:30 +000038- setsockopt() and getsockopt() only support integer options
Guido van Rossum6574b3e1991-06-25 21:36:08 +000039
40Interface:
41
Guido van Rossum81194471991-07-27 21:42:02 +000042- socket.gethostname() --> host name (string)
Guido van Rossum30a685f1991-06-27 15:51:29 +000043- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000044- socket.getservbyname(servername, protocolname) --> port number
45- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000046- family and type constants from <socket.h> are accessed as socket.AF_INET etc.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000047- errors are reported as the exception socket.error
48- 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
52- a UNIX domain socket is a string specifying the pathname
53
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
57- s.avail() --> boolean
Guido van Rossum0e69587d1992-06-05 15:11:30 +000058- s.setsockopt(level, optname, flag) --> None
59- s.getsockopt(level, optname) --> flag
Guido van Rossum30a685f1991-06-27 15:51:29 +000060- s.bind(sockaddr) --> None
61- s.connect(sockaddr) --> None
Guido van Rossum30a685f1991-06-27 15:51:29 +000062- s.listen(n) --> None
63- s.makefile(mode) --> file object
64- s.recv(nbytes) --> string
65- s.recvfrom(nbytes) --> string, sockaddr
66- s.send(string) --> None
67- s.sendto(string, sockaddr) --> None
68- s.shutdown(how) --> None
69- s.close() --> None
70
Guido van Rossum6574b3e1991-06-25 21:36:08 +000071*/
72
73#include "allobjects.h"
74#include "modsupport.h"
75
Guido van Rossumed233a51992-06-23 09:07:03 +000076#include "myselect.h" /* Implies <sys/types.h>, <sys/time.h>, <sys/param.h> */
77
Guido van Rossum81194471991-07-27 21:42:02 +000078#include <signal.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079#include <sys/socket.h>
80#include <netinet/in.h>
81#include <sys/un.h>
82#include <netdb.h>
83
Guido van Rossum30a685f1991-06-27 15:51:29 +000084
85/* Global variable holding the exception type for errors detected
86 by this module (but not argument type or memory errors, etc.). */
87
88static object *SocketError;
89
90
91/* Convenience function to raise an error according to errno
92 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +000093
94static object *
95socket_error()
96{
97 return err_errno(SocketError);
98}
99
Guido van Rossum30a685f1991-06-27 15:51:29 +0000100
101/* The object holding a socket. It holds some extra information,
102 like the address family, which is used to decode socket address
103 arguments properly. */
104
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000105typedef struct {
106 OB_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000107 int sock_fd; /* Socket file descriptor */
108 int sock_family; /* Address family, e.g., AF_INET */
109 int sock_type; /* Socket type, e.g., SOCK_STREAM */
110 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000111} sockobject;
112
Guido van Rossum30a685f1991-06-27 15:51:29 +0000113
114/* A forward reference to the Socktype type object.
115 The Socktype variable contains pointers to various functions,
116 some of which call newsocobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000117 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000118
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000119extern typeobject Socktype; /* Forward */
120
Guido van Rossum30a685f1991-06-27 15:51:29 +0000121
122/* Create a new socket object.
123 This just creates the object and initializes it.
124 If the creation fails, return NULL and set an exception (implicit
125 in NEWOBJ()). */
126
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000127static sockobject *
128newsockobject(fd, family, type, proto)
129 int fd, family, type, proto;
130{
131 sockobject *s;
132 s = NEWOBJ(sockobject, &Socktype);
133 if (s != NULL) {
134 s->sock_fd = fd;
135 s->sock_family = family;
136 s->sock_type = type;
137 s->sock_proto = proto;
138 }
139 return s;
140}
141
Guido van Rossum30a685f1991-06-27 15:51:29 +0000142
143/* Convert a string specifying a host name or one of a few symbolic
144 names to a numeric IP address. This usually calls gethostbyname()
145 to do the work; the names "" and "<broadcast>" are special.
146 Return the length (should always be 4 bytes), or negative if
147 an error occurred; then an exception is raised. */
148
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000149static int
Guido van Rossum30a685f1991-06-27 15:51:29 +0000150setipaddr(name, addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000151 char *name;
152 struct sockaddr_in *addr_ret;
153{
154 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000155 int d1, d2, d3, d4;
156 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000157
Guido van Rossum30a685f1991-06-27 15:51:29 +0000158 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000159 addr_ret->sin_addr.s_addr = INADDR_ANY;
160 return 4;
161 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000162 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000163 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
164 return 4;
165 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000166 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
167 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
168 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
169 addr_ret->sin_addr.s_addr = htonl(
170 ((long) d1 << 24) | ((long) d2 << 16) |
171 ((long) d3 << 8) | ((long) d4 << 0));
172 return 4;
173 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000174 hp = gethostbyname(name);
175 if (hp == NULL) {
176 err_setstr(SocketError, "host not found");
177 return -1;
178 }
179 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
180 return hp->h_length;
181}
182
Guido van Rossum30a685f1991-06-27 15:51:29 +0000183
184/* Generally useful convenience function to create a tuple from two
185 objects. This eats references to the objects; if either is NULL
186 it destroys the other and returns NULL without raising an exception
187 (assuming the function that was called to create the argument must
188 have raised an exception and returned NULL). */
189
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000190static object *
191makepair(a, b)
192 object *a, *b;
193{
194 object *pair = NULL;
195 if (a == NULL || b == NULL || (pair = newtupleobject(2)) == NULL) {
196 XDECREF(a);
197 XDECREF(b);
198 return NULL;
199 }
200 settupleitem(pair, 0, a);
201 settupleitem(pair, 1, b);
202 return pair;
203}
204
Guido van Rossum30a685f1991-06-27 15:51:29 +0000205
206/* Create a string object representing an IP address.
207 This is always a string of the form 'dd.dd.dd.dd' (with variable
208 size numbers). */
209
210static object *
211makeipaddr(addr)
212 struct sockaddr_in *addr;
213{
214 long x = ntohl(addr->sin_addr.s_addr);
215 char buf[100];
216 sprintf(buf, "%d.%d.%d.%d",
217 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
218 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
219 return newstringobject(buf);
220}
221
222
223/* Create an object representing the given socket address,
224 suitable for passing it back to bind(), connect() etc.
225 The family field of the sockaddr structure is inspected
226 to determine what kind of address it really is. */
227
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000228/*ARGSUSED*/
229static object *
230makesockaddr(addr, addrlen)
231 struct sockaddr *addr;
232 int addrlen;
233{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000234 switch (addr->sa_family) {
235
236 case AF_INET:
237 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000238 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000239 return makepair(makeipaddr(a),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000240 newintobject((long) ntohs(a->sin_port)));
241 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000242
243 case AF_UNIX:
244 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000245 struct sockaddr_un *a = (struct sockaddr_un *) addr;
246 return newstringobject(a->sun_path);
247 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000248
249 /* More cases here... */
250
251 default:
252 err_setstr(SocketError, "return unknown socket address type");
253 return NULL;
254 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000255}
256
Guido van Rossum30a685f1991-06-27 15:51:29 +0000257
258/* Parse a socket address argument according to the socket object's
259 address family. Return 1 if the address was in the proper format,
260 0 of not. The address is returned through addr_ret, its length
261 through len_ret. */
262
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000263static int
264getsockaddrarg(s, args, addr_ret, len_ret)
265 sockobject *s;
266 object *args;
267 struct sockaddr **addr_ret;
268 int *len_ret;
269{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000270 switch (s->sock_family) {
271
272 case AF_UNIX:
273 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000274 static struct sockaddr_un addr;
275 object *path;
276 int len;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000277 if (!getStrarg(args, &path))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000278 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000279 if ((len = getstringsize(path)) > sizeof addr.sun_path) {
280 err_setstr(SocketError, "AF_UNIX path too long");
281 return 0;
282 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000283 addr.sun_family = AF_UNIX;
284 memcpy(addr.sun_path, getstringvalue(path), len);
285 *addr_ret = (struct sockaddr *) &addr;
286 *len_ret = len + sizeof addr.sun_family;
287 return 1;
288 }
289
Guido van Rossum30a685f1991-06-27 15:51:29 +0000290 case AF_INET:
291 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000292 static struct sockaddr_in addr;
293 object *host;
294 int port;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000295 if (!getStrintarg(args, &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000296 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000297 if (setipaddr(getstringvalue(host), &addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000298 return 0;
299 addr.sin_family = AF_INET;
300 addr.sin_port = htons(port);
301 *addr_ret = (struct sockaddr *) &addr;
302 *len_ret = sizeof addr;
303 return 1;
304 }
305
Guido van Rossum30a685f1991-06-27 15:51:29 +0000306 /* More cases here... */
307
308 default:
309 err_setstr(SocketError, "getsockaddrarg: bad family");
310 return 0;
311
312 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000313}
314
Guido van Rossum30a685f1991-06-27 15:51:29 +0000315
Guido van Rossum710e1df1992-06-12 10:39:36 +0000316/* Get the address length according to the socket object's address family.
317 Return 1 if the family is known, 0 otherwise. The length is returned
318 through len_ret. */
319
320static int
321getsockaddrlen(s, len_ret)
322 sockobject *s;
323 int *len_ret;
324{
325 switch (s->sock_family) {
326
327 case AF_UNIX:
328 {
329 *len_ret = sizeof (struct sockaddr_un);
330 return 1;
331 }
332
333 case AF_INET:
334 {
335 *len_ret = sizeof (struct sockaddr_in);
336 return 1;
337 }
338
339 /* More cases here... */
340
341 default:
342 err_setstr(SocketError, "getsockaddrarg: bad family");
343 return 0;
344
345 }
346}
347
348
Guido van Rossum30a685f1991-06-27 15:51:29 +0000349/* s.accept() method */
350
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000351static object *
352sock_accept(s, args)
353 sockobject *s;
354 object *args;
355{
356 char addrbuf[256];
357 int addrlen, newfd;
358 object *res;
359 if (!getnoarg(args))
360 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000361 if (!getsockaddrlen(s, &addrlen))
362 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000363 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
364 if (newfd < 0)
365 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000366 /* Create the new object with unspecified family,
367 to avoid calls to bind() etc. on it. */
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +0000368 res = makepair((object *) newsockobject(newfd,
369 s->sock_family,
370 s->sock_type,
371 s->sock_proto),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000372 makesockaddr((struct sockaddr *) addrbuf, addrlen));
373 if (res == NULL)
374 close(newfd);
375 return res;
376}
377
Guido van Rossum30a685f1991-06-27 15:51:29 +0000378
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000379/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000380/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000381
382static object *
383sock_allowbroadcast(s, args)
384 sockobject *s;
385 object *args;
386{
387 int flag;
388 int res;
389 if (!getintarg(args, &flag))
390 return NULL;
391 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
392 &flag, sizeof flag);
393 if (res < 0)
394 return socket_error();
395 INCREF(None);
396 return None;
397}
398
399
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000400/* s.setsockopt() method */
401/* XXX this works for integer flags only */
402
403static object *
404sock_setsockopt(s, args)
405 sockobject *s;
406 object *args;
407{
408 int level;
409 int optname;
410 int flag;
411 int res;
412
413 if (!getargs(args, "(iii)", &level, &optname, &flag))
414 return NULL;
415 res = setsockopt(s->sock_fd, level, optname, &flag, sizeof flag);
416 if (res < 0)
417 return socket_error();
418 INCREF(None);
419 return None;
420}
421
422
423/* s.getsockopt() method */
424/* XXX this works for integer flags only */
425
426static object *
427sock_getsockopt(s, args)
428 sockobject *s;
429 object *args;
430{
431 int level;
432 int optname;
433 int flag;
434 int flagsize;
435 int res;
436
437 if (!getargs(args, "(ii)", &level, &optname))
438 return NULL;
439 flagsize = sizeof flag;
440 flag = 0;
441 res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize);
442 if (res < 0)
443 return socket_error();
444 return newintobject(flag);
445}
446
447
Guido van Rossum81194471991-07-27 21:42:02 +0000448/* s.avail() method */
449
450static object *
451sock_avail(s, args)
452 sockobject *s;
453 object *args;
454{
455 struct timeval timeout;
456 fd_set readers;
457 int n;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000458 if (!getnoarg(args))
459 return NULL;
Guido van Rossum81194471991-07-27 21:42:02 +0000460 timeout.tv_sec = 0;
461 timeout.tv_usec = 0;
462 FD_ZERO(&readers);
463 FD_SET(s->sock_fd, &readers);
464 n = select(s->sock_fd+1, &readers, (fd_set *)0, (fd_set *)0, &timeout);
465 if (n < 0)
466 return socket_error();
467 return newintobject((long) (n != 0));
468}
469
470
Guido van Rossum30a685f1991-06-27 15:51:29 +0000471/* s.bind(sockaddr) method */
472
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000473static object *
474sock_bind(s, args)
475 sockobject *s;
476 object *args;
477{
478 struct sockaddr *addr;
479 int addrlen;
480 if (!getsockaddrarg(s, args, &addr, &addrlen))
481 return NULL;
482 if (bind(s->sock_fd, addr, addrlen) < 0)
483 return socket_error();
484 INCREF(None);
485 return None;
486}
487
Guido van Rossum30a685f1991-06-27 15:51:29 +0000488
489/* s.close() method.
490 Set the file descriptor to -1 so operations tried subsequently
491 will surely fail. */
492
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000493static object *
494sock_close(s, args)
495 sockobject *s;
496 object *args;
497{
498 if (!getnoarg(args))
499 return NULL;
500 (void) close(s->sock_fd);
501 s->sock_fd = -1;
502 INCREF(None);
503 return None;
504}
505
Guido van Rossum30a685f1991-06-27 15:51:29 +0000506
507/* s.connect(sockaddr) method */
508
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000509static object *
510sock_connect(s, args)
511 sockobject *s;
512 object *args;
513{
514 struct sockaddr *addr;
515 int addrlen;
516 if (!getsockaddrarg(s, args, &addr, &addrlen))
517 return NULL;
518 if (connect(s->sock_fd, addr, addrlen) < 0)
519 return socket_error();
520 INCREF(None);
521 return None;
522}
523
Guido van Rossum30a685f1991-06-27 15:51:29 +0000524
Guido van Rossumed233a51992-06-23 09:07:03 +0000525/* s.fileno() method */
526
527static object *
528sock_fileno(s, args)
529 sockobject *s;
530 object *args;
531{
532 if (!getnoarg(args))
533 return NULL;
534 return newintobject((long) s->sock_fd);
535}
536
537
Guido van Rossum30a685f1991-06-27 15:51:29 +0000538/* s.listen(n) method */
539
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000540static object *
541sock_listen(s, args)
542 sockobject *s;
543 object *args;
544{
545 int backlog;
546 if (!getintarg(args, &backlog))
547 return NULL;
548 if (listen(s->sock_fd, backlog) < 0)
549 return socket_error();
550 INCREF(None);
551 return None;
552}
553
Guido van Rossum30a685f1991-06-27 15:51:29 +0000554
555/* s.makefile(mode) method.
556 Create a new open file object referring to a dupped version of
557 the socket's file descriptor. (The dup() call is necessary so
558 that the open file and socket objects may be closed independent
559 of each other.)
560 The mode argument specifies 'r' or 'w' passed to fdopen(). */
561
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000562static object *
Guido van Rossum30a685f1991-06-27 15:51:29 +0000563sock_makefile(s, args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000564 sockobject *s;
565 object *args;
566{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000567 extern int fclose PROTO((FILE *));
568 object *mode;
569 int fd;
570 FILE *fp;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000571 if (!getStrarg(args, &mode))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000572 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000573 if ((fd = dup(s->sock_fd)) < 0 ||
574 (fp = fdopen(fd, getstringvalue(mode))) == NULL)
575 return socket_error();
576 return newopenfileobject(fp, "<socket>", getstringvalue(mode), fclose);
577}
578
579
580/* s.recv(nbytes) method */
581
582static object *
583sock_recv(s, args)
584 sockobject *s;
585 object *args;
586{
587 int len, n, flags;
588 object *buf;
589 if (!getintintarg(args, &len, &flags)) {
590 err_clear();
591 if (!getintarg(args, &len))
592 return NULL;
593 flags = 0;
594 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000595 buf = newsizedstringobject((char *) 0, len);
596 if (buf == NULL)
597 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000598 n = recv(s->sock_fd, getstringvalue(buf), len, flags);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000599 if (n < 0)
600 return socket_error();
601 if (resizestring(&buf, n) < 0)
602 return NULL;
603 return buf;
604}
605
Guido van Rossum30a685f1991-06-27 15:51:29 +0000606
607/* s.recvfrom(nbytes) method */
608
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000609static object *
610sock_recvfrom(s, args)
611 sockobject *s;
612 object *args;
613{
614 char addrbuf[256];
615 object *buf;
616 int addrlen, len, n;
617 if (!getintarg(args, &len))
618 return NULL;
619 buf = newsizedstringobject((char *) 0, len);
620 addrlen = sizeof addrbuf;
621 n = recvfrom(s->sock_fd, getstringvalue(buf), len, 0,
622 addrbuf, &addrlen);
623 if (n < 0)
624 return socket_error();
625 if (resizestring(&buf, n) < 0)
626 return NULL;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000627 return makepair(buf,
628 makesockaddr((struct sockaddr *)addrbuf, addrlen));
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629}
630
Guido van Rossum30a685f1991-06-27 15:51:29 +0000631
632/* s.send(data) method */
633
634static object *
635sock_send(s, args)
636 sockobject *s;
637 object *args;
638{
639 object *buf;
640 int len, n, flags;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000641 if (!getStrintarg(args, &buf, &flags)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642 err_clear();
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000643 if (!getStrarg(args, &buf))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000644 return NULL;
645 flags = 0;
646 }
647 len = getstringsize(buf);
648 n = send(s->sock_fd, getstringvalue(buf), len, flags);
649 if (n < 0)
650 return socket_error();
651 INCREF(None);
652 return None;
653}
654
655
656/* s.sendto(data, sockaddr) method */
657
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000658static object *
659sock_sendto(s, args)
660 sockobject *s;
661 object *args;
662{
663 object *buf;
664 struct sockaddr *addr;
665 int addrlen, len, n;
666 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
667 err_badarg();
668 return NULL;
669 }
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000670 if (!getStrarg(gettupleitem(args, 0), &buf) ||
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000671 !getsockaddrarg(s, gettupleitem(args, 1), &addr, &addrlen))
672 return NULL;
673 len = getstringsize(buf);
674 n = sendto(s->sock_fd, getstringvalue(buf), len, 0,
675 addr, addrlen);
676 if (n < 0)
677 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000678 INCREF(None);
679 return None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000680}
681
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682
683/* s.shutdown(how) method */
684
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000685static object *
686sock_shutdown(s, args)
687 sockobject *s;
688 object *args;
689{
690 int how;
691 if (!getintarg(args, &how))
692 return NULL;
693 if (shutdown(s->sock_fd, how) < 0)
694 return socket_error();
695 INCREF(None);
696 return None;
697}
698
Guido van Rossum30a685f1991-06-27 15:51:29 +0000699
700/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000701
702static struct methodlist sock_methods[] = {
703 {"accept", sock_accept},
Guido van Rossum81194471991-07-27 21:42:02 +0000704 {"avail", sock_avail},
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000705 {"allowbroadcast", sock_allowbroadcast},
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000706 {"setsockopt", sock_setsockopt},
707 {"getsockopt", sock_getsockopt},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000708 {"bind", sock_bind},
709 {"close", sock_close},
710 {"connect", sock_connect},
Guido van Rossumed233a51992-06-23 09:07:03 +0000711 {"fileno", sock_fileno},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000712 {"listen", sock_listen},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000713 {"makefile", sock_makefile},
714 {"recv", sock_recv},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000715 {"recvfrom", sock_recvfrom},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000716 {"send", sock_send},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000717 {"sendto", sock_sendto},
718 {"shutdown", sock_shutdown},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000719 {NULL, NULL} /* sentinel */
720};
721
Guido van Rossum30a685f1991-06-27 15:51:29 +0000722
723/* Deallocate a socket object in response to the last DECREF().
724 First close the file description. */
725
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000726static void
727sock_dealloc(s)
728 sockobject *s;
729{
730 (void) close(s->sock_fd);
731 DEL(s);
732}
733
Guido van Rossum30a685f1991-06-27 15:51:29 +0000734
735/* Return a socket object's named attribute. */
736
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000737static object *
738sock_getattr(s, name)
739 sockobject *s;
740 char *name;
741{
742 return findmethod(sock_methods, (object *) s, name);
743}
744
Guido van Rossum30a685f1991-06-27 15:51:29 +0000745
746/* Type object for socket objects.
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000747 XXX This should be static, but some compilers don't grok the
748 XXX forward reference to it in that case... */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000749
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000750typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000751 OB_HEAD_INIT(&Typetype)
752 0,
753 "socket",
754 sizeof(sockobject),
755 0,
756 sock_dealloc, /*tp_dealloc*/
757 0, /*tp_print*/
758 sock_getattr, /*tp_getattr*/
759 0, /*tp_setattr*/
760 0, /*tp_compare*/
761 0, /*tp_repr*/
762 0, /*tp_as_number*/
763 0, /*tp_as_sequence*/
764 0, /*tp_as_mapping*/
765};
766
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767
Guido van Rossum81194471991-07-27 21:42:02 +0000768/* Python interface to gethostname(). */
769
770/*ARGSUSED*/
771static object *
772socket_gethostname(self, args)
773 object *self;
774 object *args;
775{
776 char buf[1024];
777 if (!getnoarg(args))
778 return NULL;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000779 if (gethostname(buf, (int) sizeof buf - 1) < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000780 return socket_error();
781 buf[sizeof buf - 1] = '\0';
782 return newstringobject(buf);
783}
Guido van Rossum30a685f1991-06-27 15:51:29 +0000784/* Python interface to gethostbyname(name). */
785
786/*ARGSUSED*/
787static object *
788socket_gethostbyname(self, args)
789 object *self;
790 object *args;
791{
792 object *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000793 struct sockaddr_in addrbuf;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000794 if (!getStrarg(args, &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000795 return NULL;
796 if (setipaddr(getstringvalue(name), &addrbuf) < 0)
797 return NULL;
798 return makeipaddr(&addrbuf);
799}
800
801
802/* Python interface to getservbyname(name).
803 This only returns the port number, since the other info is already
804 known or not useful (like the list of aliases). */
805
806/*ARGSUSED*/
807static object *
808socket_getservbyname(self, args)
809 object *self;
810 object *args;
811{
812 object *name, *proto;
813 struct servent *sp;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000814 if (!getStrStrarg(args, &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000815 return NULL;
816 sp = getservbyname(getstringvalue(name), getstringvalue(proto));
817 if (sp == NULL) {
818 err_setstr(SocketError, "service/proto not found");
819 return NULL;
820 }
821 return newintobject((long) ntohs(sp->s_port));
822}
823
824
825/* Python interface to socket(family, type, proto).
826 The third (protocol) argument is optional.
827 Return a new socket object. */
828
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829/*ARGSUSED*/
830static object *
831socket_socket(self, args)
832 object *self;
833 object *args;
834{
835 sockobject *s;
836 int family, type, proto, fd;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000837 if (args != NULL && is_tupleobject(args) && gettuplesize(args) == 3) {
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +0000838 if (!getintintintarg(args, &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839 return NULL;
840 }
841 else {
842 if (!getintintarg(args, &family, &type))
843 return NULL;
844 proto = 0;
845 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000846 fd = socket(family, type, proto);
847 if (fd < 0)
848 return socket_error();
849 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850 /* If the object can't be created, don't forget to close the
851 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000853 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +0000854 /* From now on, ignore SIGPIPE and let the error checking
855 do the work. */
856 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000857 return (object *) s;
858}
859
Guido van Rossum30a685f1991-06-27 15:51:29 +0000860
861/* List of functions exported by this module. */
862
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000863static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000864 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +0000865 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000866 {"getservbyname", socket_getservbyname},
867 {"socket", socket_socket},
868 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000869};
870
Guido van Rossum30a685f1991-06-27 15:51:29 +0000871
872/* Convenience routine to export an integer value.
873 For simplicity, errors (which are unlikely anyway) are ignored. */
874
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875static void
876insint(d, name, value)
877 object *d;
878 char *name;
879 int value;
880{
881 object *v = newintobject((long) value);
882 if (v == NULL) {
883 /* Don't bother reporting this error */
884 err_clear();
885 }
886 else {
887 dictinsert(d, name, v);
888 DECREF(v);
889 }
890}
891
Guido van Rossum30a685f1991-06-27 15:51:29 +0000892
893/* Initialize this module.
894 This is called when the first 'import socket' is done,
895 via a table in config.c, if config.c is compiled with USE_SOCKET
896 defined. */
897
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000898void
899initsocket()
900{
901 object *m, *d;
902
903 m = initmodule("socket", socket_methods);
904 d = getmoduledict(m);
905 SocketError = newstringobject("socket.error");
906 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
907 fatal("can't define socket.error");
908 insint(d, "AF_INET", AF_INET);
909 insint(d, "AF_UNIX", AF_UNIX);
910 insint(d, "SOCK_STREAM", SOCK_STREAM);
911 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
912 insint(d, "SOCK_RAW", SOCK_RAW);
913 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
914 insint(d, "SOCK_RDM", SOCK_RDM);
915}