blob: 3fc875535f0541082bbc1d774d2f4a91883c38bf [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,
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000391 (ANY *)&flag, sizeof flag);
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000392 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 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000425 res = setsockopt(s->sock_fd, level, optname, (ANY *)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;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000453 res = getsockopt(s->sock_fd, level, optname,
454 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000455 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;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000469 res = getsockopt(s->sock_fd, level, optname,
470 (ANY *)getstringvalue(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000471 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 Rossum18c9a4f1993-05-25 12:16:29 +0000717 if (!getsockaddrlen(s, &addrlen))
718 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000719 buf = newsizedstringobject((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000720 if (buf == NULL)
721 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000722 BGN_SAVE
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000723 n = recvfrom(s->sock_fd, getstringvalue(buf), len, flags,
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000724 (ANY *)addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000725 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000726 if (n < 0)
727 return socket_error();
728 if (resizestring(&buf, n) < 0)
729 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000730 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
731 ret = mkvalue("OO", buf, addr);
732 XDECREF(addr);
733 XDECREF(buf);
734 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000735}
736
Guido van Rossum30a685f1991-06-27 15:51:29 +0000737
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000738/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000739
740static object *
741sock_send(s, args)
742 sockobject *s;
743 object *args;
744{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000745 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000746 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000747 flags = 0;
Guido van Rossum234f9421993-06-17 12:35:49 +0000748 if (!getargs(args, "s#", &buf, &len)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000749 err_clear();
Guido van Rossum234f9421993-06-17 12:35:49 +0000750 if (!getargs(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000753 BGN_SAVE
754 n = send(s->sock_fd, buf, len, flags);
755 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000756 if (n < 0)
757 return socket_error();
758 INCREF(None);
759 return None;
760}
761
762
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000763/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000764
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000765static object *
766sock_sendto(s, args)
767 sockobject *s;
768 object *args;
769{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000770 object *addro;
771 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000772 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000773 int addrlen, len, n, flags;
774 flags = 0;
775 if (!getargs(args, "(s#O)", &buf, &len, &addro)) {
776 err_clear();
777 if (!getargs(args, "(s#iO)", &buf, &len, &flags, &addro))
778 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000779 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000780 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000781 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000782 BGN_SAVE
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000783 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000784 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000785 if (n < 0)
786 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787 INCREF(None);
788 return None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000789}
790
Guido van Rossum30a685f1991-06-27 15:51:29 +0000791
792/* s.shutdown(how) method */
793
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794static object *
795sock_shutdown(s, args)
796 sockobject *s;
797 object *args;
798{
799 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000800 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000801 if (!getintarg(args, &how))
802 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000803 BGN_SAVE
804 res = shutdown(s->sock_fd, how);
805 END_SAVE
806 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000807 return socket_error();
808 INCREF(None);
809 return None;
810}
811
Guido van Rossum30a685f1991-06-27 15:51:29 +0000812
813/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000814
815static struct methodlist sock_methods[] = {
816 {"accept", sock_accept},
Guido van Rossum81194471991-07-27 21:42:02 +0000817 {"avail", sock_avail},
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000818 {"allowbroadcast", sock_allowbroadcast},
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000819 {"setsockopt", sock_setsockopt},
820 {"getsockopt", sock_getsockopt},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000821 {"bind", sock_bind},
822 {"close", sock_close},
823 {"connect", sock_connect},
Guido van Rossumed233a51992-06-23 09:07:03 +0000824 {"fileno", sock_fileno},
Guido van Rossumc89705d1992-11-26 08:54:07 +0000825 {"getsockname", sock_getsockname},
Guido van Rossum9575a441993-04-07 14:06:14 +0000826#ifndef NO_GETPEERNAME
Guido van Rossumc89705d1992-11-26 08:54:07 +0000827 {"getpeername", sock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000828#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829 {"listen", sock_listen},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000830 {"makefile", sock_makefile},
831 {"recv", sock_recv},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000832 {"recvfrom", sock_recvfrom},
Guido van Rossum30a685f1991-06-27 15:51:29 +0000833 {"send", sock_send},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000834 {"sendto", sock_sendto},
835 {"shutdown", sock_shutdown},
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000836 {NULL, NULL} /* sentinel */
837};
838
Guido van Rossum30a685f1991-06-27 15:51:29 +0000839
840/* Deallocate a socket object in response to the last DECREF().
841 First close the file description. */
842
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000843static void
844sock_dealloc(s)
845 sockobject *s;
846{
847 (void) close(s->sock_fd);
848 DEL(s);
849}
850
Guido van Rossum30a685f1991-06-27 15:51:29 +0000851
852/* Return a socket object's named attribute. */
853
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854static object *
855sock_getattr(s, name)
856 sockobject *s;
857 char *name;
858{
859 return findmethod(sock_methods, (object *) s, name);
860}
861
Guido van Rossum30a685f1991-06-27 15:51:29 +0000862
863/* Type object for socket objects.
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000864 XXX This should be static, but some compilers don't grok the
865 XXX forward reference to it in that case... */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000866
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000867typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000868 OB_HEAD_INIT(&Typetype)
869 0,
870 "socket",
871 sizeof(sockobject),
872 0,
873 sock_dealloc, /*tp_dealloc*/
874 0, /*tp_print*/
875 sock_getattr, /*tp_getattr*/
876 0, /*tp_setattr*/
877 0, /*tp_compare*/
878 0, /*tp_repr*/
879 0, /*tp_as_number*/
880 0, /*tp_as_sequence*/
881 0, /*tp_as_mapping*/
882};
883
Guido van Rossum30a685f1991-06-27 15:51:29 +0000884
Guido van Rossum81194471991-07-27 21:42:02 +0000885/* Python interface to gethostname(). */
886
887/*ARGSUSED*/
888static object *
889socket_gethostname(self, args)
890 object *self;
891 object *args;
892{
893 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000894 int res;
Guido van Rossum81194471991-07-27 21:42:02 +0000895 if (!getnoarg(args))
896 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000897 BGN_SAVE
898 res = gethostname(buf, (int) sizeof buf - 1);
899 END_SAVE
900 if (res < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000901 return socket_error();
902 buf[sizeof buf - 1] = '\0';
903 return newstringobject(buf);
904}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000905
906
Guido van Rossum30a685f1991-06-27 15:51:29 +0000907/* Python interface to gethostbyname(name). */
908
909/*ARGSUSED*/
910static object *
911socket_gethostbyname(self, args)
912 object *self;
913 object *args;
914{
915 object *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000916 struct sockaddr_in addrbuf;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000917 if (!getargs(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000918 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000919 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920 return NULL;
921 return makeipaddr(&addrbuf);
922}
923
924
925/* Python interface to getservbyname(name).
926 This only returns the port number, since the other info is already
927 known or not useful (like the list of aliases). */
928
929/*ARGSUSED*/
930static object *
931socket_getservbyname(self, args)
932 object *self;
933 object *args;
934{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000935 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000936 struct servent *sp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000937 if (!getargs(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000938 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000939 BGN_SAVE
940 sp = getservbyname(name, proto);
941 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000942 if (sp == NULL) {
943 err_setstr(SocketError, "service/proto not found");
944 return NULL;
945 }
946 return newintobject((long) ntohs(sp->s_port));
947}
948
949
950/* Python interface to socket(family, type, proto).
951 The third (protocol) argument is optional.
952 Return a new socket object. */
953
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000954/*ARGSUSED*/
955static object *
956socket_socket(self, args)
957 object *self;
958 object *args;
959{
960 sockobject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000961 int fd, family, type, proto;
962 proto = 0;
963 if (!getargs(args, "(ii)", &family, &type)) {
964 err_clear();
965 if (!getargs(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000966 return NULL;
967 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000968 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000969 fd = socket(family, type, proto);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000970 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000971 if (fd < 0)
972 return socket_error();
973 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000974 /* If the object can't be created, don't forget to close the
975 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000976 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000977 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +0000978 /* From now on, ignore SIGPIPE and let the error checking
979 do the work. */
980 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000981 return (object *) s;
982}
983
Guido van Rossum30a685f1991-06-27 15:51:29 +0000984
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000985/* Create a socket object from a numeric file description.
986 Useful e.g. if stdin is a socket.
987 Additional arguments as for socket(). */
988
989/*ARGSUSED*/
990static object *
991socket_fromfd(self, args)
992 object *self;
993 object *args;
994{
995 sockobject *s;
996 int fd, family, type, proto;
997 proto = 0;
998 if (!getargs(args, "(iii)", &fd, &family, &type)) {
999 err_clear();
1000 if (!getargs(args, "(iiii)", &fd, &family, &type, &proto))
1001 return NULL;
1002 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001003 /* Dup the fd so it and the socket can be closed independently */
1004 fd = dup(fd);
1005 if (fd < 0)
1006 return socket_error();
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001007 s = newsockobject(fd, family, type, proto);
1008 /* From now on, ignore SIGPIPE and let the error checking
1009 do the work. */
1010 (void) signal(SIGPIPE, SIG_IGN);
1011 return (object *) s;
1012}
1013
1014
Guido van Rossum30a685f1991-06-27 15:51:29 +00001015/* List of functions exported by this module. */
1016
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001017static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001018 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +00001019 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001020 {"getservbyname", socket_getservbyname},
1021 {"socket", socket_socket},
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001022 {"fromfd", socket_fromfd},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001023 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001024};
1025
Guido van Rossum30a685f1991-06-27 15:51:29 +00001026
1027/* Convenience routine to export an integer value.
1028 For simplicity, errors (which are unlikely anyway) are ignored. */
1029
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001030static void
1031insint(d, name, value)
1032 object *d;
1033 char *name;
1034 int value;
1035{
1036 object *v = newintobject((long) value);
1037 if (v == NULL) {
1038 /* Don't bother reporting this error */
1039 err_clear();
1040 }
1041 else {
1042 dictinsert(d, name, v);
1043 DECREF(v);
1044 }
1045}
1046
Guido van Rossum30a685f1991-06-27 15:51:29 +00001047
1048/* Initialize this module.
1049 This is called when the first 'import socket' is done,
1050 via a table in config.c, if config.c is compiled with USE_SOCKET
1051 defined. */
1052
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001053void
1054initsocket()
1055{
1056 object *m, *d;
1057
1058 m = initmodule("socket", socket_methods);
1059 d = getmoduledict(m);
1060 SocketError = newstringobject("socket.error");
1061 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
1062 fatal("can't define socket.error");
1063 insint(d, "AF_INET", AF_INET);
1064 insint(d, "AF_UNIX", AF_UNIX);
1065 insint(d, "SOCK_STREAM", SOCK_STREAM);
1066 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1067 insint(d, "SOCK_RAW", SOCK_RAW);
1068 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1069 insint(d, "SOCK_RDM", SOCK_RDM);
1070}