blob: e2328fb9543f717385dc50a8568a45bb8771cc99 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossume5372401993-03-16 12:15:04 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Socket module */
26
27/*
28This module provides an interface to Berkeley socket IPC.
29
30Limitations:
31
Guido van Rossum30a685f1991-06-27 15:51:29 +000032- only AF_INET and AF_UNIX address families are supported
Guido van 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 Rossum9575a441993-04-07 14:06:14 +000085#ifdef i860
86/* Cray APP doesn't have getpeername() */
87#define NO_GETPEERNAME
88#endif
89
Guido van Rossum30a685f1991-06-27 15:51:29 +000090
91/* Global variable holding the exception type for errors detected
92 by this module (but not argument type or memory errors, etc.). */
93
94static object *SocketError;
95
96
97/* Convenience function to raise an error according to errno
98 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +000099
100static object *
101socket_error()
102{
103 return err_errno(SocketError);
104}
105
Guido van Rossum30a685f1991-06-27 15:51:29 +0000106
107/* The object holding a socket. It holds some extra information,
108 like the address family, which is used to decode socket address
109 arguments properly. */
110
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000111typedef struct {
112 OB_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000113 int sock_fd; /* Socket file descriptor */
114 int sock_family; /* Address family, e.g., AF_INET */
115 int sock_type; /* Socket type, e.g., SOCK_STREAM */
116 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000117} sockobject;
118
Guido van Rossum30a685f1991-06-27 15:51:29 +0000119
120/* A forward reference to the Socktype type object.
121 The Socktype variable contains pointers to various functions,
122 some of which call newsocobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000123 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000124
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000125extern typeobject Socktype; /* Forward */
126
Guido van Rossum30a685f1991-06-27 15:51:29 +0000127
128/* Create a new socket object.
129 This just creates the object and initializes it.
130 If the creation fails, return NULL and set an exception (implicit
131 in NEWOBJ()). */
132
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000133static sockobject *
134newsockobject(fd, family, type, proto)
135 int fd, family, type, proto;
136{
137 sockobject *s;
138 s = NEWOBJ(sockobject, &Socktype);
139 if (s != NULL) {
140 s->sock_fd = fd;
141 s->sock_family = family;
142 s->sock_type = type;
143 s->sock_proto = proto;
144 }
145 return s;
146}
147
Guido van Rossum30a685f1991-06-27 15:51:29 +0000148
149/* Convert a string specifying a host name or one of a few symbolic
150 names to a numeric IP address. This usually calls gethostbyname()
151 to do the work; the names "" and "<broadcast>" are special.
152 Return the length (should always be 4 bytes), or negative if
153 an error occurred; then an exception is raised. */
154
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000155static int
Guido van Rossum30a685f1991-06-27 15:51:29 +0000156setipaddr(name, addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000157 char *name;
158 struct sockaddr_in *addr_ret;
159{
160 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000161 int d1, d2, d3, d4;
162 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000163
Guido van Rossum30a685f1991-06-27 15:51:29 +0000164 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000165 addr_ret->sin_addr.s_addr = INADDR_ANY;
166 return 4;
167 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000168 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000169 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
170 return 4;
171 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000172 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
173 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
174 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
175 addr_ret->sin_addr.s_addr = htonl(
176 ((long) d1 << 24) | ((long) d2 << 16) |
177 ((long) d3 << 8) | ((long) d4 << 0));
178 return 4;
179 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000180 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000181 hp = gethostbyname(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000182 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000183 if (hp == NULL) {
184 err_setstr(SocketError, "host not found");
185 return -1;
186 }
187 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
188 return hp->h_length;
189}
190
Guido van Rossum30a685f1991-06-27 15:51:29 +0000191
Guido van Rossum30a685f1991-06-27 15:51:29 +0000192/* Create a string object representing an IP address.
193 This is always a string of the form 'dd.dd.dd.dd' (with variable
194 size numbers). */
195
196static object *
197makeipaddr(addr)
198 struct sockaddr_in *addr;
199{
200 long x = ntohl(addr->sin_addr.s_addr);
201 char buf[100];
202 sprintf(buf, "%d.%d.%d.%d",
203 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
204 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
205 return newstringobject(buf);
206}
207
208
209/* Create an object representing the given socket address,
210 suitable for passing it back to bind(), connect() etc.
211 The family field of the sockaddr structure is inspected
212 to determine what kind of address it really is. */
213
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000214/*ARGSUSED*/
215static object *
216makesockaddr(addr, addrlen)
217 struct sockaddr *addr;
218 int addrlen;
219{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000220 if (addrlen == 0) {
221 /* No address -- may be recvfrom() from known socket */
222 INCREF(None);
223 return None;
224 }
225
Guido van Rossum30a685f1991-06-27 15:51:29 +0000226 switch (addr->sa_family) {
227
228 case AF_INET:
229 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000230 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000231 object *addr = makeipaddr(a);
232 object *ret = mkvalue("Oi", addr, ntohs(a->sin_port));
233 XDECREF(addr);
234 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000235 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000236
237 case AF_UNIX:
238 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000239 struct sockaddr_un *a = (struct sockaddr_un *) addr;
240 return newstringobject(a->sun_path);
241 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000242
243 /* More cases here... */
244
245 default:
246 err_setstr(SocketError, "return unknown socket address type");
247 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000248
Guido van Rossum30a685f1991-06-27 15:51:29 +0000249 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000250}
251
Guido van Rossum30a685f1991-06-27 15:51:29 +0000252
253/* Parse a socket address argument according to the socket object's
254 address family. Return 1 if the address was in the proper format,
255 0 of not. The address is returned through addr_ret, its length
256 through len_ret. */
257
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000258static int
259getsockaddrarg(s, args, addr_ret, len_ret)
260 sockobject *s;
261 object *args;
262 struct sockaddr **addr_ret;
263 int *len_ret;
264{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000265 switch (s->sock_family) {
266
267 case AF_UNIX:
268 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000269 static struct sockaddr_un addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000270 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000271 int len;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000272 if (!getargs(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000273 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000274 if (len > sizeof addr.sun_path) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000275 err_setstr(SocketError, "AF_UNIX path too long");
276 return 0;
277 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000278 addr.sun_family = AF_UNIX;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000279 memcpy(addr.sun_path, path, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000280 *addr_ret = (struct sockaddr *) &addr;
281 *len_ret = len + sizeof addr.sun_family;
282 return 1;
283 }
284
Guido van Rossum30a685f1991-06-27 15:51:29 +0000285 case AF_INET:
286 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000287 static struct sockaddr_in addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000288 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000289 int port;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000290 if (!getargs(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000291 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000292 if (setipaddr(host, &addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000293 return 0;
294 addr.sin_family = AF_INET;
295 addr.sin_port = htons(port);
296 *addr_ret = (struct sockaddr *) &addr;
297 *len_ret = sizeof addr;
298 return 1;
299 }
300
Guido van Rossum30a685f1991-06-27 15:51:29 +0000301 /* More cases here... */
302
303 default:
304 err_setstr(SocketError, "getsockaddrarg: bad family");
305 return 0;
306
307 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000308}
309
Guido van Rossum30a685f1991-06-27 15:51:29 +0000310
Guido van Rossum710e1df1992-06-12 10:39:36 +0000311/* Get the address length according to the socket object's address family.
312 Return 1 if the family is known, 0 otherwise. The length is returned
313 through len_ret. */
314
315static int
316getsockaddrlen(s, len_ret)
317 sockobject *s;
318 int *len_ret;
319{
320 switch (s->sock_family) {
321
322 case AF_UNIX:
323 {
324 *len_ret = sizeof (struct sockaddr_un);
325 return 1;
326 }
327
328 case AF_INET:
329 {
330 *len_ret = sizeof (struct sockaddr_in);
331 return 1;
332 }
333
334 /* More cases here... */
335
336 default:
337 err_setstr(SocketError, "getsockaddrarg: bad family");
338 return 0;
339
340 }
341}
342
343
Guido van Rossum30a685f1991-06-27 15:51:29 +0000344/* s.accept() method */
345
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000346static object *
347sock_accept(s, args)
348 sockobject *s;
349 object *args;
350{
351 char addrbuf[256];
352 int addrlen, newfd;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000353 object *sock, *addr, *res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000354 if (!getnoarg(args))
355 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000356 if (!getsockaddrlen(s, &addrlen))
357 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000358 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000359 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000360 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000361 if (newfd < 0)
362 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000363 /* Create the new object with unspecified family,
364 to avoid calls to bind() etc. on it. */
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000365 sock = (object *) newsockobject(newfd,
366 s->sock_family,
367 s->sock_type,
368 s->sock_proto);
369 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000370 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000371 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
372 res = mkvalue("OO", sock, addr);
373 XDECREF(sock);
374 XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000375 return res;
376}
377
Guido van Rossum30a685f1991-06-27 15:51:29 +0000378
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000379/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000380/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000381
382static object *
383sock_allowbroadcast(s, args)
384 sockobject *s;
385 object *args;
386{
387 int flag;
388 int res;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000389 if (!getargs(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000390 return NULL;
391 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
392 &flag, sizeof flag);
393 if (res < 0)
394 return socket_error();
395 INCREF(None);
396 return None;
397}
398
399
Guido van Rossumaee08791992-09-08 09:05:33 +0000400/* s.setsockopt() method.
401 With an integer third argument, sets an integer option.
402 With a string third argument, sets an option from a buffer;
403 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000404
405static object *
406sock_setsockopt(s, args)
407 sockobject *s;
408 object *args;
409{
410 int level;
411 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000412 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000413 char *buf;
414 int buflen;
415 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000416
Guido van Rossumaee08791992-09-08 09:05:33 +0000417 if (getargs(args, "(iii)", &level, &optname, &flag)) {
418 buf = (char *) &flag;
419 buflen = sizeof flag;
420 }
421 else {
422 err_clear();
423 if (!getargs(args, "(iis#)", &level, &optname, &buf, &buflen))
424 return NULL;
425 }
426 res = setsockopt(s->sock_fd, level, optname, buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000427 if (res < 0)
428 return socket_error();
429 INCREF(None);
430 return None;
431}
432
433
Guido van Rossumaee08791992-09-08 09:05:33 +0000434/* s.getsockopt() method.
435 With two arguments, retrieves an integer option.
436 With a third integer argument, retrieves a string buffer of that size;
437 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000438
439static object *
440sock_getsockopt(s, args)
441 sockobject *s;
442 object *args;
443{
444 int level;
445 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000446 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000447 object *buf;
448 int buflen;
449 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000450
Guido van Rossumaee08791992-09-08 09:05:33 +0000451 if (getargs(args, "(ii)", &level, &optname)) {
452 int flag = 0;
453 int flagsize = sizeof flag;
454 res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize);
455 if (res < 0)
456 return socket_error();
457 return newintobject(flag);
458 }
459 err_clear();
460 if (!getargs(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000461 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000462 if (buflen <= 0 || buflen > 1024) {
463 err_setstr(SocketError, "getsockopt buflen out of range");
464 return NULL;
465 }
466 buf = newsizedstringobject((char *)NULL, buflen);
467 if (buf == NULL)
468 return NULL;
469 res = getsockopt(s->sock_fd, level, optname, getstringvalue(buf),
470 &buflen);
471 if (res < 0) {
472 DECREF(buf);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000473 return socket_error();
Guido van Rossumaee08791992-09-08 09:05:33 +0000474 }
475 resizestring(&buf, buflen);
476 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000477}
478
479
Guido van Rossum81194471991-07-27 21:42:02 +0000480/* s.avail() method */
481
482static object *
483sock_avail(s, args)
484 sockobject *s;
485 object *args;
486{
487 struct timeval timeout;
488 fd_set readers;
489 int n;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000490 if (!getnoarg(args))
491 return NULL;
Guido van Rossum81194471991-07-27 21:42:02 +0000492 timeout.tv_sec = 0;
493 timeout.tv_usec = 0;
494 FD_ZERO(&readers);
495 FD_SET(s->sock_fd, &readers);
496 n = select(s->sock_fd+1, &readers, (fd_set *)0, (fd_set *)0, &timeout);
497 if (n < 0)
498 return socket_error();
499 return newintobject((long) (n != 0));
500}
501
502
Guido van Rossum30a685f1991-06-27 15:51:29 +0000503/* s.bind(sockaddr) method */
504
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000505static object *
506sock_bind(s, args)
507 sockobject *s;
508 object *args;
509{
510 struct sockaddr *addr;
511 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000512 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000513 if (!getsockaddrarg(s, args, &addr, &addrlen))
514 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000515 BGN_SAVE
516 res = bind(s->sock_fd, addr, addrlen);
517 END_SAVE
518 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000519 return socket_error();
520 INCREF(None);
521 return None;
522}
523
Guido van Rossum30a685f1991-06-27 15:51:29 +0000524
525/* s.close() method.
526 Set the file descriptor to -1 so operations tried subsequently
527 will surely fail. */
528
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000529static object *
530sock_close(s, args)
531 sockobject *s;
532 object *args;
533{
534 if (!getnoarg(args))
535 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000536 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000537 (void) close(s->sock_fd);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000538 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000539 s->sock_fd = -1;
540 INCREF(None);
541 return None;
542}
543
Guido van Rossum30a685f1991-06-27 15:51:29 +0000544
545/* s.connect(sockaddr) method */
546
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000547static object *
548sock_connect(s, args)
549 sockobject *s;
550 object *args;
551{
552 struct sockaddr *addr;
553 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000554 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000555 if (!getsockaddrarg(s, args, &addr, &addrlen))
556 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000557 BGN_SAVE
558 res = connect(s->sock_fd, addr, addrlen);
559 END_SAVE
560 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000561 return socket_error();
562 INCREF(None);
563 return None;
564}
565
Guido van Rossum30a685f1991-06-27 15:51:29 +0000566
Guido van Rossumed233a51992-06-23 09:07:03 +0000567/* s.fileno() method */
568
569static object *
570sock_fileno(s, args)
571 sockobject *s;
572 object *args;
573{
574 if (!getnoarg(args))
575 return NULL;
576 return newintobject((long) s->sock_fd);
577}
578
579
Guido van Rossumc89705d1992-11-26 08:54:07 +0000580/* s.getsockname() method */
581
582static object *
583sock_getsockname(s, args)
584 sockobject *s;
585 object *args;
586{
587 char addrbuf[256];
588 int addrlen, res;
589 if (!getnoarg(args))
590 return NULL;
591 if (!getsockaddrlen(s, &addrlen))
592 return NULL;
593 BGN_SAVE
594 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
595 END_SAVE
596 if (res < 0)
597 return socket_error();
598 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
599}
600
601
Guido van Rossum9575a441993-04-07 14:06:14 +0000602#ifndef NO_GETPEERNAME
Guido van Rossumc89705d1992-11-26 08:54:07 +0000603/* s.getpeername() method */
604
605static object *
606sock_getpeername(s, args)
607 sockobject *s;
608 object *args;
609{
610 char addrbuf[256];
611 int addrlen, res;
612 if (!getnoarg(args))
613 return NULL;
614 if (!getsockaddrlen(s, &addrlen))
615 return NULL;
616 BGN_SAVE
617 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
618 END_SAVE
619 if (res < 0)
620 return socket_error();
621 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
622}
Guido van Rossum9575a441993-04-07 14:06:14 +0000623#endif
Guido van Rossumc89705d1992-11-26 08:54:07 +0000624
625
Guido van Rossum30a685f1991-06-27 15:51:29 +0000626/* s.listen(n) method */
627
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000628static object *
629sock_listen(s, args)
630 sockobject *s;
631 object *args;
632{
633 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000634 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000635 if (!getintarg(args, &backlog))
636 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000637 BGN_SAVE
638 res = listen(s->sock_fd, backlog);
639 END_SAVE
640 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000641 return socket_error();
642 INCREF(None);
643 return None;
644}
645
Guido van Rossum30a685f1991-06-27 15:51:29 +0000646
647/* s.makefile(mode) method.
648 Create a new open file object referring to a dupped version of
649 the socket's file descriptor. (The dup() call is necessary so
650 that the open file and socket objects may be closed independent
651 of each other.)
652 The mode argument specifies 'r' or 'w' passed to fdopen(). */
653
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000654static object *
Guido van Rossum30a685f1991-06-27 15:51:29 +0000655sock_makefile(s, args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000656 sockobject *s;
657 object *args;
658{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000659 extern int fclose PROTO((FILE *));
Guido van Rossumff4949e1992-08-05 19:58:53 +0000660 char *mode;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000661 int fd;
662 FILE *fp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000663 if (!getargs(args, "s", &mode))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000664 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000665 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossumff4949e1992-08-05 19:58:53 +0000666 (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000667 return socket_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000668 return newopenfileobject(fp, "<socket>", mode, fclose);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000669}
670
671
672/* s.recv(nbytes) method */
673
674static object *
675sock_recv(s, args)
676 sockobject *s;
677 object *args;
678{
679 int len, n, flags;
680 object *buf;
681 if (!getintintarg(args, &len, &flags)) {
682 err_clear();
683 if (!getintarg(args, &len))
684 return NULL;
685 flags = 0;
686 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000687 buf = newsizedstringobject((char *) 0, len);
688 if (buf == NULL)
689 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000690 BGN_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000691 n = recv(s->sock_fd, getstringvalue(buf), len, flags);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000692 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000693 if (n < 0)
694 return socket_error();
695 if (resizestring(&buf, n) < 0)
696 return NULL;
697 return buf;
698}
699
Guido van Rossum30a685f1991-06-27 15:51:29 +0000700
701/* s.recvfrom(nbytes) method */
702
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703static object *
704sock_recvfrom(s, args)
705 sockobject *s;
706 object *args;
707{
708 char addrbuf[256];
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000709 object *buf, *addr, *ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000710 int addrlen, len, n;
711 if (!getintarg(args, &len))
712 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000713 if (!getsockaddrlen(s, &addrlen))
714 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000715 buf = newsizedstringobject((char *) 0, len);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000716 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000717 n = recvfrom(s->sock_fd, getstringvalue(buf), len, 0,
718 addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000719 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000720 if (n < 0)
721 return socket_error();
722 if (resizestring(&buf, n) < 0)
723 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000724 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
725 ret = mkvalue("OO", buf, addr);
726 XDECREF(addr);
727 XDECREF(buf);
728 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000729}
730
Guido van Rossum30a685f1991-06-27 15:51:29 +0000731
732/* s.send(data) method */
733
734static object *
735sock_send(s, args)
736 sockobject *s;
737 object *args;
738{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000739 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000740 int len, n, flags;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000741 if (!getargs(args, "(s#i)", &buf, &len, &flags)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000742 err_clear();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000743 if (!getargs(args, "s#", &buf, &len))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000744 return NULL;
745 flags = 0;
746 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000747 BGN_SAVE
748 n = send(s->sock_fd, buf, len, flags);
749 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000750 if (n < 0)
751 return socket_error();
752 INCREF(None);
753 return None;
754}
755
756
757/* s.sendto(data, sockaddr) method */
758
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000759static object *
760sock_sendto(s, args)
761 sockobject *s;
762 object *args;
763{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000764 object *addro;
765 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000766 struct sockaddr *addr;
767 int addrlen, len, n;
768 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
769 err_badarg();
770 return NULL;
771 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000772 if (!getargs(args, "(s#O)", &buf, &len, &addro) ||
773 !getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000774 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000775 BGN_SAVE
776 n = sendto(s->sock_fd, buf, len, 0, addr, addrlen);
777 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778 if (n < 0)
779 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000780 INCREF(None);
781 return None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000782}
783
Guido van Rossum30a685f1991-06-27 15:51:29 +0000784
785/* s.shutdown(how) method */
786
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000787static object *
788sock_shutdown(s, args)
789 sockobject *s;
790 object *args;
791{
792 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000793 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794 if (!getintarg(args, &how))
795 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000796 BGN_SAVE
797 res = shutdown(s->sock_fd, how);
798 END_SAVE
799 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800 return socket_error();
801 INCREF(None);
802 return None;
803}
804
Guido van Rossum30a685f1991-06-27 15:51:29 +0000805
806/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807
808static struct methodlist sock_methods[] = {
809 {"accept", sock_accept},
Guido van Rossum81194471991-07-27 21:42:02 +0000810 {"avail", sock_avail},
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000811 {"allowbroadcast", sock_allowbroadcast},
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000812 {"setsockopt", sock_setsockopt},
813 {"getsockopt", sock_getsockopt},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000814 {"bind", sock_bind},
815 {"close", sock_close},
816 {"connect", sock_connect},
Guido van Rossumed233a51992-06-23 09:07:03 +0000817 {"fileno", sock_fileno},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000818 {"getsockname", sock_getsockname},
Guido van Rossum9575a441993-04-07 14:06:14 +0000819#ifndef NO_GETPEERNAME
Guido van Rossumc89705d1992-11-26 08:54:07 +0000820 {"getpeername", sock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000821#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822 {"listen", sock_listen},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823 {"makefile", sock_makefile},
824 {"recv", sock_recv},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000825 {"recvfrom", sock_recvfrom},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000826 {"send", sock_send},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000827 {"sendto", sock_sendto},
828 {"shutdown", sock_shutdown},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829 {NULL, NULL} /* sentinel */
830};
831
Guido van Rossum30a685f1991-06-27 15:51:29 +0000832
833/* Deallocate a socket object in response to the last DECREF().
834 First close the file description. */
835
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000836static void
837sock_dealloc(s)
838 sockobject *s;
839{
840 (void) close(s->sock_fd);
841 DEL(s);
842}
843
Guido van Rossum30a685f1991-06-27 15:51:29 +0000844
845/* Return a socket object's named attribute. */
846
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000847static object *
848sock_getattr(s, name)
849 sockobject *s;
850 char *name;
851{
852 return findmethod(sock_methods, (object *) s, name);
853}
854
Guido van Rossum30a685f1991-06-27 15:51:29 +0000855
856/* Type object for socket objects.
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000857 XXX This should be static, but some compilers don't grok the
858 XXX forward reference to it in that case... */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000859
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000860typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000861 OB_HEAD_INIT(&Typetype)
862 0,
863 "socket",
864 sizeof(sockobject),
865 0,
866 sock_dealloc, /*tp_dealloc*/
867 0, /*tp_print*/
868 sock_getattr, /*tp_getattr*/
869 0, /*tp_setattr*/
870 0, /*tp_compare*/
871 0, /*tp_repr*/
872 0, /*tp_as_number*/
873 0, /*tp_as_sequence*/
874 0, /*tp_as_mapping*/
875};
876
Guido van Rossum30a685f1991-06-27 15:51:29 +0000877
Guido van Rossum81194471991-07-27 21:42:02 +0000878/* Python interface to gethostname(). */
879
880/*ARGSUSED*/
881static object *
882socket_gethostname(self, args)
883 object *self;
884 object *args;
885{
886 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000887 int res;
Guido van Rossum81194471991-07-27 21:42:02 +0000888 if (!getnoarg(args))
889 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000890 BGN_SAVE
891 res = gethostname(buf, (int) sizeof buf - 1);
892 END_SAVE
893 if (res < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000894 return socket_error();
895 buf[sizeof buf - 1] = '\0';
896 return newstringobject(buf);
897}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000898
899
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900/* Python interface to gethostbyname(name). */
901
902/*ARGSUSED*/
903static object *
904socket_gethostbyname(self, args)
905 object *self;
906 object *args;
907{
908 object *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000909 struct sockaddr_in addrbuf;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000910 if (!getargs(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000912 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000913 return NULL;
914 return makeipaddr(&addrbuf);
915}
916
917
918/* Python interface to getservbyname(name).
919 This only returns the port number, since the other info is already
920 known or not useful (like the list of aliases). */
921
922/*ARGSUSED*/
923static object *
924socket_getservbyname(self, args)
925 object *self;
926 object *args;
927{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000928 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000929 struct servent *sp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000930 if (!getargs(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000931 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000932 BGN_SAVE
933 sp = getservbyname(name, proto);
934 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935 if (sp == NULL) {
936 err_setstr(SocketError, "service/proto not found");
937 return NULL;
938 }
939 return newintobject((long) ntohs(sp->s_port));
940}
941
942
943/* Python interface to socket(family, type, proto).
944 The third (protocol) argument is optional.
945 Return a new socket object. */
946
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000947/*ARGSUSED*/
948static object *
949socket_socket(self, args)
950 object *self;
951 object *args;
952{
953 sockobject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000954 int fd, family, type, proto;
955 proto = 0;
956 if (!getargs(args, "(ii)", &family, &type)) {
957 err_clear();
958 if (!getargs(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000959 return NULL;
960 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000961 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000962 fd = socket(family, type, proto);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000963 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000964 if (fd < 0)
965 return socket_error();
966 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000967 /* If the object can't be created, don't forget to close the
968 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000969 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000970 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +0000971 /* From now on, ignore SIGPIPE and let the error checking
972 do the work. */
973 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000974 return (object *) s;
975}
976
Guido van Rossum30a685f1991-06-27 15:51:29 +0000977
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000978/* Create a socket object from a numeric file description.
979 Useful e.g. if stdin is a socket.
980 Additional arguments as for socket(). */
981
982/*ARGSUSED*/
983static object *
984socket_fromfd(self, args)
985 object *self;
986 object *args;
987{
988 sockobject *s;
989 int fd, family, type, proto;
990 proto = 0;
991 if (!getargs(args, "(iii)", &fd, &family, &type)) {
992 err_clear();
993 if (!getargs(args, "(iiii)", &fd, &family, &type, &proto))
994 return NULL;
995 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000996 /* Dup the fd so it and the socket can be closed independently */
997 fd = dup(fd);
998 if (fd < 0)
999 return socket_error();
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001000 s = newsockobject(fd, family, type, proto);
1001 /* From now on, ignore SIGPIPE and let the error checking
1002 do the work. */
1003 (void) signal(SIGPIPE, SIG_IGN);
1004 return (object *) s;
1005}
1006
1007
Guido van Rossum30a685f1991-06-27 15:51:29 +00001008/* List of functions exported by this module. */
1009
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001010static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001011 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +00001012 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001013 {"getservbyname", socket_getservbyname},
1014 {"socket", socket_socket},
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001015 {"fromfd", socket_fromfd},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001016 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001017};
1018
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019
1020/* Convenience routine to export an integer value.
1021 For simplicity, errors (which are unlikely anyway) are ignored. */
1022
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001023static void
1024insint(d, name, value)
1025 object *d;
1026 char *name;
1027 int value;
1028{
1029 object *v = newintobject((long) value);
1030 if (v == NULL) {
1031 /* Don't bother reporting this error */
1032 err_clear();
1033 }
1034 else {
1035 dictinsert(d, name, v);
1036 DECREF(v);
1037 }
1038}
1039
Guido van Rossum30a685f1991-06-27 15:51:29 +00001040
1041/* Initialize this module.
1042 This is called when the first 'import socket' is done,
1043 via a table in config.c, if config.c is compiled with USE_SOCKET
1044 defined. */
1045
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001046void
1047initsocket()
1048{
1049 object *m, *d;
1050
1051 m = initmodule("socket", socket_methods);
1052 d = getmoduledict(m);
1053 SocketError = newstringobject("socket.error");
1054 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
1055 fatal("can't define socket.error");
1056 insint(d, "AF_INET", AF_INET);
1057 insint(d, "AF_UNIX", AF_UNIX);
1058 insint(d, "SOCK_STREAM", SOCK_STREAM);
1059 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1060 insint(d, "SOCK_RAW", SOCK_RAW);
1061 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1062 insint(d, "SOCK_RDM", SOCK_RDM);
1063}