blob: ab8c6b5a51b3064267a57188bb77921e6cfae799 [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
27/*
28This module provides an interface to Berkeley socket IPC.
29
30Limitations:
31
Guido van Rossum30a685f1991-06-27 15:51:29 +000032- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000033- no asynchronous I/O (but read polling: avail)
34- no read/write operations (use send/recv or makefile instead)
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000035- no flags on sendto/recvfrom operations
Guido van Rossum0e69587d1992-06-05 15:11:30 +000036- setsockopt() and getsockopt() only support integer options
Guido van Rossum6574b3e1991-06-25 21:36:08 +000037
38Interface:
39
Guido van Rossum81194471991-07-27 21:42:02 +000040- socket.gethostname() --> host name (string)
Guido van Rossum30a685f1991-06-27 15:51:29 +000041- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000042- socket.getservbyname(servername, protocolname) --> port number
43- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044- family and type constants from <socket.h> are accessed as socket.AF_INET etc.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000045- errors are reported as the exception socket.error
46- an Internet socket address is a pair (hostname, port)
47 where hostname can be anything recognized by gethostbyname()
48 (including the dd.dd.dd.dd notation) and port is in host byte order
49- where a hostname is returned, the dd.dd.dd.dd notation is used
50- a UNIX domain socket is a string specifying the pathname
51
Guido van Rossum30a685f1991-06-27 15:51:29 +000052Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000053
Guido van Rossum81194471991-07-27 21:42:02 +000054- s.accept() --> new socket object, sockaddr
55- s.avail() --> boolean
Guido van Rossum0e69587d1992-06-05 15:11:30 +000056- s.setsockopt(level, optname, flag) --> None
57- s.getsockopt(level, optname) --> flag
Guido van Rossum30a685f1991-06-27 15:51:29 +000058- s.bind(sockaddr) --> None
59- s.connect(sockaddr) --> None
Guido van Rossum30a685f1991-06-27 15:51:29 +000060- s.listen(n) --> None
61- s.makefile(mode) --> file object
62- s.recv(nbytes) --> string
63- s.recvfrom(nbytes) --> string, sockaddr
64- s.send(string) --> None
65- s.sendto(string, sockaddr) --> None
66- s.shutdown(how) --> None
67- s.close() --> None
68
Guido van Rossum6574b3e1991-06-25 21:36:08 +000069*/
70
71#include "allobjects.h"
72#include "modsupport.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000073#include "ceval.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000074
Guido van Rossumed233a51992-06-23 09:07:03 +000075#include "myselect.h" /* Implies <sys/types.h>, <sys/time.h>, <sys/param.h> */
76
Guido van Rossum81194471991-07-27 21:42:02 +000077#include <signal.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000078#include <sys/socket.h>
79#include <netinet/in.h>
80#include <sys/un.h>
81#include <netdb.h>
82
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
84/* Global variable holding the exception type for errors detected
85 by this module (but not argument type or memory errors, etc.). */
86
87static object *SocketError;
88
89
90/* Convenience function to raise an error according to errno
91 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +000092
93static object *
94socket_error()
95{
96 return err_errno(SocketError);
97}
98
Guido van Rossum30a685f1991-06-27 15:51:29 +000099
100/* The object holding a socket. It holds some extra information,
101 like the address family, which is used to decode socket address
102 arguments properly. */
103
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000104typedef struct {
105 OB_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000106 int sock_fd; /* Socket file descriptor */
107 int sock_family; /* Address family, e.g., AF_INET */
108 int sock_type; /* Socket type, e.g., SOCK_STREAM */
109 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000110} sockobject;
111
Guido van Rossum30a685f1991-06-27 15:51:29 +0000112
113/* A forward reference to the Socktype type object.
114 The Socktype variable contains pointers to various functions,
115 some of which call newsocobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000116 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000117
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000118extern typeobject Socktype; /* Forward */
119
Guido van Rossum30a685f1991-06-27 15:51:29 +0000120
121/* Create a new socket object.
122 This just creates the object and initializes it.
123 If the creation fails, return NULL and set an exception (implicit
124 in NEWOBJ()). */
125
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000126static sockobject *
127newsockobject(fd, family, type, proto)
128 int fd, family, type, proto;
129{
130 sockobject *s;
131 s = NEWOBJ(sockobject, &Socktype);
132 if (s != NULL) {
133 s->sock_fd = fd;
134 s->sock_family = family;
135 s->sock_type = type;
136 s->sock_proto = proto;
137 }
138 return s;
139}
140
Guido van Rossum30a685f1991-06-27 15:51:29 +0000141
142/* Convert a string specifying a host name or one of a few symbolic
143 names to a numeric IP address. This usually calls gethostbyname()
144 to do the work; the names "" and "<broadcast>" are special.
145 Return the length (should always be 4 bytes), or negative if
146 an error occurred; then an exception is raised. */
147
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000148static int
Guido van Rossum30a685f1991-06-27 15:51:29 +0000149setipaddr(name, addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000150 char *name;
151 struct sockaddr_in *addr_ret;
152{
153 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000154 int d1, d2, d3, d4;
155 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000156
Guido van Rossum30a685f1991-06-27 15:51:29 +0000157 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000158 addr_ret->sin_addr.s_addr = INADDR_ANY;
159 return 4;
160 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000161 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000162 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
163 return 4;
164 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000165 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
166 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
167 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
168 addr_ret->sin_addr.s_addr = htonl(
169 ((long) d1 << 24) | ((long) d2 << 16) |
170 ((long) d3 << 8) | ((long) d4 << 0));
171 return 4;
172 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000173 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000174 hp = gethostbyname(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000175 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000176 if (hp == NULL) {
177 err_setstr(SocketError, "host not found");
178 return -1;
179 }
180 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
181 return hp->h_length;
182}
183
Guido van Rossum30a685f1991-06-27 15:51:29 +0000184
Guido van Rossum30a685f1991-06-27 15:51:29 +0000185/* Create a string object representing an IP address.
186 This is always a string of the form 'dd.dd.dd.dd' (with variable
187 size numbers). */
188
189static object *
190makeipaddr(addr)
191 struct sockaddr_in *addr;
192{
193 long x = ntohl(addr->sin_addr.s_addr);
194 char buf[100];
195 sprintf(buf, "%d.%d.%d.%d",
196 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
197 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
198 return newstringobject(buf);
199}
200
201
202/* Create an object representing the given socket address,
203 suitable for passing it back to bind(), connect() etc.
204 The family field of the sockaddr structure is inspected
205 to determine what kind of address it really is. */
206
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000207/*ARGSUSED*/
208static object *
209makesockaddr(addr, addrlen)
210 struct sockaddr *addr;
211 int addrlen;
212{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000213 if (addrlen == 0) {
214 /* No address -- may be recvfrom() from known socket */
215 INCREF(None);
216 return None;
217 }
218
Guido van Rossum30a685f1991-06-27 15:51:29 +0000219 switch (addr->sa_family) {
220
221 case AF_INET:
222 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000223 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000224 return mkvalue("Oi", makeipaddr(a), ntohs(a->sin_port));
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000225 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000226
227 case AF_UNIX:
228 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000229 struct sockaddr_un *a = (struct sockaddr_un *) addr;
230 return newstringobject(a->sun_path);
231 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000232
233 /* More cases here... */
234
235 default:
236 err_setstr(SocketError, "return unknown socket address type");
237 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000238
Guido van Rossum30a685f1991-06-27 15:51:29 +0000239 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000240}
241
Guido van Rossum30a685f1991-06-27 15:51:29 +0000242
243/* Parse a socket address argument according to the socket object's
244 address family. Return 1 if the address was in the proper format,
245 0 of not. The address is returned through addr_ret, its length
246 through len_ret. */
247
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000248static int
249getsockaddrarg(s, args, addr_ret, len_ret)
250 sockobject *s;
251 object *args;
252 struct sockaddr **addr_ret;
253 int *len_ret;
254{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000255 switch (s->sock_family) {
256
257 case AF_UNIX:
258 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000259 static struct sockaddr_un addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000260 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000261 int len;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000262 if (!getargs(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000263 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000264 if (len > sizeof addr.sun_path) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000265 err_setstr(SocketError, "AF_UNIX path too long");
266 return 0;
267 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000268 addr.sun_family = AF_UNIX;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000269 memcpy(addr.sun_path, path, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000270 *addr_ret = (struct sockaddr *) &addr;
271 *len_ret = len + sizeof addr.sun_family;
272 return 1;
273 }
274
Guido van Rossum30a685f1991-06-27 15:51:29 +0000275 case AF_INET:
276 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000277 static struct sockaddr_in addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000278 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000279 int port;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000280 if (!getargs(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000281 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000282 if (setipaddr(host, &addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000283 return 0;
284 addr.sin_family = AF_INET;
285 addr.sin_port = htons(port);
286 *addr_ret = (struct sockaddr *) &addr;
287 *len_ret = sizeof addr;
288 return 1;
289 }
290
Guido van Rossum30a685f1991-06-27 15:51:29 +0000291 /* More cases here... */
292
293 default:
294 err_setstr(SocketError, "getsockaddrarg: bad family");
295 return 0;
296
297 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000298}
299
Guido van Rossum30a685f1991-06-27 15:51:29 +0000300
Guido van Rossum710e1df1992-06-12 10:39:36 +0000301/* Get the address length according to the socket object's address family.
302 Return 1 if the family is known, 0 otherwise. The length is returned
303 through len_ret. */
304
305static int
306getsockaddrlen(s, len_ret)
307 sockobject *s;
308 int *len_ret;
309{
310 switch (s->sock_family) {
311
312 case AF_UNIX:
313 {
314 *len_ret = sizeof (struct sockaddr_un);
315 return 1;
316 }
317
318 case AF_INET:
319 {
320 *len_ret = sizeof (struct sockaddr_in);
321 return 1;
322 }
323
324 /* More cases here... */
325
326 default:
327 err_setstr(SocketError, "getsockaddrarg: bad family");
328 return 0;
329
330 }
331}
332
333
Guido van Rossum30a685f1991-06-27 15:51:29 +0000334/* s.accept() method */
335
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000336static object *
337sock_accept(s, args)
338 sockobject *s;
339 object *args;
340{
341 char addrbuf[256];
342 int addrlen, newfd;
343 object *res;
344 if (!getnoarg(args))
345 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000346 if (!getsockaddrlen(s, &addrlen))
347 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000348 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000350 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000351 if (newfd < 0)
352 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000353 /* Create the new object with unspecified family,
354 to avoid calls to bind() etc. on it. */
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000355 res = mkvalue("OO", (object *) newsockobject(newfd,
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +0000356 s->sock_family,
357 s->sock_type,
358 s->sock_proto),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000359 makesockaddr((struct sockaddr *) addrbuf, addrlen));
360 if (res == NULL)
361 close(newfd);
362 return res;
363}
364
Guido van Rossum30a685f1991-06-27 15:51:29 +0000365
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000366/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000367/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000368
369static object *
370sock_allowbroadcast(s, args)
371 sockobject *s;
372 object *args;
373{
374 int flag;
375 int res;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000376 if (!getargs(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000377 return NULL;
378 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
379 &flag, sizeof flag);
380 if (res < 0)
381 return socket_error();
382 INCREF(None);
383 return None;
384}
385
386
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000387/* s.setsockopt() method */
388/* XXX this works for integer flags only */
389
390static object *
391sock_setsockopt(s, args)
392 sockobject *s;
393 object *args;
394{
395 int level;
396 int optname;
397 int flag;
398 int res;
399
400 if (!getargs(args, "(iii)", &level, &optname, &flag))
401 return NULL;
402 res = setsockopt(s->sock_fd, level, optname, &flag, sizeof flag);
403 if (res < 0)
404 return socket_error();
405 INCREF(None);
406 return None;
407}
408
409
410/* s.getsockopt() method */
411/* XXX this works for integer flags only */
412
413static object *
414sock_getsockopt(s, args)
415 sockobject *s;
416 object *args;
417{
418 int level;
419 int optname;
420 int flag;
421 int flagsize;
422 int res;
423
424 if (!getargs(args, "(ii)", &level, &optname))
425 return NULL;
426 flagsize = sizeof flag;
427 flag = 0;
428 res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize);
429 if (res < 0)
430 return socket_error();
431 return newintobject(flag);
432}
433
434
Guido van Rossum81194471991-07-27 21:42:02 +0000435/* s.avail() method */
436
437static object *
438sock_avail(s, args)
439 sockobject *s;
440 object *args;
441{
442 struct timeval timeout;
443 fd_set readers;
444 int n;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000445 if (!getnoarg(args))
446 return NULL;
Guido van Rossum81194471991-07-27 21:42:02 +0000447 timeout.tv_sec = 0;
448 timeout.tv_usec = 0;
449 FD_ZERO(&readers);
450 FD_SET(s->sock_fd, &readers);
451 n = select(s->sock_fd+1, &readers, (fd_set *)0, (fd_set *)0, &timeout);
452 if (n < 0)
453 return socket_error();
454 return newintobject((long) (n != 0));
455}
456
457
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458/* s.bind(sockaddr) method */
459
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000460static object *
461sock_bind(s, args)
462 sockobject *s;
463 object *args;
464{
465 struct sockaddr *addr;
466 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000467 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000468 if (!getsockaddrarg(s, args, &addr, &addrlen))
469 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000470 BGN_SAVE
471 res = bind(s->sock_fd, addr, addrlen);
472 END_SAVE
473 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000474 return socket_error();
475 INCREF(None);
476 return None;
477}
478
Guido van Rossum30a685f1991-06-27 15:51:29 +0000479
480/* s.close() method.
481 Set the file descriptor to -1 so operations tried subsequently
482 will surely fail. */
483
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000484static object *
485sock_close(s, args)
486 sockobject *s;
487 object *args;
488{
489 if (!getnoarg(args))
490 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000491 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000492 (void) close(s->sock_fd);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000493 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494 s->sock_fd = -1;
495 INCREF(None);
496 return None;
497}
498
Guido van Rossum30a685f1991-06-27 15:51:29 +0000499
500/* s.connect(sockaddr) method */
501
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000502static object *
503sock_connect(s, args)
504 sockobject *s;
505 object *args;
506{
507 struct sockaddr *addr;
508 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000509 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000510 if (!getsockaddrarg(s, args, &addr, &addrlen))
511 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000512 BGN_SAVE
513 res = connect(s->sock_fd, addr, addrlen);
514 END_SAVE
515 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000516 return socket_error();
517 INCREF(None);
518 return None;
519}
520
Guido van Rossum30a685f1991-06-27 15:51:29 +0000521
Guido van Rossumed233a51992-06-23 09:07:03 +0000522/* s.fileno() method */
523
524static object *
525sock_fileno(s, args)
526 sockobject *s;
527 object *args;
528{
529 if (!getnoarg(args))
530 return NULL;
531 return newintobject((long) s->sock_fd);
532}
533
534
Guido van Rossum30a685f1991-06-27 15:51:29 +0000535/* s.listen(n) method */
536
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000537static object *
538sock_listen(s, args)
539 sockobject *s;
540 object *args;
541{
542 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000543 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000544 if (!getintarg(args, &backlog))
545 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000546 BGN_SAVE
547 res = listen(s->sock_fd, backlog);
548 END_SAVE
549 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000550 return socket_error();
551 INCREF(None);
552 return None;
553}
554
Guido van Rossum30a685f1991-06-27 15:51:29 +0000555
556/* s.makefile(mode) method.
557 Create a new open file object referring to a dupped version of
558 the socket's file descriptor. (The dup() call is necessary so
559 that the open file and socket objects may be closed independent
560 of each other.)
561 The mode argument specifies 'r' or 'w' passed to fdopen(). */
562
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000563static object *
Guido van Rossum30a685f1991-06-27 15:51:29 +0000564sock_makefile(s, args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565 sockobject *s;
566 object *args;
567{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000568 extern int fclose PROTO((FILE *));
Guido van Rossumff4949e1992-08-05 19:58:53 +0000569 char *mode;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570 int fd;
571 FILE *fp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000572 if (!getargs(args, "s", &mode))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000573 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000574 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossumff4949e1992-08-05 19:58:53 +0000575 (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000576 return socket_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000577 return newopenfileobject(fp, "<socket>", mode, fclose);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000578}
579
580
581/* s.recv(nbytes) method */
582
583static object *
584sock_recv(s, args)
585 sockobject *s;
586 object *args;
587{
588 int len, n, flags;
589 object *buf;
590 if (!getintintarg(args, &len, &flags)) {
591 err_clear();
592 if (!getintarg(args, &len))
593 return NULL;
594 flags = 0;
595 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000596 buf = newsizedstringobject((char *) 0, len);
597 if (buf == NULL)
598 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000599 BGN_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000600 n = recv(s->sock_fd, getstringvalue(buf), len, flags);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000601 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000602 if (n < 0)
603 return socket_error();
604 if (resizestring(&buf, n) < 0)
605 return NULL;
606 return buf;
607}
608
Guido van Rossum30a685f1991-06-27 15:51:29 +0000609
610/* s.recvfrom(nbytes) method */
611
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000612static object *
613sock_recvfrom(s, args)
614 sockobject *s;
615 object *args;
616{
617 char addrbuf[256];
618 object *buf;
619 int addrlen, len, n;
620 if (!getintarg(args, &len))
621 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000622 if (!getsockaddrlen(s, &addrlen))
623 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000624 buf = newsizedstringobject((char *) 0, len);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000625 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000626 n = recvfrom(s->sock_fd, getstringvalue(buf), len, 0,
627 addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000628 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000629 if (n < 0)
630 return socket_error();
631 if (resizestring(&buf, n) < 0)
632 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000633 return mkvalue("OO", buf,
Guido van Rossumd15b7331992-03-27 17:22:00 +0000634 makesockaddr((struct sockaddr *)addrbuf, addrlen));
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000635}
636
Guido van Rossum30a685f1991-06-27 15:51:29 +0000637
638/* s.send(data) method */
639
640static object *
641sock_send(s, args)
642 sockobject *s;
643 object *args;
644{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000645 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000646 int len, n, flags;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000647 if (!getargs(args, "(s#i)", &buf, &len, &flags)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000648 err_clear();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000649 if (!getargs(args, "s#", &buf, &len))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000650 return NULL;
651 flags = 0;
652 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000653 BGN_SAVE
654 n = send(s->sock_fd, buf, len, flags);
655 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000656 if (n < 0)
657 return socket_error();
658 INCREF(None);
659 return None;
660}
661
662
663/* s.sendto(data, sockaddr) method */
664
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000665static object *
666sock_sendto(s, args)
667 sockobject *s;
668 object *args;
669{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000670 object *addro;
671 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000672 struct sockaddr *addr;
673 int addrlen, len, n;
674 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
675 err_badarg();
676 return NULL;
677 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000678 if (!getargs(args, "(s#O)", &buf, &len, &addro) ||
679 !getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000680 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000681 BGN_SAVE
682 n = sendto(s->sock_fd, buf, len, 0, addr, addrlen);
683 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000684 if (n < 0)
685 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000686 INCREF(None);
687 return None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000688}
689
Guido van Rossum30a685f1991-06-27 15:51:29 +0000690
691/* s.shutdown(how) method */
692
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000693static object *
694sock_shutdown(s, args)
695 sockobject *s;
696 object *args;
697{
698 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000699 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000700 if (!getintarg(args, &how))
701 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000702 BGN_SAVE
703 res = shutdown(s->sock_fd, how);
704 END_SAVE
705 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000706 return socket_error();
707 INCREF(None);
708 return None;
709}
710
Guido van Rossum30a685f1991-06-27 15:51:29 +0000711
712/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000713
714static struct methodlist sock_methods[] = {
715 {"accept", sock_accept},
Guido van Rossum81194471991-07-27 21:42:02 +0000716 {"avail", sock_avail},
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000717 {"allowbroadcast", sock_allowbroadcast},
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000718 {"setsockopt", sock_setsockopt},
719 {"getsockopt", sock_getsockopt},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000720 {"bind", sock_bind},
721 {"close", sock_close},
722 {"connect", sock_connect},
Guido van Rossumed233a51992-06-23 09:07:03 +0000723 {"fileno", sock_fileno},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000724 {"listen", sock_listen},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000725 {"makefile", sock_makefile},
726 {"recv", sock_recv},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000727 {"recvfrom", sock_recvfrom},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000728 {"send", sock_send},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000729 {"sendto", sock_sendto},
730 {"shutdown", sock_shutdown},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731 {NULL, NULL} /* sentinel */
732};
733
Guido van Rossum30a685f1991-06-27 15:51:29 +0000734
735/* Deallocate a socket object in response to the last DECREF().
736 First close the file description. */
737
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000738static void
739sock_dealloc(s)
740 sockobject *s;
741{
742 (void) close(s->sock_fd);
743 DEL(s);
744}
745
Guido van Rossum30a685f1991-06-27 15:51:29 +0000746
747/* Return a socket object's named attribute. */
748
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000749static object *
750sock_getattr(s, name)
751 sockobject *s;
752 char *name;
753{
754 return findmethod(sock_methods, (object *) s, name);
755}
756
Guido van Rossum30a685f1991-06-27 15:51:29 +0000757
758/* Type object for socket objects.
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000759 XXX This should be static, but some compilers don't grok the
760 XXX forward reference to it in that case... */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000761
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000762typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000763 OB_HEAD_INIT(&Typetype)
764 0,
765 "socket",
766 sizeof(sockobject),
767 0,
768 sock_dealloc, /*tp_dealloc*/
769 0, /*tp_print*/
770 sock_getattr, /*tp_getattr*/
771 0, /*tp_setattr*/
772 0, /*tp_compare*/
773 0, /*tp_repr*/
774 0, /*tp_as_number*/
775 0, /*tp_as_sequence*/
776 0, /*tp_as_mapping*/
777};
778
Guido van Rossum30a685f1991-06-27 15:51:29 +0000779
Guido van Rossum81194471991-07-27 21:42:02 +0000780/* Python interface to gethostname(). */
781
782/*ARGSUSED*/
783static object *
784socket_gethostname(self, args)
785 object *self;
786 object *args;
787{
788 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000789 int res;
Guido van Rossum81194471991-07-27 21:42:02 +0000790 if (!getnoarg(args))
791 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000792 BGN_SAVE
793 res = gethostname(buf, (int) sizeof buf - 1);
794 END_SAVE
795 if (res < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000796 return socket_error();
797 buf[sizeof buf - 1] = '\0';
798 return newstringobject(buf);
799}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000800
801
Guido van Rossum30a685f1991-06-27 15:51:29 +0000802/* Python interface to gethostbyname(name). */
803
804/*ARGSUSED*/
805static object *
806socket_gethostbyname(self, args)
807 object *self;
808 object *args;
809{
810 object *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000811 struct sockaddr_in addrbuf;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000812 if (!getargs(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000813 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000814 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000815 return NULL;
816 return makeipaddr(&addrbuf);
817}
818
819
820/* Python interface to getservbyname(name).
821 This only returns the port number, since the other info is already
822 known or not useful (like the list of aliases). */
823
824/*ARGSUSED*/
825static object *
826socket_getservbyname(self, args)
827 object *self;
828 object *args;
829{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000830 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000831 struct servent *sp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000832 if (!getargs(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000834 BGN_SAVE
835 sp = getservbyname(name, proto);
836 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000837 if (sp == NULL) {
838 err_setstr(SocketError, "service/proto not found");
839 return NULL;
840 }
841 return newintobject((long) ntohs(sp->s_port));
842}
843
844
845/* Python interface to socket(family, type, proto).
846 The third (protocol) argument is optional.
847 Return a new socket object. */
848
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000849/*ARGSUSED*/
850static object *
851socket_socket(self, args)
852 object *self;
853 object *args;
854{
855 sockobject *s;
856 int family, type, proto, fd;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000857 if (args != NULL && is_tupleobject(args) && gettuplesize(args) == 3) {
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +0000858 if (!getintintintarg(args, &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000859 return NULL;
860 }
861 else {
862 if (!getintintarg(args, &family, &type))
863 return NULL;
864 proto = 0;
865 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000866 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000867 fd = socket(family, type, proto);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000868 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000869 if (fd < 0)
870 return socket_error();
871 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000872 /* If the object can't be created, don't forget to close the
873 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000875 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +0000876 /* From now on, ignore SIGPIPE and let the error checking
877 do the work. */
878 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000879 return (object *) s;
880}
881
Guido van Rossum30a685f1991-06-27 15:51:29 +0000882
883/* List of functions exported by this module. */
884
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000885static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000886 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +0000887 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000888 {"getservbyname", socket_getservbyname},
889 {"socket", socket_socket},
890 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000891};
892
Guido van Rossum30a685f1991-06-27 15:51:29 +0000893
894/* Convenience routine to export an integer value.
895 For simplicity, errors (which are unlikely anyway) are ignored. */
896
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897static void
898insint(d, name, value)
899 object *d;
900 char *name;
901 int value;
902{
903 object *v = newintobject((long) value);
904 if (v == NULL) {
905 /* Don't bother reporting this error */
906 err_clear();
907 }
908 else {
909 dictinsert(d, name, v);
910 DECREF(v);
911 }
912}
913
Guido van Rossum30a685f1991-06-27 15:51:29 +0000914
915/* Initialize this module.
916 This is called when the first 'import socket' is done,
917 via a table in config.c, if config.c is compiled with USE_SOCKET
918 defined. */
919
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000920void
921initsocket()
922{
923 object *m, *d;
924
925 m = initmodule("socket", socket_methods);
926 d = getmoduledict(m);
927 SocketError = newstringobject("socket.error");
928 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
929 fatal("can't define socket.error");
930 insint(d, "AF_INET", AF_INET);
931 insint(d, "AF_UNIX", AF_UNIX);
932 insint(d, "SOCK_STREAM", SOCK_STREAM);
933 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
934 insint(d, "SOCK_RAW", SOCK_RAW);
935 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
936 insint(d, "SOCK_RDM", SOCK_RDM);
937}