blob: 160c292d8651d0fa45948447fc275561570c5f4b [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 Rossum0e69587d1992-06-05 15:11:30 +000035- setsockopt() and getsockopt() only support integer options
Guido van Rossum6574b3e1991-06-25 21:36:08 +000036
37Interface:
38
Guido van Rossum81194471991-07-27 21:42:02 +000039- socket.gethostname() --> host name (string)
Guido van Rossum30a685f1991-06-27 15:51:29 +000040- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000041- socket.getservbyname(servername, protocolname) --> port number
42- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000043- family and type constants from <socket.h> are accessed as socket.AF_INET etc.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044- errors are reported as the exception socket.error
45- an Internet socket address is a pair (hostname, port)
46 where hostname can be anything recognized by gethostbyname()
47 (including the dd.dd.dd.dd notation) and port is in host byte order
48- where a hostname is returned, the dd.dd.dd.dd notation is used
49- a UNIX domain socket is a string specifying the pathname
50
Guido van Rossum30a685f1991-06-27 15:51:29 +000051Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000052
Guido van Rossum81194471991-07-27 21:42:02 +000053- s.accept() --> new socket object, sockaddr
54- s.avail() --> boolean
Guido van Rossum0e69587d1992-06-05 15:11:30 +000055- s.setsockopt(level, optname, flag) --> None
56- s.getsockopt(level, optname) --> flag
Guido van Rossum30a685f1991-06-27 15:51:29 +000057- s.bind(sockaddr) --> None
58- s.connect(sockaddr) --> None
Guido van Rossumc89705d1992-11-26 08:54:07 +000059- s.getsockname() --> sockaddr
60- s.getpeername() --> sockaddr
Guido van Rossum30a685f1991-06-27 15:51:29 +000061- s.listen(n) --> None
62- s.makefile(mode) --> file object
Guido van Rossumeb6b33a1993-05-25 09:38:27 +000063- s.recv(nbytes [,flags]) --> string
Guido van Rossum18c9a4f1993-05-25 12:16:29 +000064- s.recvfrom(nbytes [,flags]) --> string, sockaddr
Guido van Rossumeb6b33a1993-05-25 09:38:27 +000065- s.send(string [,flags]) --> None
66- s.sendto(string, [flags,] sockaddr) --> None
Guido van Rossum30a685f1991-06-27 15:51:29 +000067- s.shutdown(how) --> None
68- s.close() --> None
69
Guido van Rossum6574b3e1991-06-25 21:36:08 +000070*/
71
72#include "allobjects.h"
73#include "modsupport.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000074#include "ceval.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000075
Guido van Rossumed233a51992-06-23 09:07:03 +000076#include "myselect.h" /* Implies <sys/types.h>, <sys/time.h>, <sys/param.h> */
77
Guido van Rossum81194471991-07-27 21:42:02 +000078#include <signal.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079#include <sys/socket.h>
80#include <netinet/in.h>
81#include <sys/un.h>
82#include <netdb.h>
83
Guido van Rossum9575a441993-04-07 14:06:14 +000084#ifdef i860
85/* Cray APP doesn't have getpeername() */
86#define NO_GETPEERNAME
87#endif
88
Guido van Rossum30a685f1991-06-27 15:51:29 +000089
90/* Global variable holding the exception type for errors detected
91 by this module (but not argument type or memory errors, etc.). */
92
93static object *SocketError;
94
95
96/* Convenience function to raise an error according to errno
97 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +000098
99static object *
100socket_error()
101{
102 return err_errno(SocketError);
103}
104
Guido van Rossum30a685f1991-06-27 15:51:29 +0000105
106/* The object holding a socket. It holds some extra information,
107 like the address family, which is used to decode socket address
108 arguments properly. */
109
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000110typedef struct {
111 OB_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000112 int sock_fd; /* Socket file descriptor */
113 int sock_family; /* Address family, e.g., AF_INET */
114 int sock_type; /* Socket type, e.g., SOCK_STREAM */
115 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000116} sockobject;
117
Guido van Rossum30a685f1991-06-27 15:51:29 +0000118
119/* A forward reference to the Socktype type object.
120 The Socktype variable contains pointers to various functions,
121 some of which call newsocobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000122 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000123
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000124extern typeobject Socktype; /* Forward */
125
Guido van Rossum30a685f1991-06-27 15:51:29 +0000126
127/* Create a new socket object.
128 This just creates the object and initializes it.
129 If the creation fails, return NULL and set an exception (implicit
130 in NEWOBJ()). */
131
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000132static sockobject *
133newsockobject(fd, family, type, proto)
134 int fd, family, type, proto;
135{
136 sockobject *s;
137 s = NEWOBJ(sockobject, &Socktype);
138 if (s != NULL) {
139 s->sock_fd = fd;
140 s->sock_family = family;
141 s->sock_type = type;
142 s->sock_proto = proto;
143 }
144 return s;
145}
146
Guido van Rossum30a685f1991-06-27 15:51:29 +0000147
148/* Convert a string specifying a host name or one of a few symbolic
149 names to a numeric IP address. This usually calls gethostbyname()
150 to do the work; the names "" and "<broadcast>" are special.
151 Return the length (should always be 4 bytes), or negative if
152 an error occurred; then an exception is raised. */
153
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000154static int
Guido van Rossum30a685f1991-06-27 15:51:29 +0000155setipaddr(name, addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000156 char *name;
157 struct sockaddr_in *addr_ret;
158{
159 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000160 int d1, d2, d3, d4;
161 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000162
Guido van Rossum30a685f1991-06-27 15:51:29 +0000163 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000164 addr_ret->sin_addr.s_addr = INADDR_ANY;
165 return 4;
166 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000167 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000168 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
169 return 4;
170 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000171 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
172 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
173 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
174 addr_ret->sin_addr.s_addr = htonl(
175 ((long) d1 << 24) | ((long) d2 << 16) |
176 ((long) d3 << 8) | ((long) d4 << 0));
177 return 4;
178 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000179 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000180 hp = gethostbyname(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000181 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000182 if (hp == NULL) {
183 err_setstr(SocketError, "host not found");
184 return -1;
185 }
186 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
187 return hp->h_length;
188}
189
Guido van Rossum30a685f1991-06-27 15:51:29 +0000190
Guido van Rossum30a685f1991-06-27 15:51:29 +0000191/* Create a string object representing an IP address.
192 This is always a string of the form 'dd.dd.dd.dd' (with variable
193 size numbers). */
194
195static object *
196makeipaddr(addr)
197 struct sockaddr_in *addr;
198{
199 long x = ntohl(addr->sin_addr.s_addr);
200 char buf[100];
201 sprintf(buf, "%d.%d.%d.%d",
202 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
203 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
204 return newstringobject(buf);
205}
206
207
208/* Create an object representing the given socket address,
209 suitable for passing it back to bind(), connect() etc.
210 The family field of the sockaddr structure is inspected
211 to determine what kind of address it really is. */
212
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000213/*ARGSUSED*/
214static object *
215makesockaddr(addr, addrlen)
216 struct sockaddr *addr;
217 int addrlen;
218{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000219 if (addrlen == 0) {
220 /* No address -- may be recvfrom() from known socket */
221 INCREF(None);
222 return None;
223 }
224
Guido van Rossum30a685f1991-06-27 15:51:29 +0000225 switch (addr->sa_family) {
226
227 case AF_INET:
228 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000229 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000230 object *addr = makeipaddr(a);
231 object *ret = mkvalue("Oi", addr, ntohs(a->sin_port));
232 XDECREF(addr);
233 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000234 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000235
236 case AF_UNIX:
237 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000238 struct sockaddr_un *a = (struct sockaddr_un *) addr;
239 return newstringobject(a->sun_path);
240 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000241
242 /* More cases here... */
243
244 default:
245 err_setstr(SocketError, "return unknown socket address type");
246 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000247
Guido van Rossum30a685f1991-06-27 15:51:29 +0000248 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000249}
250
Guido van Rossum30a685f1991-06-27 15:51:29 +0000251
252/* Parse a socket address argument according to the socket object's
253 address family. Return 1 if the address was in the proper format,
254 0 of not. The address is returned through addr_ret, its length
255 through len_ret. */
256
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000257static int
258getsockaddrarg(s, args, addr_ret, len_ret)
259 sockobject *s;
260 object *args;
261 struct sockaddr **addr_ret;
262 int *len_ret;
263{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000264 switch (s->sock_family) {
265
266 case AF_UNIX:
267 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000268 static struct sockaddr_un addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000269 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000270 int len;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000271 if (!getargs(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000272 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000273 if (len > sizeof addr.sun_path) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000274 err_setstr(SocketError, "AF_UNIX path too long");
275 return 0;
276 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000277 addr.sun_family = AF_UNIX;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000278 memcpy(addr.sun_path, path, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000279 *addr_ret = (struct sockaddr *) &addr;
280 *len_ret = len + sizeof addr.sun_family;
281 return 1;
282 }
283
Guido van Rossum30a685f1991-06-27 15:51:29 +0000284 case AF_INET:
285 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000286 static struct sockaddr_in addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000287 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000288 int port;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000289 if (!getargs(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000290 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000291 if (setipaddr(host, &addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000292 return 0;
293 addr.sin_family = AF_INET;
294 addr.sin_port = htons(port);
295 *addr_ret = (struct sockaddr *) &addr;
296 *len_ret = sizeof addr;
297 return 1;
298 }
299
Guido van Rossum30a685f1991-06-27 15:51:29 +0000300 /* More cases here... */
301
302 default:
303 err_setstr(SocketError, "getsockaddrarg: bad family");
304 return 0;
305
306 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000307}
308
Guido van Rossum30a685f1991-06-27 15:51:29 +0000309
Guido van Rossum710e1df1992-06-12 10:39:36 +0000310/* Get the address length according to the socket object's address family.
311 Return 1 if the family is known, 0 otherwise. The length is returned
312 through len_ret. */
313
314static int
315getsockaddrlen(s, len_ret)
316 sockobject *s;
317 int *len_ret;
318{
319 switch (s->sock_family) {
320
321 case AF_UNIX:
322 {
323 *len_ret = sizeof (struct sockaddr_un);
324 return 1;
325 }
326
327 case AF_INET:
328 {
329 *len_ret = sizeof (struct sockaddr_in);
330 return 1;
331 }
332
333 /* More cases here... */
334
335 default:
336 err_setstr(SocketError, "getsockaddrarg: bad family");
337 return 0;
338
339 }
340}
341
342
Guido van Rossum30a685f1991-06-27 15:51:29 +0000343/* s.accept() method */
344
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000345static object *
346sock_accept(s, args)
347 sockobject *s;
348 object *args;
349{
350 char addrbuf[256];
351 int addrlen, newfd;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000352 object *sock, *addr, *res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000353 if (!getnoarg(args))
354 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000355 if (!getsockaddrlen(s, &addrlen))
356 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000357 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000358 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000359 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000360 if (newfd < 0)
361 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000362 /* Create the new object with unspecified family,
363 to avoid calls to bind() etc. on it. */
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000364 sock = (object *) newsockobject(newfd,
365 s->sock_family,
366 s->sock_type,
367 s->sock_proto);
368 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000369 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000370 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
371 res = mkvalue("OO", sock, addr);
372 XDECREF(sock);
373 XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000374 return res;
375}
376
Guido van Rossum30a685f1991-06-27 15:51:29 +0000377
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000378/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000379/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000380
381static object *
382sock_allowbroadcast(s, args)
383 sockobject *s;
384 object *args;
385{
386 int flag;
387 int res;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000388 if (!getargs(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000389 return NULL;
390 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
391 &flag, sizeof flag);
392 if (res < 0)
393 return socket_error();
394 INCREF(None);
395 return None;
396}
397
398
Guido van Rossumaee08791992-09-08 09:05:33 +0000399/* s.setsockopt() method.
400 With an integer third argument, sets an integer option.
401 With a string third argument, sets an option from a buffer;
402 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000403
404static object *
405sock_setsockopt(s, args)
406 sockobject *s;
407 object *args;
408{
409 int level;
410 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000411 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000412 char *buf;
413 int buflen;
414 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000415
Guido van Rossumaee08791992-09-08 09:05:33 +0000416 if (getargs(args, "(iii)", &level, &optname, &flag)) {
417 buf = (char *) &flag;
418 buflen = sizeof flag;
419 }
420 else {
421 err_clear();
422 if (!getargs(args, "(iis#)", &level, &optname, &buf, &buflen))
423 return NULL;
424 }
425 res = setsockopt(s->sock_fd, level, optname, buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000426 if (res < 0)
427 return socket_error();
428 INCREF(None);
429 return None;
430}
431
432
Guido van Rossumaee08791992-09-08 09:05:33 +0000433/* s.getsockopt() method.
434 With two arguments, retrieves an integer option.
435 With a third integer argument, retrieves a string buffer of that size;
436 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000437
438static object *
439sock_getsockopt(s, args)
440 sockobject *s;
441 object *args;
442{
443 int level;
444 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000445 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000446 object *buf;
447 int buflen;
448 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000449
Guido van Rossumaee08791992-09-08 09:05:33 +0000450 if (getargs(args, "(ii)", &level, &optname)) {
451 int flag = 0;
452 int flagsize = sizeof flag;
453 res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize);
454 if (res < 0)
455 return socket_error();
456 return newintobject(flag);
457 }
458 err_clear();
459 if (!getargs(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000460 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000461 if (buflen <= 0 || buflen > 1024) {
462 err_setstr(SocketError, "getsockopt buflen out of range");
463 return NULL;
464 }
465 buf = newsizedstringobject((char *)NULL, buflen);
466 if (buf == NULL)
467 return NULL;
468 res = getsockopt(s->sock_fd, level, optname, getstringvalue(buf),
469 &buflen);
470 if (res < 0) {
471 DECREF(buf);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000472 return socket_error();
Guido van Rossumaee08791992-09-08 09:05:33 +0000473 }
474 resizestring(&buf, buflen);
475 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000476}
477
478
Guido van Rossum81194471991-07-27 21:42:02 +0000479/* s.avail() method */
480
481static object *
482sock_avail(s, args)
483 sockobject *s;
484 object *args;
485{
486 struct timeval timeout;
487 fd_set readers;
488 int n;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000489 if (!getnoarg(args))
490 return NULL;
Guido van Rossum81194471991-07-27 21:42:02 +0000491 timeout.tv_sec = 0;
492 timeout.tv_usec = 0;
493 FD_ZERO(&readers);
494 FD_SET(s->sock_fd, &readers);
495 n = select(s->sock_fd+1, &readers, (fd_set *)0, (fd_set *)0, &timeout);
496 if (n < 0)
497 return socket_error();
498 return newintobject((long) (n != 0));
499}
500
501
Guido van Rossum30a685f1991-06-27 15:51:29 +0000502/* s.bind(sockaddr) method */
503
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504static object *
505sock_bind(s, args)
506 sockobject *s;
507 object *args;
508{
509 struct sockaddr *addr;
510 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000511 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000512 if (!getsockaddrarg(s, args, &addr, &addrlen))
513 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000514 BGN_SAVE
515 res = bind(s->sock_fd, addr, addrlen);
516 END_SAVE
517 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518 return socket_error();
519 INCREF(None);
520 return None;
521}
522
Guido van Rossum30a685f1991-06-27 15:51:29 +0000523
524/* s.close() method.
525 Set the file descriptor to -1 so operations tried subsequently
526 will surely fail. */
527
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000528static object *
529sock_close(s, args)
530 sockobject *s;
531 object *args;
532{
533 if (!getnoarg(args))
534 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000535 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000536 (void) close(s->sock_fd);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000537 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000538 s->sock_fd = -1;
539 INCREF(None);
540 return None;
541}
542
Guido van Rossum30a685f1991-06-27 15:51:29 +0000543
544/* s.connect(sockaddr) method */
545
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000546static object *
547sock_connect(s, args)
548 sockobject *s;
549 object *args;
550{
551 struct sockaddr *addr;
552 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000553 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000554 if (!getsockaddrarg(s, args, &addr, &addrlen))
555 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000556 BGN_SAVE
557 res = connect(s->sock_fd, addr, addrlen);
558 END_SAVE
559 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000560 return socket_error();
561 INCREF(None);
562 return None;
563}
564
Guido van Rossum30a685f1991-06-27 15:51:29 +0000565
Guido van Rossumed233a51992-06-23 09:07:03 +0000566/* s.fileno() method */
567
568static object *
569sock_fileno(s, args)
570 sockobject *s;
571 object *args;
572{
573 if (!getnoarg(args))
574 return NULL;
575 return newintobject((long) s->sock_fd);
576}
577
578
Guido van Rossumc89705d1992-11-26 08:54:07 +0000579/* s.getsockname() method */
580
581static object *
582sock_getsockname(s, args)
583 sockobject *s;
584 object *args;
585{
586 char addrbuf[256];
587 int addrlen, res;
588 if (!getnoarg(args))
589 return NULL;
590 if (!getsockaddrlen(s, &addrlen))
591 return NULL;
592 BGN_SAVE
593 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
594 END_SAVE
595 if (res < 0)
596 return socket_error();
597 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
598}
599
600
Guido van Rossum9575a441993-04-07 14:06:14 +0000601#ifndef NO_GETPEERNAME
Guido van Rossumc89705d1992-11-26 08:54:07 +0000602/* s.getpeername() method */
603
604static object *
605sock_getpeername(s, args)
606 sockobject *s;
607 object *args;
608{
609 char addrbuf[256];
610 int addrlen, res;
611 if (!getnoarg(args))
612 return NULL;
613 if (!getsockaddrlen(s, &addrlen))
614 return NULL;
615 BGN_SAVE
616 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
617 END_SAVE
618 if (res < 0)
619 return socket_error();
620 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
621}
Guido van Rossum9575a441993-04-07 14:06:14 +0000622#endif
Guido van Rossumc89705d1992-11-26 08:54:07 +0000623
624
Guido van Rossum30a685f1991-06-27 15:51:29 +0000625/* s.listen(n) method */
626
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000627static object *
628sock_listen(s, args)
629 sockobject *s;
630 object *args;
631{
632 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000633 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000634 if (!getintarg(args, &backlog))
635 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000636 BGN_SAVE
637 res = listen(s->sock_fd, backlog);
638 END_SAVE
639 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000640 return socket_error();
641 INCREF(None);
642 return None;
643}
644
Guido van Rossum30a685f1991-06-27 15:51:29 +0000645
646/* s.makefile(mode) method.
647 Create a new open file object referring to a dupped version of
648 the socket's file descriptor. (The dup() call is necessary so
649 that the open file and socket objects may be closed independent
650 of each other.)
651 The mode argument specifies 'r' or 'w' passed to fdopen(). */
652
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000653static object *
Guido van Rossum30a685f1991-06-27 15:51:29 +0000654sock_makefile(s, args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000655 sockobject *s;
656 object *args;
657{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000658 extern int fclose PROTO((FILE *));
Guido van Rossumff4949e1992-08-05 19:58:53 +0000659 char *mode;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000660 int fd;
661 FILE *fp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000662 if (!getargs(args, "s", &mode))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000663 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000664 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossumff4949e1992-08-05 19:58:53 +0000665 (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000666 return socket_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000667 return newopenfileobject(fp, "<socket>", mode, fclose);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000668}
669
670
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000671/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000672
673static object *
674sock_recv(s, args)
675 sockobject *s;
676 object *args;
677{
678 int len, n, flags;
679 object *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000680 flags = 0;
681 if (!getargs(args, "i", &len)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000682 err_clear();
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000683 if (!getargs(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000684 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000685 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000686 buf = newsizedstringobject((char *) 0, len);
687 if (buf == NULL)
688 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000689 BGN_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000690 n = recv(s->sock_fd, getstringvalue(buf), len, flags);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000691 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000692 if (n < 0)
693 return socket_error();
694 if (resizestring(&buf, n) < 0)
695 return NULL;
696 return buf;
697}
698
Guido van Rossum30a685f1991-06-27 15:51:29 +0000699
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000700/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000701
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000702static object *
703sock_recvfrom(s, args)
704 sockobject *s;
705 object *args;
706{
707 char addrbuf[256];
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000708 object *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000709 int addrlen, len, n, flags;
710 flags = 0;
711 if (!getargs(args, "i", &len)) {
712 err_clear();
713 if (!getargs(args, "(ii)", &len, &flags))
714 return NULL;
715 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000716 if (!getsockaddrlen(s, &addrlen))
717 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000718 buf = newsizedstringobject((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000719 if (buf == NULL)
720 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000721 BGN_SAVE
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000722 n = recvfrom(s->sock_fd, getstringvalue(buf), len, flags,
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000723 addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000724 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000725 if (n < 0)
726 return socket_error();
727 if (resizestring(&buf, n) < 0)
728 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000729 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
730 ret = mkvalue("OO", buf, addr);
731 XDECREF(addr);
732 XDECREF(buf);
733 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000734}
735
Guido van Rossum30a685f1991-06-27 15:51:29 +0000736
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000737/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000738
739static object *
740sock_send(s, args)
741 sockobject *s;
742 object *args;
743{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000744 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000745 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000746 flags = 0;
747 if (!getargs(args, "(s#)", &buf, &len)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000748 err_clear();
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000749 if (!getargs(args, "s#", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000750 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000752 BGN_SAVE
753 n = send(s->sock_fd, buf, len, flags);
754 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755 if (n < 0)
756 return socket_error();
757 INCREF(None);
758 return None;
759}
760
761
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000762/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000763
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000764static object *
765sock_sendto(s, args)
766 sockobject *s;
767 object *args;
768{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000769 object *addro;
770 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000771 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000772 int addrlen, len, n, flags;
773 flags = 0;
774 if (!getargs(args, "(s#O)", &buf, &len, &addro)) {
775 err_clear();
776 if (!getargs(args, "(s#iO)", &buf, &len, &flags, &addro))
777 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000779 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000781 BGN_SAVE
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000782 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000783 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000784 if (n < 0)
785 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000786 INCREF(None);
787 return None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000788}
789
Guido van Rossum30a685f1991-06-27 15:51:29 +0000790
791/* s.shutdown(how) method */
792
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000793static object *
794sock_shutdown(s, args)
795 sockobject *s;
796 object *args;
797{
798 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000799 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800 if (!getintarg(args, &how))
801 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000802 BGN_SAVE
803 res = shutdown(s->sock_fd, how);
804 END_SAVE
805 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000806 return socket_error();
807 INCREF(None);
808 return None;
809}
810
Guido van Rossum30a685f1991-06-27 15:51:29 +0000811
812/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813
814static struct methodlist sock_methods[] = {
815 {"accept", sock_accept},
Guido van Rossum81194471991-07-27 21:42:02 +0000816 {"avail", sock_avail},
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000817 {"allowbroadcast", sock_allowbroadcast},
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000818 {"setsockopt", sock_setsockopt},
819 {"getsockopt", sock_getsockopt},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000820 {"bind", sock_bind},
821 {"close", sock_close},
822 {"connect", sock_connect},
Guido van Rossumed233a51992-06-23 09:07:03 +0000823 {"fileno", sock_fileno},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000824 {"getsockname", sock_getsockname},
Guido van Rossum9575a441993-04-07 14:06:14 +0000825#ifndef NO_GETPEERNAME
Guido van Rossumc89705d1992-11-26 08:54:07 +0000826 {"getpeername", sock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000827#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000828 {"listen", sock_listen},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000829 {"makefile", sock_makefile},
830 {"recv", sock_recv},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000831 {"recvfrom", sock_recvfrom},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000832 {"send", sock_send},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000833 {"sendto", sock_sendto},
834 {"shutdown", sock_shutdown},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000835 {NULL, NULL} /* sentinel */
836};
837
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838
839/* Deallocate a socket object in response to the last DECREF().
840 First close the file description. */
841
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000842static void
843sock_dealloc(s)
844 sockobject *s;
845{
846 (void) close(s->sock_fd);
847 DEL(s);
848}
849
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850
851/* Return a socket object's named attribute. */
852
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000853static object *
854sock_getattr(s, name)
855 sockobject *s;
856 char *name;
857{
858 return findmethod(sock_methods, (object *) s, name);
859}
860
Guido van Rossum30a685f1991-06-27 15:51:29 +0000861
862/* Type object for socket objects.
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000863 XXX This should be static, but some compilers don't grok the
864 XXX forward reference to it in that case... */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000865
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000866typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000867 OB_HEAD_INIT(&Typetype)
868 0,
869 "socket",
870 sizeof(sockobject),
871 0,
872 sock_dealloc, /*tp_dealloc*/
873 0, /*tp_print*/
874 sock_getattr, /*tp_getattr*/
875 0, /*tp_setattr*/
876 0, /*tp_compare*/
877 0, /*tp_repr*/
878 0, /*tp_as_number*/
879 0, /*tp_as_sequence*/
880 0, /*tp_as_mapping*/
881};
882
Guido van Rossum30a685f1991-06-27 15:51:29 +0000883
Guido van Rossum81194471991-07-27 21:42:02 +0000884/* Python interface to gethostname(). */
885
886/*ARGSUSED*/
887static object *
888socket_gethostname(self, args)
889 object *self;
890 object *args;
891{
892 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000893 int res;
Guido van Rossum81194471991-07-27 21:42:02 +0000894 if (!getnoarg(args))
895 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000896 BGN_SAVE
897 res = gethostname(buf, (int) sizeof buf - 1);
898 END_SAVE
899 if (res < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000900 return socket_error();
901 buf[sizeof buf - 1] = '\0';
902 return newstringobject(buf);
903}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000904
905
Guido van Rossum30a685f1991-06-27 15:51:29 +0000906/* Python interface to gethostbyname(name). */
907
908/*ARGSUSED*/
909static object *
910socket_gethostbyname(self, args)
911 object *self;
912 object *args;
913{
914 object *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000915 struct sockaddr_in addrbuf;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000916 if (!getargs(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000917 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000918 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000919 return NULL;
920 return makeipaddr(&addrbuf);
921}
922
923
924/* Python interface to getservbyname(name).
925 This only returns the port number, since the other info is already
926 known or not useful (like the list of aliases). */
927
928/*ARGSUSED*/
929static object *
930socket_getservbyname(self, args)
931 object *self;
932 object *args;
933{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000934 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935 struct servent *sp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000936 if (!getargs(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000937 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000938 BGN_SAVE
939 sp = getservbyname(name, proto);
940 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000941 if (sp == NULL) {
942 err_setstr(SocketError, "service/proto not found");
943 return NULL;
944 }
945 return newintobject((long) ntohs(sp->s_port));
946}
947
948
949/* Python interface to socket(family, type, proto).
950 The third (protocol) argument is optional.
951 Return a new socket object. */
952
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000953/*ARGSUSED*/
954static object *
955socket_socket(self, args)
956 object *self;
957 object *args;
958{
959 sockobject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000960 int fd, family, type, proto;
961 proto = 0;
962 if (!getargs(args, "(ii)", &family, &type)) {
963 err_clear();
964 if (!getargs(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000965 return NULL;
966 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000967 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000968 fd = socket(family, type, proto);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000969 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000970 if (fd < 0)
971 return socket_error();
972 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000973 /* If the object can't be created, don't forget to close the
974 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000975 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000976 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +0000977 /* From now on, ignore SIGPIPE and let the error checking
978 do the work. */
979 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000980 return (object *) s;
981}
982
Guido van Rossum30a685f1991-06-27 15:51:29 +0000983
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000984/* Create a socket object from a numeric file description.
985 Useful e.g. if stdin is a socket.
986 Additional arguments as for socket(). */
987
988/*ARGSUSED*/
989static object *
990socket_fromfd(self, args)
991 object *self;
992 object *args;
993{
994 sockobject *s;
995 int fd, family, type, proto;
996 proto = 0;
997 if (!getargs(args, "(iii)", &fd, &family, &type)) {
998 err_clear();
999 if (!getargs(args, "(iiii)", &fd, &family, &type, &proto))
1000 return NULL;
1001 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001002 /* Dup the fd so it and the socket can be closed independently */
1003 fd = dup(fd);
1004 if (fd < 0)
1005 return socket_error();
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001006 s = newsockobject(fd, family, type, proto);
1007 /* From now on, ignore SIGPIPE and let the error checking
1008 do the work. */
1009 (void) signal(SIGPIPE, SIG_IGN);
1010 return (object *) s;
1011}
1012
1013
Guido van Rossum30a685f1991-06-27 15:51:29 +00001014/* List of functions exported by this module. */
1015
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001016static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001017 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +00001018 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019 {"getservbyname", socket_getservbyname},
1020 {"socket", socket_socket},
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001021 {"fromfd", socket_fromfd},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001022 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001023};
1024
Guido van Rossum30a685f1991-06-27 15:51:29 +00001025
1026/* Convenience routine to export an integer value.
1027 For simplicity, errors (which are unlikely anyway) are ignored. */
1028
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001029static void
1030insint(d, name, value)
1031 object *d;
1032 char *name;
1033 int value;
1034{
1035 object *v = newintobject((long) value);
1036 if (v == NULL) {
1037 /* Don't bother reporting this error */
1038 err_clear();
1039 }
1040 else {
1041 dictinsert(d, name, v);
1042 DECREF(v);
1043 }
1044}
1045
Guido van Rossum30a685f1991-06-27 15:51:29 +00001046
1047/* Initialize this module.
1048 This is called when the first 'import socket' is done,
1049 via a table in config.c, if config.c is compiled with USE_SOCKET
1050 defined. */
1051
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001052void
1053initsocket()
1054{
1055 object *m, *d;
1056
1057 m = initmodule("socket", socket_methods);
1058 d = getmoduledict(m);
1059 SocketError = newstringobject("socket.error");
1060 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
1061 fatal("can't define socket.error");
1062 insint(d, "AF_INET", AF_INET);
1063 insint(d, "AF_UNIX", AF_UNIX);
1064 insint(d, "SOCK_STREAM", SOCK_STREAM);
1065 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1066 insint(d, "SOCK_RAW", SOCK_RAW);
1067 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1068 insint(d, "SOCK_RDM", SOCK_RDM);
1069}