blob: 21ddf62bbd83432aa80c256acd7a6755e118d7b5 [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 Rossum81194471991-07-27 21:42:02 +000076#include <signal.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077#include <sys/types.h>
78#include <sys/socket.h>
Guido van Rossum81194471991-07-27 21:42:02 +000079#include <sys/time.h> /* Needed for struct timeval */
Guido van Rossum6574b3e1991-06-25 21:36:08 +000080#include <netinet/in.h>
81#include <sys/un.h>
82#include <netdb.h>
Guido van Rossum81194471991-07-27 21:42:02 +000083#ifdef _AIX /* I *think* this works */
Guido van Rossum0bb1a511991-11-27 14:55:18 +000084/* AIX defines fd_set in a separate file. Sigh... */
85#include <sys/select.h>
Guido van Rossum81194471991-07-27 21:42:02 +000086#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +000087
Guido van Rossum30a685f1991-06-27 15:51:29 +000088
89/* Global variable holding the exception type for errors detected
90 by this module (but not argument type or memory errors, etc.). */
91
92static object *SocketError;
93
94
95/* Convenience function to raise an error according to errno
96 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +000097
98static object *
99socket_error()
100{
101 return err_errno(SocketError);
102}
103
Guido van Rossum30a685f1991-06-27 15:51:29 +0000104
105/* The object holding a socket. It holds some extra information,
106 like the address family, which is used to decode socket address
107 arguments properly. */
108
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000109typedef struct {
110 OB_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000111 int sock_fd; /* Socket file descriptor */
112 int sock_family; /* Address family, e.g., AF_INET */
113 int sock_type; /* Socket type, e.g., SOCK_STREAM */
114 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000115} sockobject;
116
Guido van Rossum30a685f1991-06-27 15:51:29 +0000117
118/* A forward reference to the Socktype type object.
119 The Socktype variable contains pointers to various functions,
120 some of which call newsocobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000121 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000122
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000123extern typeobject Socktype; /* Forward */
124
Guido van Rossum30a685f1991-06-27 15:51:29 +0000125
126/* Create a new socket object.
127 This just creates the object and initializes it.
128 If the creation fails, return NULL and set an exception (implicit
129 in NEWOBJ()). */
130
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000131static sockobject *
132newsockobject(fd, family, type, proto)
133 int fd, family, type, proto;
134{
135 sockobject *s;
136 s = NEWOBJ(sockobject, &Socktype);
137 if (s != NULL) {
138 s->sock_fd = fd;
139 s->sock_family = family;
140 s->sock_type = type;
141 s->sock_proto = proto;
142 }
143 return s;
144}
145
Guido van Rossum30a685f1991-06-27 15:51:29 +0000146
147/* Convert a string specifying a host name or one of a few symbolic
148 names to a numeric IP address. This usually calls gethostbyname()
149 to do the work; the names "" and "<broadcast>" are special.
150 Return the length (should always be 4 bytes), or negative if
151 an error occurred; then an exception is raised. */
152
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000153static int
Guido van Rossum30a685f1991-06-27 15:51:29 +0000154setipaddr(name, addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000155 char *name;
156 struct sockaddr_in *addr_ret;
157{
158 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000159 int d1, d2, d3, d4;
160 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000161
Guido van Rossum30a685f1991-06-27 15:51:29 +0000162 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000163 addr_ret->sin_addr.s_addr = INADDR_ANY;
164 return 4;
165 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000166 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000167 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
168 return 4;
169 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000170 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
171 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
172 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
173 addr_ret->sin_addr.s_addr = htonl(
174 ((long) d1 << 24) | ((long) d2 << 16) |
175 ((long) d3 << 8) | ((long) d4 << 0));
176 return 4;
177 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000178 hp = gethostbyname(name);
179 if (hp == NULL) {
180 err_setstr(SocketError, "host not found");
181 return -1;
182 }
183 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
184 return hp->h_length;
185}
186
Guido van Rossum30a685f1991-06-27 15:51:29 +0000187
188/* Generally useful convenience function to create a tuple from two
189 objects. This eats references to the objects; if either is NULL
190 it destroys the other and returns NULL without raising an exception
191 (assuming the function that was called to create the argument must
192 have raised an exception and returned NULL). */
193
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000194static object *
195makepair(a, b)
196 object *a, *b;
197{
198 object *pair = NULL;
199 if (a == NULL || b == NULL || (pair = newtupleobject(2)) == NULL) {
200 XDECREF(a);
201 XDECREF(b);
202 return NULL;
203 }
204 settupleitem(pair, 0, a);
205 settupleitem(pair, 1, b);
206 return pair;
207}
208
Guido van Rossum30a685f1991-06-27 15:51:29 +0000209
210/* Create a string object representing an IP address.
211 This is always a string of the form 'dd.dd.dd.dd' (with variable
212 size numbers). */
213
214static object *
215makeipaddr(addr)
216 struct sockaddr_in *addr;
217{
218 long x = ntohl(addr->sin_addr.s_addr);
219 char buf[100];
220 sprintf(buf, "%d.%d.%d.%d",
221 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
222 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
223 return newstringobject(buf);
224}
225
226
227/* Create an object representing the given socket address,
228 suitable for passing it back to bind(), connect() etc.
229 The family field of the sockaddr structure is inspected
230 to determine what kind of address it really is. */
231
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000232/*ARGSUSED*/
233static object *
234makesockaddr(addr, addrlen)
235 struct sockaddr *addr;
236 int addrlen;
237{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000238 switch (addr->sa_family) {
239
240 case AF_INET:
241 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000242 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000243 return makepair(makeipaddr(a),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000244 newintobject((long) ntohs(a->sin_port)));
245 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000246
247 case AF_UNIX:
248 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000249 struct sockaddr_un *a = (struct sockaddr_un *) addr;
250 return newstringobject(a->sun_path);
251 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000252
253 /* More cases here... */
254
255 default:
256 err_setstr(SocketError, "return unknown socket address type");
257 return NULL;
258 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000259}
260
Guido van Rossum30a685f1991-06-27 15:51:29 +0000261
262/* Parse a socket address argument according to the socket object's
263 address family. Return 1 if the address was in the proper format,
264 0 of not. The address is returned through addr_ret, its length
265 through len_ret. */
266
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000267static int
268getsockaddrarg(s, args, addr_ret, len_ret)
269 sockobject *s;
270 object *args;
271 struct sockaddr **addr_ret;
272 int *len_ret;
273{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000274 switch (s->sock_family) {
275
276 case AF_UNIX:
277 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000278 static struct sockaddr_un addr;
279 object *path;
280 int len;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000281 if (!getStrarg(args, &path))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000282 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000283 if ((len = getstringsize(path)) > sizeof addr.sun_path) {
284 err_setstr(SocketError, "AF_UNIX path too long");
285 return 0;
286 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000287 addr.sun_family = AF_UNIX;
288 memcpy(addr.sun_path, getstringvalue(path), len);
289 *addr_ret = (struct sockaddr *) &addr;
290 *len_ret = len + sizeof addr.sun_family;
291 return 1;
292 }
293
Guido van Rossum30a685f1991-06-27 15:51:29 +0000294 case AF_INET:
295 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000296 static struct sockaddr_in addr;
297 object *host;
298 int port;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000299 if (!getStrintarg(args, &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000300 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000301 if (setipaddr(getstringvalue(host), &addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000302 return 0;
303 addr.sin_family = AF_INET;
304 addr.sin_port = htons(port);
305 *addr_ret = (struct sockaddr *) &addr;
306 *len_ret = sizeof addr;
307 return 1;
308 }
309
Guido van Rossum30a685f1991-06-27 15:51:29 +0000310 /* More cases here... */
311
312 default:
313 err_setstr(SocketError, "getsockaddrarg: bad family");
314 return 0;
315
316 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000317}
318
Guido van Rossum30a685f1991-06-27 15:51:29 +0000319
Guido van Rossum710e1df1992-06-12 10:39:36 +0000320/* Get the address length according to the socket object's address family.
321 Return 1 if the family is known, 0 otherwise. The length is returned
322 through len_ret. */
323
324static int
325getsockaddrlen(s, len_ret)
326 sockobject *s;
327 int *len_ret;
328{
329 switch (s->sock_family) {
330
331 case AF_UNIX:
332 {
333 *len_ret = sizeof (struct sockaddr_un);
334 return 1;
335 }
336
337 case AF_INET:
338 {
339 *len_ret = sizeof (struct sockaddr_in);
340 return 1;
341 }
342
343 /* More cases here... */
344
345 default:
346 err_setstr(SocketError, "getsockaddrarg: bad family");
347 return 0;
348
349 }
350}
351
352
Guido van Rossum30a685f1991-06-27 15:51:29 +0000353/* s.accept() method */
354
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000355static object *
356sock_accept(s, args)
357 sockobject *s;
358 object *args;
359{
360 char addrbuf[256];
361 int addrlen, newfd;
362 object *res;
363 if (!getnoarg(args))
364 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000365 if (!getsockaddrlen(s, &addrlen))
366 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000367 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
368 if (newfd < 0)
369 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000370 /* Create the new object with unspecified family,
371 to avoid calls to bind() etc. on it. */
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +0000372 res = makepair((object *) newsockobject(newfd,
373 s->sock_family,
374 s->sock_type,
375 s->sock_proto),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000376 makesockaddr((struct sockaddr *) addrbuf, addrlen));
377 if (res == NULL)
378 close(newfd);
379 return res;
380}
381
Guido van Rossum30a685f1991-06-27 15:51:29 +0000382
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000383/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000384/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000385
386static object *
387sock_allowbroadcast(s, args)
388 sockobject *s;
389 object *args;
390{
391 int flag;
392 int res;
393 if (!getintarg(args, &flag))
394 return NULL;
395 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
396 &flag, sizeof flag);
397 if (res < 0)
398 return socket_error();
399 INCREF(None);
400 return None;
401}
402
403
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000404/* s.setsockopt() method */
405/* XXX this works for integer flags only */
406
407static object *
408sock_setsockopt(s, args)
409 sockobject *s;
410 object *args;
411{
412 int level;
413 int optname;
414 int flag;
415 int res;
416
417 if (!getargs(args, "(iii)", &level, &optname, &flag))
418 return NULL;
419 res = setsockopt(s->sock_fd, level, optname, &flag, sizeof flag);
420 if (res < 0)
421 return socket_error();
422 INCREF(None);
423 return None;
424}
425
426
427/* s.getsockopt() method */
428/* XXX this works for integer flags only */
429
430static object *
431sock_getsockopt(s, args)
432 sockobject *s;
433 object *args;
434{
435 int level;
436 int optname;
437 int flag;
438 int flagsize;
439 int res;
440
441 if (!getargs(args, "(ii)", &level, &optname))
442 return NULL;
443 flagsize = sizeof flag;
444 flag = 0;
445 res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize);
446 if (res < 0)
447 return socket_error();
448 return newintobject(flag);
449}
450
451
Guido van Rossum81194471991-07-27 21:42:02 +0000452/* s.avail() method */
453
454static object *
455sock_avail(s, args)
456 sockobject *s;
457 object *args;
458{
459 struct timeval timeout;
460 fd_set readers;
461 int n;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000462 if (!getnoarg(args))
463 return NULL;
Guido van Rossum81194471991-07-27 21:42:02 +0000464 timeout.tv_sec = 0;
465 timeout.tv_usec = 0;
466 FD_ZERO(&readers);
467 FD_SET(s->sock_fd, &readers);
468 n = select(s->sock_fd+1, &readers, (fd_set *)0, (fd_set *)0, &timeout);
469 if (n < 0)
470 return socket_error();
471 return newintobject((long) (n != 0));
472}
473
474
Guido van Rossum30a685f1991-06-27 15:51:29 +0000475/* s.bind(sockaddr) method */
476
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000477static object *
478sock_bind(s, args)
479 sockobject *s;
480 object *args;
481{
482 struct sockaddr *addr;
483 int addrlen;
484 if (!getsockaddrarg(s, args, &addr, &addrlen))
485 return NULL;
486 if (bind(s->sock_fd, addr, addrlen) < 0)
487 return socket_error();
488 INCREF(None);
489 return None;
490}
491
Guido van Rossum30a685f1991-06-27 15:51:29 +0000492
493/* s.close() method.
494 Set the file descriptor to -1 so operations tried subsequently
495 will surely fail. */
496
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000497static object *
498sock_close(s, args)
499 sockobject *s;
500 object *args;
501{
502 if (!getnoarg(args))
503 return NULL;
504 (void) close(s->sock_fd);
505 s->sock_fd = -1;
506 INCREF(None);
507 return None;
508}
509
Guido van Rossum30a685f1991-06-27 15:51:29 +0000510
511/* s.connect(sockaddr) method */
512
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000513static object *
514sock_connect(s, args)
515 sockobject *s;
516 object *args;
517{
518 struct sockaddr *addr;
519 int addrlen;
520 if (!getsockaddrarg(s, args, &addr, &addrlen))
521 return NULL;
522 if (connect(s->sock_fd, addr, addrlen) < 0)
523 return socket_error();
524 INCREF(None);
525 return None;
526}
527
Guido van Rossum30a685f1991-06-27 15:51:29 +0000528
529/* s.listen(n) method */
530
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000531static object *
532sock_listen(s, args)
533 sockobject *s;
534 object *args;
535{
536 int backlog;
537 if (!getintarg(args, &backlog))
538 return NULL;
539 if (listen(s->sock_fd, backlog) < 0)
540 return socket_error();
541 INCREF(None);
542 return None;
543}
544
Guido van Rossum30a685f1991-06-27 15:51:29 +0000545
546/* s.makefile(mode) method.
547 Create a new open file object referring to a dupped version of
548 the socket's file descriptor. (The dup() call is necessary so
549 that the open file and socket objects may be closed independent
550 of each other.)
551 The mode argument specifies 'r' or 'w' passed to fdopen(). */
552
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000553static object *
Guido van Rossum30a685f1991-06-27 15:51:29 +0000554sock_makefile(s, args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000555 sockobject *s;
556 object *args;
557{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000558 extern int fclose PROTO((FILE *));
559 object *mode;
560 int fd;
561 FILE *fp;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000562 if (!getStrarg(args, &mode))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000564 if ((fd = dup(s->sock_fd)) < 0 ||
565 (fp = fdopen(fd, getstringvalue(mode))) == NULL)
566 return socket_error();
567 return newopenfileobject(fp, "<socket>", getstringvalue(mode), fclose);
568}
569
570
571/* s.recv(nbytes) method */
572
573static object *
574sock_recv(s, args)
575 sockobject *s;
576 object *args;
577{
578 int len, n, flags;
579 object *buf;
580 if (!getintintarg(args, &len, &flags)) {
581 err_clear();
582 if (!getintarg(args, &len))
583 return NULL;
584 flags = 0;
585 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000586 buf = newsizedstringobject((char *) 0, len);
587 if (buf == NULL)
588 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000589 n = recv(s->sock_fd, getstringvalue(buf), len, flags);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000590 if (n < 0)
591 return socket_error();
592 if (resizestring(&buf, n) < 0)
593 return NULL;
594 return buf;
595}
596
Guido van Rossum30a685f1991-06-27 15:51:29 +0000597
598/* s.recvfrom(nbytes) method */
599
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000600static object *
601sock_recvfrom(s, args)
602 sockobject *s;
603 object *args;
604{
605 char addrbuf[256];
606 object *buf;
607 int addrlen, len, n;
608 if (!getintarg(args, &len))
609 return NULL;
610 buf = newsizedstringobject((char *) 0, len);
611 addrlen = sizeof addrbuf;
612 n = recvfrom(s->sock_fd, getstringvalue(buf), len, 0,
613 addrbuf, &addrlen);
614 if (n < 0)
615 return socket_error();
616 if (resizestring(&buf, n) < 0)
617 return NULL;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000618 return makepair(buf,
619 makesockaddr((struct sockaddr *)addrbuf, addrlen));
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000620}
621
Guido van Rossum30a685f1991-06-27 15:51:29 +0000622
623/* s.send(data) method */
624
625static object *
626sock_send(s, args)
627 sockobject *s;
628 object *args;
629{
630 object *buf;
631 int len, n, flags;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000632 if (!getStrintarg(args, &buf, &flags)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000633 err_clear();
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000634 if (!getStrarg(args, &buf))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000635 return NULL;
636 flags = 0;
637 }
638 len = getstringsize(buf);
639 n = send(s->sock_fd, getstringvalue(buf), len, flags);
640 if (n < 0)
641 return socket_error();
642 INCREF(None);
643 return None;
644}
645
646
647/* s.sendto(data, sockaddr) method */
648
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000649static object *
650sock_sendto(s, args)
651 sockobject *s;
652 object *args;
653{
654 object *buf;
655 struct sockaddr *addr;
656 int addrlen, len, n;
657 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
658 err_badarg();
659 return NULL;
660 }
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000661 if (!getStrarg(gettupleitem(args, 0), &buf) ||
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000662 !getsockaddrarg(s, gettupleitem(args, 1), &addr, &addrlen))
663 return NULL;
664 len = getstringsize(buf);
665 n = sendto(s->sock_fd, getstringvalue(buf), len, 0,
666 addr, addrlen);
667 if (n < 0)
668 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000669 INCREF(None);
670 return None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000671}
672
Guido van Rossum30a685f1991-06-27 15:51:29 +0000673
674/* s.shutdown(how) method */
675
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000676static object *
677sock_shutdown(s, args)
678 sockobject *s;
679 object *args;
680{
681 int how;
682 if (!getintarg(args, &how))
683 return NULL;
684 if (shutdown(s->sock_fd, how) < 0)
685 return socket_error();
686 INCREF(None);
687 return None;
688}
689
Guido van Rossum30a685f1991-06-27 15:51:29 +0000690
691/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000692
693static struct methodlist sock_methods[] = {
694 {"accept", sock_accept},
Guido van Rossum81194471991-07-27 21:42:02 +0000695 {"avail", sock_avail},
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000696 {"allowbroadcast", sock_allowbroadcast},
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000697 {"setsockopt", sock_setsockopt},
698 {"getsockopt", sock_getsockopt},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000699 {"bind", sock_bind},
700 {"close", sock_close},
701 {"connect", sock_connect},
702 {"listen", sock_listen},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000703 {"makefile", sock_makefile},
704 {"recv", sock_recv},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000705 {"recvfrom", sock_recvfrom},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000706 {"send", sock_send},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000707 {"sendto", sock_sendto},
708 {"shutdown", sock_shutdown},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000709 {NULL, NULL} /* sentinel */
710};
711
Guido van Rossum30a685f1991-06-27 15:51:29 +0000712
713/* Deallocate a socket object in response to the last DECREF().
714 First close the file description. */
715
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000716static void
717sock_dealloc(s)
718 sockobject *s;
719{
720 (void) close(s->sock_fd);
721 DEL(s);
722}
723
Guido van Rossum30a685f1991-06-27 15:51:29 +0000724
725/* Return a socket object's named attribute. */
726
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000727static object *
728sock_getattr(s, name)
729 sockobject *s;
730 char *name;
731{
732 return findmethod(sock_methods, (object *) s, name);
733}
734
Guido van Rossum30a685f1991-06-27 15:51:29 +0000735
736/* Type object for socket objects.
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000737 XXX This should be static, but some compilers don't grok the
738 XXX forward reference to it in that case... */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000740typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000741 OB_HEAD_INIT(&Typetype)
742 0,
743 "socket",
744 sizeof(sockobject),
745 0,
746 sock_dealloc, /*tp_dealloc*/
747 0, /*tp_print*/
748 sock_getattr, /*tp_getattr*/
749 0, /*tp_setattr*/
750 0, /*tp_compare*/
751 0, /*tp_repr*/
752 0, /*tp_as_number*/
753 0, /*tp_as_sequence*/
754 0, /*tp_as_mapping*/
755};
756
Guido van Rossum30a685f1991-06-27 15:51:29 +0000757
Guido van Rossum81194471991-07-27 21:42:02 +0000758/* Python interface to gethostname(). */
759
760/*ARGSUSED*/
761static object *
762socket_gethostname(self, args)
763 object *self;
764 object *args;
765{
766 char buf[1024];
767 if (!getnoarg(args))
768 return NULL;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000769 if (gethostname(buf, (int) sizeof buf - 1) < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000770 return socket_error();
771 buf[sizeof buf - 1] = '\0';
772 return newstringobject(buf);
773}
Guido van Rossum30a685f1991-06-27 15:51:29 +0000774/* Python interface to gethostbyname(name). */
775
776/*ARGSUSED*/
777static object *
778socket_gethostbyname(self, args)
779 object *self;
780 object *args;
781{
782 object *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783 struct sockaddr_in addrbuf;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000784 if (!getStrarg(args, &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000785 return NULL;
786 if (setipaddr(getstringvalue(name), &addrbuf) < 0)
787 return NULL;
788 return makeipaddr(&addrbuf);
789}
790
791
792/* Python interface to getservbyname(name).
793 This only returns the port number, since the other info is already
794 known or not useful (like the list of aliases). */
795
796/*ARGSUSED*/
797static object *
798socket_getservbyname(self, args)
799 object *self;
800 object *args;
801{
802 object *name, *proto;
803 struct servent *sp;
Guido van Rossum9c16d7f1992-01-27 16:49:54 +0000804 if (!getStrStrarg(args, &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000805 return NULL;
806 sp = getservbyname(getstringvalue(name), getstringvalue(proto));
807 if (sp == NULL) {
808 err_setstr(SocketError, "service/proto not found");
809 return NULL;
810 }
811 return newintobject((long) ntohs(sp->s_port));
812}
813
814
815/* Python interface to socket(family, type, proto).
816 The third (protocol) argument is optional.
817 Return a new socket object. */
818
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000819/*ARGSUSED*/
820static object *
821socket_socket(self, args)
822 object *self;
823 object *args;
824{
825 sockobject *s;
826 int family, type, proto, fd;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000827 if (args != NULL && is_tupleobject(args) && gettuplesize(args) == 3) {
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +0000828 if (!getintintintarg(args, &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000829 return NULL;
830 }
831 else {
832 if (!getintintarg(args, &family, &type))
833 return NULL;
834 proto = 0;
835 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000836 fd = socket(family, type, proto);
837 if (fd < 0)
838 return socket_error();
839 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000840 /* If the object can't be created, don't forget to close the
841 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000842 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000843 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +0000844 /* From now on, ignore SIGPIPE and let the error checking
845 do the work. */
846 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847 return (object *) s;
848}
849
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850
851/* List of functions exported by this module. */
852
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000854 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +0000855 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000856 {"getservbyname", socket_getservbyname},
857 {"socket", socket_socket},
858 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000859};
860
Guido van Rossum30a685f1991-06-27 15:51:29 +0000861
862/* Convenience routine to export an integer value.
863 For simplicity, errors (which are unlikely anyway) are ignored. */
864
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000865static void
866insint(d, name, value)
867 object *d;
868 char *name;
869 int value;
870{
871 object *v = newintobject((long) value);
872 if (v == NULL) {
873 /* Don't bother reporting this error */
874 err_clear();
875 }
876 else {
877 dictinsert(d, name, v);
878 DECREF(v);
879 }
880}
881
Guido van Rossum30a685f1991-06-27 15:51:29 +0000882
883/* Initialize this module.
884 This is called when the first 'import socket' is done,
885 via a table in config.c, if config.c is compiled with USE_SOCKET
886 defined. */
887
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000888void
889initsocket()
890{
891 object *m, *d;
892
893 m = initmodule("socket", socket_methods);
894 d = getmoduledict(m);
895 SocketError = newstringobject("socket.error");
896 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
897 fatal("can't define socket.error");
898 insint(d, "AF_INET", AF_INET);
899 insint(d, "AF_UNIX", AF_UNIX);
900 insint(d, "SOCK_STREAM", SOCK_STREAM);
901 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
902 insint(d, "SOCK_RAW", SOCK_RAW);
903 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
904 insint(d, "SOCK_RDM", SOCK_RDM);
905}