blob: 503a3594736d1a98fd5f32e27f2b57b1c290d72a [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 Rossumeb6b33a1993-05-25 09:38:27 +000035- no flags on 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
Guido van Rossumeb6b33a1993-05-25 09:38:27 +000064- s.recv(nbytes [,flags]) --> string
Guido van Rossum30a685f1991-06-27 15:51:29 +000065- s.recvfrom(nbytes) --> string, sockaddr
Guido van Rossumeb6b33a1993-05-25 09:38:27 +000066- s.send(string [,flags]) --> None
67- s.sendto(string, [flags,] sockaddr) --> None
Guido van Rossum30a685f1991-06-27 15:51:29 +000068- 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
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000672/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000673
674static object *
675sock_recv(s, args)
676 sockobject *s;
677 object *args;
678{
679 int len, n, flags;
680 object *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000681 flags = 0;
682 if (!getargs(args, "i", &len)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000683 err_clear();
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000684 if (!getargs(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000685 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000686 }
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
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000701/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000702
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 Rossumeb6b33a1993-05-25 09:38:27 +0000710 int addrlen, len, n, flags;
711 flags = 0;
712 if (!getargs(args, "i", &len)) {
713 err_clear();
714 if (!getargs(args, "(ii)", &len, &flags))
715 return NULL;
716 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000717 buf = newsizedstringobject((char *) 0, len);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000718 BGN_SAVE
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000719 n = recvfrom(s->sock_fd, getstringvalue(buf), len, flags,
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000720 addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000721 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000722 if (n < 0)
723 return socket_error();
724 if (resizestring(&buf, n) < 0)
725 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000726 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
727 ret = mkvalue("OO", buf, addr);
728 XDECREF(addr);
729 XDECREF(buf);
730 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000731}
732
Guido van Rossum30a685f1991-06-27 15:51:29 +0000733
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000734/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000735
736static object *
737sock_send(s, args)
738 sockobject *s;
739 object *args;
740{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000741 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000742 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000743 flags = 0;
744 if (!getargs(args, "(s#)", &buf, &len)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000745 err_clear();
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000746 if (!getargs(args, "s#", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000747 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000748 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000749 BGN_SAVE
750 n = send(s->sock_fd, buf, len, flags);
751 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752 if (n < 0)
753 return socket_error();
754 INCREF(None);
755 return None;
756}
757
758
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000759/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000760
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000761static object *
762sock_sendto(s, args)
763 sockobject *s;
764 object *args;
765{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000766 object *addro;
767 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000768 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000769 int addrlen, len, n, flags;
770 flags = 0;
771 if (!getargs(args, "(s#O)", &buf, &len, &addro)) {
772 err_clear();
773 if (!getargs(args, "(s#iO)", &buf, &len, &flags, &addro))
774 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000776 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000777 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000778 BGN_SAVE
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000779 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000780 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781 if (n < 0)
782 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783 INCREF(None);
784 return None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785}
786
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787
788/* s.shutdown(how) method */
789
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000790static object *
791sock_shutdown(s, args)
792 sockobject *s;
793 object *args;
794{
795 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000796 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000797 if (!getintarg(args, &how))
798 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000799 BGN_SAVE
800 res = shutdown(s->sock_fd, how);
801 END_SAVE
802 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000803 return socket_error();
804 INCREF(None);
805 return None;
806}
807
Guido van Rossum30a685f1991-06-27 15:51:29 +0000808
809/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810
811static struct methodlist sock_methods[] = {
812 {"accept", sock_accept},
Guido van Rossum81194471991-07-27 21:42:02 +0000813 {"avail", sock_avail},
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000814 {"allowbroadcast", sock_allowbroadcast},
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000815 {"setsockopt", sock_setsockopt},
816 {"getsockopt", sock_getsockopt},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000817 {"bind", sock_bind},
818 {"close", sock_close},
819 {"connect", sock_connect},
Guido van Rossumed233a51992-06-23 09:07:03 +0000820 {"fileno", sock_fileno},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000821 {"getsockname", sock_getsockname},
Guido van Rossum9575a441993-04-07 14:06:14 +0000822#ifndef NO_GETPEERNAME
Guido van Rossumc89705d1992-11-26 08:54:07 +0000823 {"getpeername", sock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000824#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000825 {"listen", sock_listen},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000826 {"makefile", sock_makefile},
827 {"recv", sock_recv},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000828 {"recvfrom", sock_recvfrom},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000829 {"send", sock_send},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000830 {"sendto", sock_sendto},
831 {"shutdown", sock_shutdown},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000832 {NULL, NULL} /* sentinel */
833};
834
Guido van Rossum30a685f1991-06-27 15:51:29 +0000835
836/* Deallocate a socket object in response to the last DECREF().
837 First close the file description. */
838
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000839static void
840sock_dealloc(s)
841 sockobject *s;
842{
843 (void) close(s->sock_fd);
844 DEL(s);
845}
846
Guido van Rossum30a685f1991-06-27 15:51:29 +0000847
848/* Return a socket object's named attribute. */
849
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000850static object *
851sock_getattr(s, name)
852 sockobject *s;
853 char *name;
854{
855 return findmethod(sock_methods, (object *) s, name);
856}
857
Guido van Rossum30a685f1991-06-27 15:51:29 +0000858
859/* Type object for socket objects.
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000860 XXX This should be static, but some compilers don't grok the
861 XXX forward reference to it in that case... */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000862
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000863typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000864 OB_HEAD_INIT(&Typetype)
865 0,
866 "socket",
867 sizeof(sockobject),
868 0,
869 sock_dealloc, /*tp_dealloc*/
870 0, /*tp_print*/
871 sock_getattr, /*tp_getattr*/
872 0, /*tp_setattr*/
873 0, /*tp_compare*/
874 0, /*tp_repr*/
875 0, /*tp_as_number*/
876 0, /*tp_as_sequence*/
877 0, /*tp_as_mapping*/
878};
879
Guido van Rossum30a685f1991-06-27 15:51:29 +0000880
Guido van Rossum81194471991-07-27 21:42:02 +0000881/* Python interface to gethostname(). */
882
883/*ARGSUSED*/
884static object *
885socket_gethostname(self, args)
886 object *self;
887 object *args;
888{
889 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000890 int res;
Guido van Rossum81194471991-07-27 21:42:02 +0000891 if (!getnoarg(args))
892 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000893 BGN_SAVE
894 res = gethostname(buf, (int) sizeof buf - 1);
895 END_SAVE
896 if (res < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000897 return socket_error();
898 buf[sizeof buf - 1] = '\0';
899 return newstringobject(buf);
900}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000901
902
Guido van Rossum30a685f1991-06-27 15:51:29 +0000903/* Python interface to gethostbyname(name). */
904
905/*ARGSUSED*/
906static object *
907socket_gethostbyname(self, args)
908 object *self;
909 object *args;
910{
911 object *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000912 struct sockaddr_in addrbuf;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000913 if (!getargs(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000914 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000915 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000916 return NULL;
917 return makeipaddr(&addrbuf);
918}
919
920
921/* Python interface to getservbyname(name).
922 This only returns the port number, since the other info is already
923 known or not useful (like the list of aliases). */
924
925/*ARGSUSED*/
926static object *
927socket_getservbyname(self, args)
928 object *self;
929 object *args;
930{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000931 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932 struct servent *sp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000933 if (!getargs(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000934 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000935 BGN_SAVE
936 sp = getservbyname(name, proto);
937 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000938 if (sp == NULL) {
939 err_setstr(SocketError, "service/proto not found");
940 return NULL;
941 }
942 return newintobject((long) ntohs(sp->s_port));
943}
944
945
946/* Python interface to socket(family, type, proto).
947 The third (protocol) argument is optional.
948 Return a new socket object. */
949
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000950/*ARGSUSED*/
951static object *
952socket_socket(self, args)
953 object *self;
954 object *args;
955{
956 sockobject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000957 int fd, family, type, proto;
958 proto = 0;
959 if (!getargs(args, "(ii)", &family, &type)) {
960 err_clear();
961 if (!getargs(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000962 return NULL;
963 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000964 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965 fd = socket(family, type, proto);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000966 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000967 if (fd < 0)
968 return socket_error();
969 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000970 /* If the object can't be created, don't forget to close the
971 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000972 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000973 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +0000974 /* From now on, ignore SIGPIPE and let the error checking
975 do the work. */
976 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000977 return (object *) s;
978}
979
Guido van Rossum30a685f1991-06-27 15:51:29 +0000980
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000981/* Create a socket object from a numeric file description.
982 Useful e.g. if stdin is a socket.
983 Additional arguments as for socket(). */
984
985/*ARGSUSED*/
986static object *
987socket_fromfd(self, args)
988 object *self;
989 object *args;
990{
991 sockobject *s;
992 int fd, family, type, proto;
993 proto = 0;
994 if (!getargs(args, "(iii)", &fd, &family, &type)) {
995 err_clear();
996 if (!getargs(args, "(iiii)", &fd, &family, &type, &proto))
997 return NULL;
998 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000999 /* Dup the fd so it and the socket can be closed independently */
1000 fd = dup(fd);
1001 if (fd < 0)
1002 return socket_error();
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001003 s = newsockobject(fd, family, type, proto);
1004 /* From now on, ignore SIGPIPE and let the error checking
1005 do the work. */
1006 (void) signal(SIGPIPE, SIG_IGN);
1007 return (object *) s;
1008}
1009
1010
Guido van Rossum30a685f1991-06-27 15:51:29 +00001011/* List of functions exported by this module. */
1012
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001014 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +00001015 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001016 {"getservbyname", socket_getservbyname},
1017 {"socket", socket_socket},
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001018 {"fromfd", socket_fromfd},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001019 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001020};
1021
Guido van Rossum30a685f1991-06-27 15:51:29 +00001022
1023/* Convenience routine to export an integer value.
1024 For simplicity, errors (which are unlikely anyway) are ignored. */
1025
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001026static void
1027insint(d, name, value)
1028 object *d;
1029 char *name;
1030 int value;
1031{
1032 object *v = newintobject((long) value);
1033 if (v == NULL) {
1034 /* Don't bother reporting this error */
1035 err_clear();
1036 }
1037 else {
1038 dictinsert(d, name, v);
1039 DECREF(v);
1040 }
1041}
1042
Guido van Rossum30a685f1991-06-27 15:51:29 +00001043
1044/* Initialize this module.
1045 This is called when the first 'import socket' is done,
1046 via a table in config.c, if config.c is compiled with USE_SOCKET
1047 defined. */
1048
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001049void
1050initsocket()
1051{
1052 object *m, *d;
1053
1054 m = initmodule("socket", socket_methods);
1055 d = getmoduledict(m);
1056 SocketError = newstringobject("socket.error");
1057 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
1058 fatal("can't define socket.error");
1059 insint(d, "AF_INET", AF_INET);
1060 insint(d, "AF_UNIX", AF_UNIX);
1061 insint(d, "SOCK_STREAM", SOCK_STREAM);
1062 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1063 insint(d, "SOCK_RAW", SOCK_RAW);
1064 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1065 insint(d, "SOCK_RDM", SOCK_RDM);
1066}