blob: 2a0e291dcf3a6358398294d5425a72b5b04c1174 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossumbab9d031992-04-05 14:26:55 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Socket module */
26
27/*
28This module provides an interface to Berkeley socket IPC.
29
30Limitations:
31
Guido van Rossum30a685f1991-06-27 15:51:29 +000032- only AF_INET and AF_UNIX address families are supported
Guido van Rossum81194471991-07-27 21:42:02 +000033- no asynchronous I/O (but read polling: avail)
34- no read/write operations (use send/recv or makefile instead)
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000035- no flags on sendto/recvfrom operations
Guido van Rossum0e69587d1992-06-05 15:11:30 +000036- setsockopt() and getsockopt() only support integer options
Guido van Rossum6574b3e1991-06-25 21:36:08 +000037
38Interface:
39
Guido van Rossum81194471991-07-27 21:42:02 +000040- socket.gethostname() --> host name (string)
Guido van Rossum30a685f1991-06-27 15:51:29 +000041- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum4dd2a7e1991-07-01 18:51:33 +000042- socket.getservbyname(servername, protocolname) --> port number
43- socket.socket(family, type [, proto]) --> new socket object
Guido van Rossum6574b3e1991-06-25 21:36:08 +000044- family and type constants from <socket.h> are accessed as socket.AF_INET etc.
Guido van Rossum6574b3e1991-06-25 21:36:08 +000045- errors are reported as the exception socket.error
46- an Internet socket address is a pair (hostname, port)
47 where hostname can be anything recognized by gethostbyname()
48 (including the dd.dd.dd.dd notation) and port is in host byte order
49- where a hostname is returned, the dd.dd.dd.dd notation is used
50- a UNIX domain socket is a string specifying the pathname
51
Guido van Rossum30a685f1991-06-27 15:51:29 +000052Socket methods:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000053
Guido van Rossum81194471991-07-27 21:42:02 +000054- s.accept() --> new socket object, sockaddr
55- s.avail() --> boolean
Guido van Rossum0e69587d1992-06-05 15:11:30 +000056- s.setsockopt(level, optname, flag) --> None
57- s.getsockopt(level, optname) --> flag
Guido van Rossum30a685f1991-06-27 15:51:29 +000058- s.bind(sockaddr) --> None
59- s.connect(sockaddr) --> None
Guido van Rossumc89705d1992-11-26 08:54:07 +000060- s.getsockname() --> sockaddr
61- s.getpeername() --> sockaddr
Guido van Rossum30a685f1991-06-27 15:51:29 +000062- s.listen(n) --> None
63- s.makefile(mode) --> file object
64- s.recv(nbytes) --> string
65- s.recvfrom(nbytes) --> string, sockaddr
66- s.send(string) --> None
67- s.sendto(string, sockaddr) --> None
68- s.shutdown(how) --> None
69- s.close() --> None
70
Guido van Rossum6574b3e1991-06-25 21:36:08 +000071*/
72
73#include "allobjects.h"
74#include "modsupport.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000075#include "ceval.h"
Guido van Rossum6574b3e1991-06-25 21:36:08 +000076
Guido van Rossumed233a51992-06-23 09:07:03 +000077#include "myselect.h" /* Implies <sys/types.h>, <sys/time.h>, <sys/param.h> */
78
Guido van Rossum81194471991-07-27 21:42:02 +000079#include <signal.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000080#include <sys/socket.h>
81#include <netinet/in.h>
82#include <sys/un.h>
83#include <netdb.h>
84
Guido van Rossum30a685f1991-06-27 15:51:29 +000085
86/* Global variable holding the exception type for errors detected
87 by this module (but not argument type or memory errors, etc.). */
88
89static object *SocketError;
90
91
92/* Convenience function to raise an error according to errno
93 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +000094
95static object *
96socket_error()
97{
98 return err_errno(SocketError);
99}
100
Guido van Rossum30a685f1991-06-27 15:51:29 +0000101
102/* The object holding a socket. It holds some extra information,
103 like the address family, which is used to decode socket address
104 arguments properly. */
105
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000106typedef struct {
107 OB_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000108 int sock_fd; /* Socket file descriptor */
109 int sock_family; /* Address family, e.g., AF_INET */
110 int sock_type; /* Socket type, e.g., SOCK_STREAM */
111 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000112} sockobject;
113
Guido van Rossum30a685f1991-06-27 15:51:29 +0000114
115/* A forward reference to the Socktype type object.
116 The Socktype variable contains pointers to various functions,
117 some of which call newsocobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000118 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000119
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000120extern typeobject Socktype; /* Forward */
121
Guido van Rossum30a685f1991-06-27 15:51:29 +0000122
123/* Create a new socket object.
124 This just creates the object and initializes it.
125 If the creation fails, return NULL and set an exception (implicit
126 in NEWOBJ()). */
127
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000128static sockobject *
129newsockobject(fd, family, type, proto)
130 int fd, family, type, proto;
131{
132 sockobject *s;
133 s = NEWOBJ(sockobject, &Socktype);
134 if (s != NULL) {
135 s->sock_fd = fd;
136 s->sock_family = family;
137 s->sock_type = type;
138 s->sock_proto = proto;
139 }
140 return s;
141}
142
Guido van Rossum30a685f1991-06-27 15:51:29 +0000143
144/* Convert a string specifying a host name or one of a few symbolic
145 names to a numeric IP address. This usually calls gethostbyname()
146 to do the work; the names "" and "<broadcast>" are special.
147 Return the length (should always be 4 bytes), or negative if
148 an error occurred; then an exception is raised. */
149
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000150static int
Guido van Rossum30a685f1991-06-27 15:51:29 +0000151setipaddr(name, addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000152 char *name;
153 struct sockaddr_in *addr_ret;
154{
155 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000156 int d1, d2, d3, d4;
157 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000158
Guido van Rossum30a685f1991-06-27 15:51:29 +0000159 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000160 addr_ret->sin_addr.s_addr = INADDR_ANY;
161 return 4;
162 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000163 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000164 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
165 return 4;
166 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000167 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
168 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
169 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
170 addr_ret->sin_addr.s_addr = htonl(
171 ((long) d1 << 24) | ((long) d2 << 16) |
172 ((long) d3 << 8) | ((long) d4 << 0));
173 return 4;
174 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000175 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000176 hp = gethostbyname(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000177 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000178 if (hp == NULL) {
179 err_setstr(SocketError, "host not found");
180 return -1;
181 }
182 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
183 return hp->h_length;
184}
185
Guido van Rossum30a685f1991-06-27 15:51:29 +0000186
Guido van Rossum30a685f1991-06-27 15:51:29 +0000187/* Create a string object representing an IP address.
188 This is always a string of the form 'dd.dd.dd.dd' (with variable
189 size numbers). */
190
191static object *
192makeipaddr(addr)
193 struct sockaddr_in *addr;
194{
195 long x = ntohl(addr->sin_addr.s_addr);
196 char buf[100];
197 sprintf(buf, "%d.%d.%d.%d",
198 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
199 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
200 return newstringobject(buf);
201}
202
203
204/* Create an object representing the given socket address,
205 suitable for passing it back to bind(), connect() etc.
206 The family field of the sockaddr structure is inspected
207 to determine what kind of address it really is. */
208
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000209/*ARGSUSED*/
210static object *
211makesockaddr(addr, addrlen)
212 struct sockaddr *addr;
213 int addrlen;
214{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000215 if (addrlen == 0) {
216 /* No address -- may be recvfrom() from known socket */
217 INCREF(None);
218 return None;
219 }
220
Guido van Rossum30a685f1991-06-27 15:51:29 +0000221 switch (addr->sa_family) {
222
223 case AF_INET:
224 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000225 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000226 object *addr = makeipaddr(a);
227 object *ret = mkvalue("Oi", addr, ntohs(a->sin_port));
228 XDECREF(addr);
229 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000230 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000231
232 case AF_UNIX:
233 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000234 struct sockaddr_un *a = (struct sockaddr_un *) addr;
235 return newstringobject(a->sun_path);
236 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000237
238 /* More cases here... */
239
240 default:
241 err_setstr(SocketError, "return unknown socket address type");
242 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000243
Guido van Rossum30a685f1991-06-27 15:51:29 +0000244 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000245}
246
Guido van Rossum30a685f1991-06-27 15:51:29 +0000247
248/* Parse a socket address argument according to the socket object's
249 address family. Return 1 if the address was in the proper format,
250 0 of not. The address is returned through addr_ret, its length
251 through len_ret. */
252
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000253static int
254getsockaddrarg(s, args, addr_ret, len_ret)
255 sockobject *s;
256 object *args;
257 struct sockaddr **addr_ret;
258 int *len_ret;
259{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000260 switch (s->sock_family) {
261
262 case AF_UNIX:
263 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000264 static struct sockaddr_un addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000265 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000266 int len;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000267 if (!getargs(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000268 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000269 if (len > sizeof addr.sun_path) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000270 err_setstr(SocketError, "AF_UNIX path too long");
271 return 0;
272 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000273 addr.sun_family = AF_UNIX;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000274 memcpy(addr.sun_path, path, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000275 *addr_ret = (struct sockaddr *) &addr;
276 *len_ret = len + sizeof addr.sun_family;
277 return 1;
278 }
279
Guido van Rossum30a685f1991-06-27 15:51:29 +0000280 case AF_INET:
281 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000282 static struct sockaddr_in addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000283 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000284 int port;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000285 if (!getargs(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000286 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000287 if (setipaddr(host, &addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000288 return 0;
289 addr.sin_family = AF_INET;
290 addr.sin_port = htons(port);
291 *addr_ret = (struct sockaddr *) &addr;
292 *len_ret = sizeof addr;
293 return 1;
294 }
295
Guido van Rossum30a685f1991-06-27 15:51:29 +0000296 /* More cases here... */
297
298 default:
299 err_setstr(SocketError, "getsockaddrarg: bad family");
300 return 0;
301
302 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000303}
304
Guido van Rossum30a685f1991-06-27 15:51:29 +0000305
Guido van Rossum710e1df1992-06-12 10:39:36 +0000306/* Get the address length according to the socket object's address family.
307 Return 1 if the family is known, 0 otherwise. The length is returned
308 through len_ret. */
309
310static int
311getsockaddrlen(s, len_ret)
312 sockobject *s;
313 int *len_ret;
314{
315 switch (s->sock_family) {
316
317 case AF_UNIX:
318 {
319 *len_ret = sizeof (struct sockaddr_un);
320 return 1;
321 }
322
323 case AF_INET:
324 {
325 *len_ret = sizeof (struct sockaddr_in);
326 return 1;
327 }
328
329 /* More cases here... */
330
331 default:
332 err_setstr(SocketError, "getsockaddrarg: bad family");
333 return 0;
334
335 }
336}
337
338
Guido van Rossum30a685f1991-06-27 15:51:29 +0000339/* s.accept() method */
340
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000341static object *
342sock_accept(s, args)
343 sockobject *s;
344 object *args;
345{
346 char addrbuf[256];
347 int addrlen, newfd;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000348 object *sock, *addr, *res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000349 if (!getnoarg(args))
350 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000351 if (!getsockaddrlen(s, &addrlen))
352 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000353 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000354 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000355 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000356 if (newfd < 0)
357 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000358 /* Create the new object with unspecified family,
359 to avoid calls to bind() etc. on it. */
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000360 sock = (object *) newsockobject(newfd,
361 s->sock_family,
362 s->sock_type,
363 s->sock_proto);
364 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000365 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000366 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
367 res = mkvalue("OO", sock, addr);
368 XDECREF(sock);
369 XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000370 return res;
371}
372
Guido van Rossum30a685f1991-06-27 15:51:29 +0000373
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000374/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000375/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000376
377static object *
378sock_allowbroadcast(s, args)
379 sockobject *s;
380 object *args;
381{
382 int flag;
383 int res;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000384 if (!getargs(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000385 return NULL;
386 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
387 &flag, sizeof flag);
388 if (res < 0)
389 return socket_error();
390 INCREF(None);
391 return None;
392}
393
394
Guido van Rossumaee08791992-09-08 09:05:33 +0000395/* s.setsockopt() method.
396 With an integer third argument, sets an integer option.
397 With a string third argument, sets an option from a buffer;
398 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000399
400static object *
401sock_setsockopt(s, args)
402 sockobject *s;
403 object *args;
404{
405 int level;
406 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000407 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000408 char *buf;
409 int buflen;
410 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000411
Guido van Rossumaee08791992-09-08 09:05:33 +0000412 if (getargs(args, "(iii)", &level, &optname, &flag)) {
413 buf = (char *) &flag;
414 buflen = sizeof flag;
415 }
416 else {
417 err_clear();
418 if (!getargs(args, "(iis#)", &level, &optname, &buf, &buflen))
419 return NULL;
420 }
421 res = setsockopt(s->sock_fd, level, optname, buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000422 if (res < 0)
423 return socket_error();
424 INCREF(None);
425 return None;
426}
427
428
Guido van Rossumaee08791992-09-08 09:05:33 +0000429/* s.getsockopt() method.
430 With two arguments, retrieves an integer option.
431 With a third integer argument, retrieves a string buffer of that size;
432 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000433
434static object *
435sock_getsockopt(s, args)
436 sockobject *s;
437 object *args;
438{
439 int level;
440 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000441 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000442 object *buf;
443 int buflen;
444 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000445
Guido van Rossumaee08791992-09-08 09:05:33 +0000446 if (getargs(args, "(ii)", &level, &optname)) {
447 int flag = 0;
448 int flagsize = sizeof flag;
449 res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize);
450 if (res < 0)
451 return socket_error();
452 return newintobject(flag);
453 }
454 err_clear();
455 if (!getargs(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000456 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000457 if (buflen <= 0 || buflen > 1024) {
458 err_setstr(SocketError, "getsockopt buflen out of range");
459 return NULL;
460 }
461 buf = newsizedstringobject((char *)NULL, buflen);
462 if (buf == NULL)
463 return NULL;
464 res = getsockopt(s->sock_fd, level, optname, getstringvalue(buf),
465 &buflen);
466 if (res < 0) {
467 DECREF(buf);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000468 return socket_error();
Guido van Rossumaee08791992-09-08 09:05:33 +0000469 }
470 resizestring(&buf, buflen);
471 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000472}
473
474
Guido van Rossum81194471991-07-27 21:42:02 +0000475/* s.avail() method */
476
477static object *
478sock_avail(s, args)
479 sockobject *s;
480 object *args;
481{
482 struct timeval timeout;
483 fd_set readers;
484 int n;
Guido van Rossumd15b7331992-03-27 17:22:00 +0000485 if (!getnoarg(args))
486 return NULL;
Guido van Rossum81194471991-07-27 21:42:02 +0000487 timeout.tv_sec = 0;
488 timeout.tv_usec = 0;
489 FD_ZERO(&readers);
490 FD_SET(s->sock_fd, &readers);
491 n = select(s->sock_fd+1, &readers, (fd_set *)0, (fd_set *)0, &timeout);
492 if (n < 0)
493 return socket_error();
494 return newintobject((long) (n != 0));
495}
496
497
Guido van Rossum30a685f1991-06-27 15:51:29 +0000498/* s.bind(sockaddr) method */
499
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000500static object *
501sock_bind(s, args)
502 sockobject *s;
503 object *args;
504{
505 struct sockaddr *addr;
506 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000507 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000508 if (!getsockaddrarg(s, args, &addr, &addrlen))
509 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000510 BGN_SAVE
511 res = bind(s->sock_fd, addr, addrlen);
512 END_SAVE
513 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000514 return socket_error();
515 INCREF(None);
516 return None;
517}
518
Guido van Rossum30a685f1991-06-27 15:51:29 +0000519
520/* s.close() method.
521 Set the file descriptor to -1 so operations tried subsequently
522 will surely fail. */
523
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000524static object *
525sock_close(s, args)
526 sockobject *s;
527 object *args;
528{
529 if (!getnoarg(args))
530 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000531 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000532 (void) close(s->sock_fd);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000533 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000534 s->sock_fd = -1;
535 INCREF(None);
536 return None;
537}
538
Guido van Rossum30a685f1991-06-27 15:51:29 +0000539
540/* s.connect(sockaddr) method */
541
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000542static object *
543sock_connect(s, args)
544 sockobject *s;
545 object *args;
546{
547 struct sockaddr *addr;
548 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000549 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000550 if (!getsockaddrarg(s, args, &addr, &addrlen))
551 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000552 BGN_SAVE
553 res = connect(s->sock_fd, addr, addrlen);
554 END_SAVE
555 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000556 return socket_error();
557 INCREF(None);
558 return None;
559}
560
Guido van Rossum30a685f1991-06-27 15:51:29 +0000561
Guido van Rossumed233a51992-06-23 09:07:03 +0000562/* s.fileno() method */
563
564static object *
565sock_fileno(s, args)
566 sockobject *s;
567 object *args;
568{
569 if (!getnoarg(args))
570 return NULL;
571 return newintobject((long) s->sock_fd);
572}
573
574
Guido van Rossumc89705d1992-11-26 08:54:07 +0000575/* s.getsockname() method */
576
577static object *
578sock_getsockname(s, args)
579 sockobject *s;
580 object *args;
581{
582 char addrbuf[256];
583 int addrlen, res;
584 if (!getnoarg(args))
585 return NULL;
586 if (!getsockaddrlen(s, &addrlen))
587 return NULL;
588 BGN_SAVE
589 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
590 END_SAVE
591 if (res < 0)
592 return socket_error();
593 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
594}
595
596
597/* s.getpeername() method */
598
599static object *
600sock_getpeername(s, args)
601 sockobject *s;
602 object *args;
603{
604 char addrbuf[256];
605 int addrlen, res;
606 if (!getnoarg(args))
607 return NULL;
608 if (!getsockaddrlen(s, &addrlen))
609 return NULL;
610 BGN_SAVE
611 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
612 END_SAVE
613 if (res < 0)
614 return socket_error();
615 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
616}
617
618
Guido van Rossum30a685f1991-06-27 15:51:29 +0000619/* s.listen(n) method */
620
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000621static object *
622sock_listen(s, args)
623 sockobject *s;
624 object *args;
625{
626 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000627 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000628 if (!getintarg(args, &backlog))
629 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000630 BGN_SAVE
631 res = listen(s->sock_fd, backlog);
632 END_SAVE
633 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000634 return socket_error();
635 INCREF(None);
636 return None;
637}
638
Guido van Rossum30a685f1991-06-27 15:51:29 +0000639
640/* s.makefile(mode) method.
641 Create a new open file object referring to a dupped version of
642 the socket's file descriptor. (The dup() call is necessary so
643 that the open file and socket objects may be closed independent
644 of each other.)
645 The mode argument specifies 'r' or 'w' passed to fdopen(). */
646
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000647static object *
Guido van Rossum30a685f1991-06-27 15:51:29 +0000648sock_makefile(s, args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000649 sockobject *s;
650 object *args;
651{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000652 extern int fclose PROTO((FILE *));
Guido van Rossumff4949e1992-08-05 19:58:53 +0000653 char *mode;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000654 int fd;
655 FILE *fp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000656 if (!getargs(args, "s", &mode))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000657 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000658 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossumff4949e1992-08-05 19:58:53 +0000659 (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000660 return socket_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000661 return newopenfileobject(fp, "<socket>", mode, fclose);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000662}
663
664
665/* s.recv(nbytes) method */
666
667static object *
668sock_recv(s, args)
669 sockobject *s;
670 object *args;
671{
672 int len, n, flags;
673 object *buf;
674 if (!getintintarg(args, &len, &flags)) {
675 err_clear();
676 if (!getintarg(args, &len))
677 return NULL;
678 flags = 0;
679 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000680 buf = newsizedstringobject((char *) 0, len);
681 if (buf == NULL)
682 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000683 BGN_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000684 n = recv(s->sock_fd, getstringvalue(buf), len, flags);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000685 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000686 if (n < 0)
687 return socket_error();
688 if (resizestring(&buf, n) < 0)
689 return NULL;
690 return buf;
691}
692
Guido van Rossum30a685f1991-06-27 15:51:29 +0000693
694/* s.recvfrom(nbytes) method */
695
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000696static object *
697sock_recvfrom(s, args)
698 sockobject *s;
699 object *args;
700{
701 char addrbuf[256];
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000702 object *buf, *addr, *ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000703 int addrlen, len, n;
704 if (!getintarg(args, &len))
705 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000706 if (!getsockaddrlen(s, &addrlen))
707 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000708 buf = newsizedstringobject((char *) 0, len);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000709 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000710 n = recvfrom(s->sock_fd, getstringvalue(buf), len, 0,
711 addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000712 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000713 if (n < 0)
714 return socket_error();
715 if (resizestring(&buf, n) < 0)
716 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000717 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
718 ret = mkvalue("OO", buf, addr);
719 XDECREF(addr);
720 XDECREF(buf);
721 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000722}
723
Guido van Rossum30a685f1991-06-27 15:51:29 +0000724
725/* s.send(data) method */
726
727static object *
728sock_send(s, args)
729 sockobject *s;
730 object *args;
731{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000732 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000733 int len, n, flags;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000734 if (!getargs(args, "(s#i)", &buf, &len, &flags)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000735 err_clear();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000736 if (!getargs(args, "s#", &buf, &len))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000737 return NULL;
738 flags = 0;
739 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000740 BGN_SAVE
741 n = send(s->sock_fd, buf, len, flags);
742 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000743 if (n < 0)
744 return socket_error();
745 INCREF(None);
746 return None;
747}
748
749
750/* s.sendto(data, sockaddr) method */
751
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000752static object *
753sock_sendto(s, args)
754 sockobject *s;
755 object *args;
756{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000757 object *addro;
758 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000759 struct sockaddr *addr;
760 int addrlen, len, n;
761 if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
762 err_badarg();
763 return NULL;
764 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000765 if (!getargs(args, "(s#O)", &buf, &len, &addro) ||
766 !getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000767 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000768 BGN_SAVE
769 n = sendto(s->sock_fd, buf, len, 0, addr, addrlen);
770 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000771 if (n < 0)
772 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000773 INCREF(None);
774 return None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775}
776
Guido van Rossum30a685f1991-06-27 15:51:29 +0000777
778/* s.shutdown(how) method */
779
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000780static object *
781sock_shutdown(s, args)
782 sockobject *s;
783 object *args;
784{
785 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000786 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000787 if (!getintarg(args, &how))
788 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000789 BGN_SAVE
790 res = shutdown(s->sock_fd, how);
791 END_SAVE
792 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000793 return socket_error();
794 INCREF(None);
795 return None;
796}
797
Guido van Rossum30a685f1991-06-27 15:51:29 +0000798
799/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000800
801static struct methodlist sock_methods[] = {
802 {"accept", sock_accept},
Guido van Rossum81194471991-07-27 21:42:02 +0000803 {"avail", sock_avail},
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000804 {"allowbroadcast", sock_allowbroadcast},
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000805 {"setsockopt", sock_setsockopt},
806 {"getsockopt", sock_getsockopt},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807 {"bind", sock_bind},
808 {"close", sock_close},
809 {"connect", sock_connect},
Guido van Rossumed233a51992-06-23 09:07:03 +0000810 {"fileno", sock_fileno},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000811 {"getsockname", sock_getsockname},
812 {"getpeername", sock_getpeername},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000813 {"listen", sock_listen},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000814 {"makefile", sock_makefile},
815 {"recv", sock_recv},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000816 {"recvfrom", sock_recvfrom},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000817 {"send", sock_send},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000818 {"sendto", sock_sendto},
819 {"shutdown", sock_shutdown},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000820 {NULL, NULL} /* sentinel */
821};
822
Guido van Rossum30a685f1991-06-27 15:51:29 +0000823
824/* Deallocate a socket object in response to the last DECREF().
825 First close the file description. */
826
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000827static void
828sock_dealloc(s)
829 sockobject *s;
830{
831 (void) close(s->sock_fd);
832 DEL(s);
833}
834
Guido van Rossum30a685f1991-06-27 15:51:29 +0000835
836/* Return a socket object's named attribute. */
837
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000838static object *
839sock_getattr(s, name)
840 sockobject *s;
841 char *name;
842{
843 return findmethod(sock_methods, (object *) s, name);
844}
845
Guido van Rossum30a685f1991-06-27 15:51:29 +0000846
847/* Type object for socket objects.
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000848 XXX This should be static, but some compilers don't grok the
849 XXX forward reference to it in that case... */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000851typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852 OB_HEAD_INIT(&Typetype)
853 0,
854 "socket",
855 sizeof(sockobject),
856 0,
857 sock_dealloc, /*tp_dealloc*/
858 0, /*tp_print*/
859 sock_getattr, /*tp_getattr*/
860 0, /*tp_setattr*/
861 0, /*tp_compare*/
862 0, /*tp_repr*/
863 0, /*tp_as_number*/
864 0, /*tp_as_sequence*/
865 0, /*tp_as_mapping*/
866};
867
Guido van Rossum30a685f1991-06-27 15:51:29 +0000868
Guido van Rossum81194471991-07-27 21:42:02 +0000869/* Python interface to gethostname(). */
870
871/*ARGSUSED*/
872static object *
873socket_gethostname(self, args)
874 object *self;
875 object *args;
876{
877 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000878 int res;
Guido van Rossum81194471991-07-27 21:42:02 +0000879 if (!getnoarg(args))
880 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000881 BGN_SAVE
882 res = gethostname(buf, (int) sizeof buf - 1);
883 END_SAVE
884 if (res < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000885 return socket_error();
886 buf[sizeof buf - 1] = '\0';
887 return newstringobject(buf);
888}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000889
890
Guido van Rossum30a685f1991-06-27 15:51:29 +0000891/* Python interface to gethostbyname(name). */
892
893/*ARGSUSED*/
894static object *
895socket_gethostbyname(self, args)
896 object *self;
897 object *args;
898{
899 object *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900 struct sockaddr_in addrbuf;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000901 if (!getargs(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000902 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000903 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000904 return NULL;
905 return makeipaddr(&addrbuf);
906}
907
908
909/* Python interface to getservbyname(name).
910 This only returns the port number, since the other info is already
911 known or not useful (like the list of aliases). */
912
913/*ARGSUSED*/
914static object *
915socket_getservbyname(self, args)
916 object *self;
917 object *args;
918{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000919 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920 struct servent *sp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000921 if (!getargs(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000922 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000923 BGN_SAVE
924 sp = getservbyname(name, proto);
925 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000926 if (sp == NULL) {
927 err_setstr(SocketError, "service/proto not found");
928 return NULL;
929 }
930 return newintobject((long) ntohs(sp->s_port));
931}
932
933
934/* Python interface to socket(family, type, proto).
935 The third (protocol) argument is optional.
936 Return a new socket object. */
937
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000938/*ARGSUSED*/
939static object *
940socket_socket(self, args)
941 object *self;
942 object *args;
943{
944 sockobject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000945 int fd, family, type, proto;
946 proto = 0;
947 if (!getargs(args, "(ii)", &family, &type)) {
948 err_clear();
949 if (!getargs(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000950 return NULL;
951 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000952 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000953 fd = socket(family, type, proto);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000954 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000955 if (fd < 0)
956 return socket_error();
957 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000958 /* If the object can't be created, don't forget to close the
959 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000960 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000961 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +0000962 /* From now on, ignore SIGPIPE and let the error checking
963 do the work. */
964 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000965 return (object *) s;
966}
967
Guido van Rossum30a685f1991-06-27 15:51:29 +0000968
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000969/* Create a socket object from a numeric file description.
970 Useful e.g. if stdin is a socket.
971 Additional arguments as for socket(). */
972
973/*ARGSUSED*/
974static object *
975socket_fromfd(self, args)
976 object *self;
977 object *args;
978{
979 sockobject *s;
980 int fd, family, type, proto;
981 proto = 0;
982 if (!getargs(args, "(iii)", &fd, &family, &type)) {
983 err_clear();
984 if (!getargs(args, "(iiii)", &fd, &family, &type, &proto))
985 return NULL;
986 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000987 /* Dup the fd so it and the socket can be closed independently */
988 fd = dup(fd);
989 if (fd < 0)
990 return socket_error();
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000991 s = newsockobject(fd, family, type, proto);
992 /* From now on, ignore SIGPIPE and let the error checking
993 do the work. */
994 (void) signal(SIGPIPE, SIG_IGN);
995 return (object *) s;
996}
997
998
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999/* List of functions exported by this module. */
1000
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001001static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001002 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +00001003 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001004 {"getservbyname", socket_getservbyname},
1005 {"socket", socket_socket},
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001006 {"fromfd", socket_fromfd},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001008};
1009
Guido van Rossum30a685f1991-06-27 15:51:29 +00001010
1011/* Convenience routine to export an integer value.
1012 For simplicity, errors (which are unlikely anyway) are ignored. */
1013
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001014static void
1015insint(d, name, value)
1016 object *d;
1017 char *name;
1018 int value;
1019{
1020 object *v = newintobject((long) value);
1021 if (v == NULL) {
1022 /* Don't bother reporting this error */
1023 err_clear();
1024 }
1025 else {
1026 dictinsert(d, name, v);
1027 DECREF(v);
1028 }
1029}
1030
Guido van Rossum30a685f1991-06-27 15:51:29 +00001031
1032/* Initialize this module.
1033 This is called when the first 'import socket' is done,
1034 via a table in config.c, if config.c is compiled with USE_SOCKET
1035 defined. */
1036
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001037void
1038initsocket()
1039{
1040 object *m, *d;
1041
1042 m = initmodule("socket", socket_methods);
1043 d = getmoduledict(m);
1044 SocketError = newstringobject("socket.error");
1045 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
1046 fatal("can't define socket.error");
1047 insint(d, "AF_INET", AF_INET);
1048 insint(d, "AF_UNIX", AF_UNIX);
1049 insint(d, "SOCK_STREAM", SOCK_STREAM);
1050 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1051 insint(d, "SOCK_RAW", SOCK_RAW);
1052 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1053 insint(d, "SOCK_RDM", SOCK_RDM);
1054}