blob: c72c9fd529da0d9f040fc468067765e98aa94561 [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 Rossumc89705d1992-11-26 08:54:07 +000060- s.getsockname() --> sockaddr
61- s.getpeername() --> sockaddr
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"
Guido van Rossumff4949e1992-08-05 19:58:53 +000075#include "ceval.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000076
Guido van Rossumed233a51992-06-23 09:07:03 +000077#include "myselect.h" /* Implies <sys/types.h>, <sys/time.h>, <sys/param.h> */
78
Guido van Rossum81194471991-07-27 21:42:02 +000079#include <signal.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000080#include <sys/socket.h>
81#include <netinet/in.h>
82#include <sys/un.h>
83#include <netdb.h>
84
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
86/* Global variable holding the exception type for errors detected
87 by this module (but not argument type or memory errors, etc.). */
88
89static object *SocketError;
90
91
92/* Convenience function to raise an error according to errno
93 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +000094
95static object *
96socket_error()
97{
98 return err_errno(SocketError);
99}
100
Guido van Rossum30a685f1991-06-27 15:51:29 +0000101
102/* The object holding a socket. It holds some extra information,
103 like the address family, which is used to decode socket address
104 arguments properly. */
105
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000106typedef struct {
107 OB_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000108 int sock_fd; /* Socket file descriptor */
109 int sock_family; /* Address family, e.g., AF_INET */
110 int sock_type; /* Socket type, e.g., SOCK_STREAM */
111 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000112} sockobject;
113
Guido van Rossum30a685f1991-06-27 15:51:29 +0000114
115/* A forward reference to the Socktype type object.
116 The Socktype variable contains pointers to various functions,
117 some of which call newsocobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000118 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000119
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000120extern typeobject Socktype; /* Forward */
121
Guido van Rossum30a685f1991-06-27 15:51:29 +0000122
123/* Create a new socket object.
124 This just creates the object and initializes it.
125 If the creation fails, return NULL and set an exception (implicit
126 in NEWOBJ()). */
127
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000128static sockobject *
129newsockobject(fd, family, type, proto)
130 int fd, family, type, proto;
131{
132 sockobject *s;
133 s = NEWOBJ(sockobject, &Socktype);
134 if (s != NULL) {
135 s->sock_fd = fd;
136 s->sock_family = family;
137 s->sock_type = type;
138 s->sock_proto = proto;
139 }
140 return s;
141}
142
Guido van Rossum30a685f1991-06-27 15:51:29 +0000143
144/* Convert a string specifying a host name or one of a few symbolic
145 names to a numeric IP address. This usually calls gethostbyname()
146 to do the work; the names "" and "<broadcast>" are special.
147 Return the length (should always be 4 bytes), or negative if
148 an error occurred; then an exception is raised. */
149
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000150static int
Guido van Rossum30a685f1991-06-27 15:51:29 +0000151setipaddr(name, addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000152 char *name;
153 struct sockaddr_in *addr_ret;
154{
155 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000156 int d1, d2, d3, d4;
157 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000158
Guido van Rossum30a685f1991-06-27 15:51:29 +0000159 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000160 addr_ret->sin_addr.s_addr = INADDR_ANY;
161 return 4;
162 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000163 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000164 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
165 return 4;
166 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000167 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
168 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
169 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
170 addr_ret->sin_addr.s_addr = htonl(
171 ((long) d1 << 24) | ((long) d2 << 16) |
172 ((long) d3 << 8) | ((long) d4 << 0));
173 return 4;
174 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000175 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000176 hp = gethostbyname(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000177 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000178 if (hp == NULL) {
179 err_setstr(SocketError, "host not found");
180 return -1;
181 }
182 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
183 return hp->h_length;
184}
185
Guido van Rossum30a685f1991-06-27 15:51:29 +0000186
Guido van Rossum30a685f1991-06-27 15:51:29 +0000187/* Create a string object representing an IP address.
188 This is always a string of the form 'dd.dd.dd.dd' (with variable
189 size numbers). */
190
191static object *
192makeipaddr(addr)
193 struct sockaddr_in *addr;
194{
195 long x = ntohl(addr->sin_addr.s_addr);
196 char buf[100];
197 sprintf(buf, "%d.%d.%d.%d",
198 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
199 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
200 return newstringobject(buf);
201}
202
203
204/* Create an object representing the given socket address,
205 suitable for passing it back to bind(), connect() etc.
206 The family field of the sockaddr structure is inspected
207 to determine what kind of address it really is. */
208
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000209/*ARGSUSED*/
210static object *
211makesockaddr(addr, addrlen)
212 struct sockaddr *addr;
213 int addrlen;
214{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000215 if (addrlen == 0) {
216 /* No address -- may be recvfrom() from known socket */
217 INCREF(None);
218 return None;
219 }
220
Guido van Rossum30a685f1991-06-27 15:51:29 +0000221 switch (addr->sa_family) {
222
223 case AF_INET:
224 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000225 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000226 return mkvalue("Oi", makeipaddr(a), ntohs(a->sin_port));
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000227 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000228
229 case AF_UNIX:
230 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000231 struct sockaddr_un *a = (struct sockaddr_un *) addr;
232 return newstringobject(a->sun_path);
233 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000234
235 /* More cases here... */
236
237 default:
238 err_setstr(SocketError, "return unknown socket address type");
239 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000240
Guido van Rossum30a685f1991-06-27 15:51:29 +0000241 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000242}
243
Guido van Rossum30a685f1991-06-27 15:51:29 +0000244
245/* Parse a socket address argument according to the socket object's
246 address family. Return 1 if the address was in the proper format,
247 0 of not. The address is returned through addr_ret, its length
248 through len_ret. */
249
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000250static int
251getsockaddrarg(s, args, addr_ret, len_ret)
252 sockobject *s;
253 object *args;
254 struct sockaddr **addr_ret;
255 int *len_ret;
256{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000257 switch (s->sock_family) {
258
259 case AF_UNIX:
260 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000261 static struct sockaddr_un addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000262 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000263 int len;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000264 if (!getargs(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000265 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000266 if (len > sizeof addr.sun_path) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000267 err_setstr(SocketError, "AF_UNIX path too long");
268 return 0;
269 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000270 addr.sun_family = AF_UNIX;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000271 memcpy(addr.sun_path, path, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000272 *addr_ret = (struct sockaddr *) &addr;
273 *len_ret = len + sizeof addr.sun_family;
274 return 1;
275 }
276
Guido van Rossum30a685f1991-06-27 15:51:29 +0000277 case AF_INET:
278 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000279 static struct sockaddr_in addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000280 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000281 int port;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000282 if (!getargs(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000283 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000284 if (setipaddr(host, &addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000285 return 0;
286 addr.sin_family = AF_INET;
287 addr.sin_port = htons(port);
288 *addr_ret = (struct sockaddr *) &addr;
289 *len_ret = sizeof addr;
290 return 1;
291 }
292
Guido van Rossum30a685f1991-06-27 15:51:29 +0000293 /* More cases here... */
294
295 default:
296 err_setstr(SocketError, "getsockaddrarg: bad family");
297 return 0;
298
299 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000300}
301
Guido van Rossum30a685f1991-06-27 15:51:29 +0000302
Guido van Rossum710e1df1992-06-12 10:39:36 +0000303/* Get the address length according to the socket object's address family.
304 Return 1 if the family is known, 0 otherwise. The length is returned
305 through len_ret. */
306
307static int
308getsockaddrlen(s, len_ret)
309 sockobject *s;
310 int *len_ret;
311{
312 switch (s->sock_family) {
313
314 case AF_UNIX:
315 {
316 *len_ret = sizeof (struct sockaddr_un);
317 return 1;
318 }
319
320 case AF_INET:
321 {
322 *len_ret = sizeof (struct sockaddr_in);
323 return 1;
324 }
325
326 /* More cases here... */
327
328 default:
329 err_setstr(SocketError, "getsockaddrarg: bad family");
330 return 0;
331
332 }
333}
334
335
Guido van Rossum30a685f1991-06-27 15:51:29 +0000336/* s.accept() method */
337
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000338static object *
339sock_accept(s, args)
340 sockobject *s;
341 object *args;
342{
343 char addrbuf[256];
344 int addrlen, newfd;
345 object *res;
346 if (!getnoarg(args))
347 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000348 if (!getsockaddrlen(s, &addrlen))
349 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000350 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000351 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000352 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000353 if (newfd < 0)
354 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000355 /* Create the new object with unspecified family,
356 to avoid calls to bind() etc. on it. */
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000357 res = mkvalue("OO", (object *) newsockobject(newfd,
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +0000358 s->sock_family,
359 s->sock_type,
360 s->sock_proto),
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000361 makesockaddr((struct sockaddr *) addrbuf, addrlen));
362 if (res == NULL)
363 close(newfd);
364 return res;
365}
366
Guido van Rossum30a685f1991-06-27 15:51:29 +0000367
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000368/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000369/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000370
371static object *
372sock_allowbroadcast(s, args)
373 sockobject *s;
374 object *args;
375{
376 int flag;
377 int res;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000378 if (!getargs(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000379 return NULL;
380 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
381 &flag, sizeof flag);
382 if (res < 0)
383 return socket_error();
384 INCREF(None);
385 return None;
386}
387
388
Guido van Rossumaee08791992-09-08 09:05:33 +0000389/* s.setsockopt() method.
390 With an integer third argument, sets an integer option.
391 With a string third argument, sets an option from a buffer;
392 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000393
394static object *
395sock_setsockopt(s, args)
396 sockobject *s;
397 object *args;
398{
399 int level;
400 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000401 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000402 char *buf;
403 int buflen;
404 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000405
Guido van Rossumaee08791992-09-08 09:05:33 +0000406 if (getargs(args, "(iii)", &level, &optname, &flag)) {
407 buf = (char *) &flag;
408 buflen = sizeof flag;
409 }
410 else {
411 err_clear();
412 if (!getargs(args, "(iis#)", &level, &optname, &buf, &buflen))
413 return NULL;
414 }
415 res = setsockopt(s->sock_fd, level, optname, buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000416 if (res < 0)
417 return socket_error();
418 INCREF(None);
419 return None;
420}
421
422
Guido van Rossumaee08791992-09-08 09:05:33 +0000423/* s.getsockopt() method.
424 With two arguments, retrieves an integer option.
425 With a third integer argument, retrieves a string buffer of that size;
426 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000427
428static object *
429sock_getsockopt(s, args)
430 sockobject *s;
431 object *args;
432{
433 int level;
434 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000435 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000436 object *buf;
437 int buflen;
438 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000439
Guido van Rossumaee08791992-09-08 09:05:33 +0000440 if (getargs(args, "(ii)", &level, &optname)) {
441 int flag = 0;
442 int flagsize = sizeof flag;
443 res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize);
444 if (res < 0)
445 return socket_error();
446 return newintobject(flag);
447 }
448 err_clear();
449 if (!getargs(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000450 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000451 if (buflen <= 0 || buflen > 1024) {
452 err_setstr(SocketError, "getsockopt buflen out of range");
453 return NULL;
454 }
455 buf = newsizedstringobject((char *)NULL, buflen);
456 if (buf == NULL)
457 return NULL;
458 res = getsockopt(s->sock_fd, level, optname, getstringvalue(buf),
459 &buflen);
460 if (res < 0) {
461 DECREF(buf);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000462 return socket_error();
Guido van Rossumaee08791992-09-08 09:05:33 +0000463 }
464 resizestring(&buf, buflen);
465 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000466}
467
468
Guido van Rossum81194471991-07-27 21:42:02 +0000469/* s.avail() method */
470
471static object *
472sock_avail(s, args)
473 sockobject *s;
474 object *args;
475{
476 struct timeval timeout;
477 fd_set readers;
478 int n;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000479 if (!getnoarg(args))
480 return NULL;
Guido van Rossum81194471991-07-27 21:42:02 +0000481 timeout.tv_sec = 0;
482 timeout.tv_usec = 0;
483 FD_ZERO(&readers);
484 FD_SET(s->sock_fd, &readers);
485 n = select(s->sock_fd+1, &readers, (fd_set *)0, (fd_set *)0, &timeout);
486 if (n < 0)
487 return socket_error();
488 return newintobject((long) (n != 0));
489}
490
491
Guido van Rossum30a685f1991-06-27 15:51:29 +0000492/* s.bind(sockaddr) method */
493
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494static object *
495sock_bind(s, args)
496 sockobject *s;
497 object *args;
498{
499 struct sockaddr *addr;
500 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000501 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000502 if (!getsockaddrarg(s, args, &addr, &addrlen))
503 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000504 BGN_SAVE
505 res = bind(s->sock_fd, addr, addrlen);
506 END_SAVE
507 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000508 return socket_error();
509 INCREF(None);
510 return None;
511}
512
Guido van Rossum30a685f1991-06-27 15:51:29 +0000513
514/* s.close() method.
515 Set the file descriptor to -1 so operations tried subsequently
516 will surely fail. */
517
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518static object *
519sock_close(s, args)
520 sockobject *s;
521 object *args;
522{
523 if (!getnoarg(args))
524 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000525 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000526 (void) close(s->sock_fd);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000527 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000528 s->sock_fd = -1;
529 INCREF(None);
530 return None;
531}
532
Guido van Rossum30a685f1991-06-27 15:51:29 +0000533
534/* s.connect(sockaddr) method */
535
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000536static object *
537sock_connect(s, args)
538 sockobject *s;
539 object *args;
540{
541 struct sockaddr *addr;
542 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000543 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000544 if (!getsockaddrarg(s, args, &addr, &addrlen))
545 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000546 BGN_SAVE
547 res = connect(s->sock_fd, addr, addrlen);
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
Guido van Rossumed233a51992-06-23 09:07:03 +0000556/* s.fileno() method */
557
558static object *
559sock_fileno(s, args)
560 sockobject *s;
561 object *args;
562{
563 if (!getnoarg(args))
564 return NULL;
565 return newintobject((long) s->sock_fd);
566}
567
568
Guido van Rossumc89705d1992-11-26 08:54:07 +0000569/* s.getsockname() method */
570
571static object *
572sock_getsockname(s, args)
573 sockobject *s;
574 object *args;
575{
576 char addrbuf[256];
577 int addrlen, res;
578 if (!getnoarg(args))
579 return NULL;
580 if (!getsockaddrlen(s, &addrlen))
581 return NULL;
582 BGN_SAVE
583 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
584 END_SAVE
585 if (res < 0)
586 return socket_error();
587 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
588}
589
590
591/* s.getpeername() method */
592
593static object *
594sock_getpeername(s, args)
595 sockobject *s;
596 object *args;
597{
598 char addrbuf[256];
599 int addrlen, res;
600 if (!getnoarg(args))
601 return NULL;
602 if (!getsockaddrlen(s, &addrlen))
603 return NULL;
604 BGN_SAVE
605 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
606 END_SAVE
607 if (res < 0)
608 return socket_error();
609 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
610}
611
612
Guido van Rossum30a685f1991-06-27 15:51:29 +0000613/* s.listen(n) method */
614
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000615static object *
616sock_listen(s, args)
617 sockobject *s;
618 object *args;
619{
620 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000621 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000622 if (!getintarg(args, &backlog))
623 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000624 BGN_SAVE
625 res = listen(s->sock_fd, backlog);
626 END_SAVE
627 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000628 return socket_error();
629 INCREF(None);
630 return None;
631}
632
Guido van Rossum30a685f1991-06-27 15:51:29 +0000633
634/* s.makefile(mode) method.
635 Create a new open file object referring to a dupped version of
636 the socket's file descriptor. (The dup() call is necessary so
637 that the open file and socket objects may be closed independent
638 of each other.)
639 The mode argument specifies 'r' or 'w' passed to fdopen(). */
640
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641static object *
Guido van Rossum30a685f1991-06-27 15:51:29 +0000642sock_makefile(s, args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000643 sockobject *s;
644 object *args;
645{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000646 extern int fclose PROTO((FILE *));
Guido van Rossumff4949e1992-08-05 19:58:53 +0000647 char *mode;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000648 int fd;
649 FILE *fp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000650 if (!getargs(args, "s", &mode))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000651 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000652 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossumff4949e1992-08-05 19:58:53 +0000653 (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000654 return socket_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000655 return newopenfileobject(fp, "<socket>", mode, fclose);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000656}
657
658
659/* s.recv(nbytes) method */
660
661static object *
662sock_recv(s, args)
663 sockobject *s;
664 object *args;
665{
666 int len, n, flags;
667 object *buf;
668 if (!getintintarg(args, &len, &flags)) {
669 err_clear();
670 if (!getintarg(args, &len))
671 return NULL;
672 flags = 0;
673 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000674 buf = newsizedstringobject((char *) 0, len);
675 if (buf == NULL)
676 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000677 BGN_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000678 n = recv(s->sock_fd, getstringvalue(buf), len, flags);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000679 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000680 if (n < 0)
681 return socket_error();
682 if (resizestring(&buf, n) < 0)
683 return NULL;
684 return buf;
685}
686
Guido van Rossum30a685f1991-06-27 15:51:29 +0000687
688/* s.recvfrom(nbytes) method */
689
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000690static object *
691sock_recvfrom(s, args)
692 sockobject *s;
693 object *args;
694{
695 char addrbuf[256];
696 object *buf;
697 int addrlen, len, n;
698 if (!getintarg(args, &len))
699 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000700 if (!getsockaddrlen(s, &addrlen))
701 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702 buf = newsizedstringobject((char *) 0, len);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000703 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000704 n = recvfrom(s->sock_fd, getstringvalue(buf), len, 0,
705 addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000706 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000707 if (n < 0)
708 return socket_error();
709 if (resizestring(&buf, n) < 0)
710 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000711 return mkvalue("OO", buf,
Guido van Rossumd15b7331992-03-27 17:22:00 +0000712 makesockaddr((struct sockaddr *)addrbuf, addrlen));
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000713}
714
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715
716/* s.send(data) method */
717
718static object *
719sock_send(s, args)
720 sockobject *s;
721 object *args;
722{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000723 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000724 int len, n, flags;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000725 if (!getargs(args, "(s#i)", &buf, &len, &flags)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000726 err_clear();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000727 if (!getargs(args, "s#", &buf, &len))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000728 return NULL;
729 flags = 0;
730 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000731 BGN_SAVE
732 n = send(s->sock_fd, buf, len, flags);
733 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000734 if (n < 0)
735 return socket_error();
736 INCREF(None);
737 return None;
738}
739
740
741/* s.sendto(data, sockaddr) method */
742
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000743static object *
744sock_sendto(s, args)
745 sockobject *s;
746 object *args;
747{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000748 object *addro;
749 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000750 struct sockaddr *addr;
751 int addrlen, len, n;
752 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
753 err_badarg();
754 return NULL;
755 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000756 if (!getargs(args, "(s#O)", &buf, &len, &addro) ||
757 !getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000758 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000759 BGN_SAVE
760 n = sendto(s->sock_fd, buf, len, 0, addr, addrlen);
761 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762 if (n < 0)
763 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764 INCREF(None);
765 return None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000766}
767
Guido van Rossum30a685f1991-06-27 15:51:29 +0000768
769/* s.shutdown(how) method */
770
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000771static object *
772sock_shutdown(s, args)
773 sockobject *s;
774 object *args;
775{
776 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000777 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778 if (!getintarg(args, &how))
779 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000780 BGN_SAVE
781 res = shutdown(s->sock_fd, how);
782 END_SAVE
783 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000784 return socket_error();
785 INCREF(None);
786 return None;
787}
788
Guido van Rossum30a685f1991-06-27 15:51:29 +0000789
790/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791
792static struct methodlist sock_methods[] = {
793 {"accept", sock_accept},
Guido van Rossum81194471991-07-27 21:42:02 +0000794 {"avail", sock_avail},
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000795 {"allowbroadcast", sock_allowbroadcast},
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000796 {"setsockopt", sock_setsockopt},
797 {"getsockopt", sock_getsockopt},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000798 {"bind", sock_bind},
799 {"close", sock_close},
800 {"connect", sock_connect},
Guido van Rossumed233a51992-06-23 09:07:03 +0000801 {"fileno", sock_fileno},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000802 {"getsockname", sock_getsockname},
803 {"getpeername", sock_getpeername},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000804 {"listen", sock_listen},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000805 {"makefile", sock_makefile},
806 {"recv", sock_recv},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807 {"recvfrom", sock_recvfrom},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000808 {"send", sock_send},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000809 {"sendto", sock_sendto},
810 {"shutdown", sock_shutdown},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000811 {NULL, NULL} /* sentinel */
812};
813
Guido van Rossum30a685f1991-06-27 15:51:29 +0000814
815/* Deallocate a socket object in response to the last DECREF().
816 First close the file description. */
817
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000818static void
819sock_dealloc(s)
820 sockobject *s;
821{
822 (void) close(s->sock_fd);
823 DEL(s);
824}
825
Guido van Rossum30a685f1991-06-27 15:51:29 +0000826
827/* Return a socket object's named attribute. */
828
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829static object *
830sock_getattr(s, name)
831 sockobject *s;
832 char *name;
833{
834 return findmethod(sock_methods, (object *) s, name);
835}
836
Guido van Rossum30a685f1991-06-27 15:51:29 +0000837
838/* Type object for socket objects.
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000839 XXX This should be static, but some compilers don't grok the
840 XXX forward reference to it in that case... */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000841
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000842typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000843 OB_HEAD_INIT(&Typetype)
844 0,
845 "socket",
846 sizeof(sockobject),
847 0,
848 sock_dealloc, /*tp_dealloc*/
849 0, /*tp_print*/
850 sock_getattr, /*tp_getattr*/
851 0, /*tp_setattr*/
852 0, /*tp_compare*/
853 0, /*tp_repr*/
854 0, /*tp_as_number*/
855 0, /*tp_as_sequence*/
856 0, /*tp_as_mapping*/
857};
858
Guido van Rossum30a685f1991-06-27 15:51:29 +0000859
Guido van Rossum81194471991-07-27 21:42:02 +0000860/* Python interface to gethostname(). */
861
862/*ARGSUSED*/
863static object *
864socket_gethostname(self, args)
865 object *self;
866 object *args;
867{
868 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000869 int res;
Guido van Rossum81194471991-07-27 21:42:02 +0000870 if (!getnoarg(args))
871 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000872 BGN_SAVE
873 res = gethostname(buf, (int) sizeof buf - 1);
874 END_SAVE
875 if (res < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000876 return socket_error();
877 buf[sizeof buf - 1] = '\0';
878 return newstringobject(buf);
879}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000880
881
Guido van Rossum30a685f1991-06-27 15:51:29 +0000882/* Python interface to gethostbyname(name). */
883
884/*ARGSUSED*/
885static object *
886socket_gethostbyname(self, args)
887 object *self;
888 object *args;
889{
890 object *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000891 struct sockaddr_in addrbuf;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000892 if (!getargs(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000893 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000894 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000895 return NULL;
896 return makeipaddr(&addrbuf);
897}
898
899
900/* Python interface to getservbyname(name).
901 This only returns the port number, since the other info is already
902 known or not useful (like the list of aliases). */
903
904/*ARGSUSED*/
905static object *
906socket_getservbyname(self, args)
907 object *self;
908 object *args;
909{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000910 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911 struct servent *sp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000912 if (!getargs(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000913 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000914 BGN_SAVE
915 sp = getservbyname(name, proto);
916 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000917 if (sp == NULL) {
918 err_setstr(SocketError, "service/proto not found");
919 return NULL;
920 }
921 return newintobject((long) ntohs(sp->s_port));
922}
923
924
925/* Python interface to socket(family, type, proto).
926 The third (protocol) argument is optional.
927 Return a new socket object. */
928
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000929/*ARGSUSED*/
930static object *
931socket_socket(self, args)
932 object *self;
933 object *args;
934{
935 sockobject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000936 int fd, family, type, proto;
937 proto = 0;
938 if (!getargs(args, "(ii)", &family, &type)) {
939 err_clear();
940 if (!getargs(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000941 return NULL;
942 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000943 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944 fd = socket(family, type, proto);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000945 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000946 if (fd < 0)
947 return socket_error();
948 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000949 /* If the object can't be created, don't forget to close the
950 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000951 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000952 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +0000953 /* From now on, ignore SIGPIPE and let the error checking
954 do the work. */
955 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000956 return (object *) s;
957}
958
Guido van Rossum30a685f1991-06-27 15:51:29 +0000959
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000960/* Create a socket object from a numeric file description.
961 Useful e.g. if stdin is a socket.
962 Additional arguments as for socket(). */
963
964/*ARGSUSED*/
965static object *
966socket_fromfd(self, args)
967 object *self;
968 object *args;
969{
970 sockobject *s;
971 int fd, family, type, proto;
972 proto = 0;
973 if (!getargs(args, "(iii)", &fd, &family, &type)) {
974 err_clear();
975 if (!getargs(args, "(iiii)", &fd, &family, &type, &proto))
976 return NULL;
977 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000978 /* Dup the fd so it and the socket can be closed independently */
979 fd = dup(fd);
980 if (fd < 0)
981 return socket_error();
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000982 s = newsockobject(fd, family, type, proto);
983 /* From now on, ignore SIGPIPE and let the error checking
984 do the work. */
985 (void) signal(SIGPIPE, SIG_IGN);
986 return (object *) s;
987}
988
989
Guido van Rossum30a685f1991-06-27 15:51:29 +0000990/* List of functions exported by this module. */
991
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000992static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000993 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +0000994 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000995 {"getservbyname", socket_getservbyname},
996 {"socket", socket_socket},
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000997 {"fromfd", socket_fromfd},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000998 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000999};
1000
Guido van Rossum30a685f1991-06-27 15:51:29 +00001001
1002/* Convenience routine to export an integer value.
1003 For simplicity, errors (which are unlikely anyway) are ignored. */
1004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001005static void
1006insint(d, name, value)
1007 object *d;
1008 char *name;
1009 int value;
1010{
1011 object *v = newintobject((long) value);
1012 if (v == NULL) {
1013 /* Don't bother reporting this error */
1014 err_clear();
1015 }
1016 else {
1017 dictinsert(d, name, v);
1018 DECREF(v);
1019 }
1020}
1021
Guido van Rossum30a685f1991-06-27 15:51:29 +00001022
1023/* Initialize this module.
1024 This is called when the first 'import socket' is done,
1025 via a table in config.c, if config.c is compiled with USE_SOCKET
1026 defined. */
1027
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001028void
1029initsocket()
1030{
1031 object *m, *d;
1032
1033 m = initmodule("socket", socket_methods);
1034 d = getmoduledict(m);
1035 SocketError = newstringobject("socket.error");
1036 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
1037 fatal("can't define socket.error");
1038 insint(d, "AF_INET", AF_INET);
1039 insint(d, "AF_UNIX", AF_UNIX);
1040 insint(d, "SOCK_STREAM", SOCK_STREAM);
1041 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1042 insint(d, "SOCK_RAW", SOCK_RAW);
1043 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1044 insint(d, "SOCK_RDM", SOCK_RDM);
1045}