blob: 6f50fc3cca298c77eacd3d95b64f9581fc829edc [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/***********************************************************
Guido van Rossumb6775db1994-08-01 11:34:53 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossume5372401993-03-16 12:15:04 +00003Amsterdam, 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 Rossumb6775db1994-08-01 11:34:53 +000033- no asynchronous I/O (but you can use select() on sockets)
Guido van Rossum81194471991-07-27 21:42:02 +000034- 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
Guido van Rossum0e69587d1992-06-05 15:11:30 +000054- s.setsockopt(level, optname, flag) --> None
55- s.getsockopt(level, optname) --> flag
Guido van Rossum30a685f1991-06-27 15:51:29 +000056- s.bind(sockaddr) --> None
57- s.connect(sockaddr) --> None
Guido van Rossumc89705d1992-11-26 08:54:07 +000058- s.getsockname() --> sockaddr
59- s.getpeername() --> sockaddr
Guido van Rossum30a685f1991-06-27 15:51:29 +000060- s.listen(n) --> None
61- s.makefile(mode) --> file object
Guido van Rossumeb6b33a1993-05-25 09:38:27 +000062- s.recv(nbytes [,flags]) --> string
Guido van Rossum18c9a4f1993-05-25 12:16:29 +000063- s.recvfrom(nbytes [,flags]) --> string, sockaddr
Guido van Rossumb6775db1994-08-01 11:34:53 +000064- s.send(string [,flags]) --> nbytes
65- s.sendto(string, [flags,] sockaddr) --> nbytes
Guido van Rossume4485b01994-09-07 14:32:49 +000066- s.setblocking(1 | 0) --> 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 Rossumb6775db1994-08-01 11:34:53 +000076#include <sys/types.h>
77#include "mytime.h"
Guido van Rossumed233a51992-06-23 09:07:03 +000078
Guido van Rossum81194471991-07-27 21:42:02 +000079#include <signal.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000080#ifndef NT
Guido van Rossumb6775db1994-08-01 11:34:53 +000081#include <netdb.h>
Guido van Rossum6574b3e1991-06-25 21:36:08 +000082#include <sys/socket.h>
83#include <netinet/in.h>
Guido van Rossume4485b01994-09-07 14:32:49 +000084#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000085#else
86#include <winsock.h>
87#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000088#ifdef HAVE_SYS_UN_H
Guido van Rossum6574b3e1991-06-25 21:36:08 +000089#include <sys/un.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000090#else
91#undef AF_UNIX
Guido van Rossum9575a441993-04-07 14:06:14 +000092#endif
93
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000094/* Here we have some hacks to choose between K&R or ANSI style function
95 definitions. For NT to build this as an extension module (ie, DLL)
96 it must be compiled by the C++ compiler, as it takes the address of
97 a static data item exported from the main Python DLL.
98*/
99#ifdef NT
100/* seem to be a few differences in the API */
101#define close closesocket
102#define NO_DUP /* I wont trust passing a socket to NT's RTL!! */
103#define FORCE_ANSI_FUNC_DEFS
104#endif
105
106#ifdef FORCE_ANSI_FUNC_DEFS
107#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
108fnname( arg1type arg1name )
109
110#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
111fnname( arg1type arg1name, arg2type arg2name )
112
113#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name ) \
114fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name )
115
116#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name , arg3type, arg3name, arg4type, arg4name ) \
117fnname( arg1type arg1name, arg2type arg2name, arg3type arg3name, arg4type arg4name )
118
119#else /* !FORCE_ANSI_FN_DEFS */
120#define BUILD_FUNC_DEF_1( fnname, arg1type, arg1name ) \
121fnname( arg1name ) \
122 arg1type arg1name;
123
124#define BUILD_FUNC_DEF_2( fnname, arg1type, arg1name, arg2type, arg2name ) \
125fnname( arg1name, arg2name ) \
126 arg1type arg1name; \
127 arg2type arg2name;
128
129#define BUILD_FUNC_DEF_3( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name ) \
130fnname( arg1name, arg2name, arg3name ) \
131 arg1type arg1name; \
132 arg2type arg2name; \
133 arg3type arg3name;
134
135#define BUILD_FUNC_DEF_4( fnname, arg1type, arg1name, arg2type, arg2name, arg3type, arg3name, arg4type, arg4name ) \
136fnname( arg1name, arg2name, arg3name, arg4name ) \
137 arg1type arg1name; \
138 arg2type arg2name; \
139 arg3type arg3name; \
140 arg4type arg4name;
141
142#endif /* !FORCE_ANSI_FN_DEFS */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000143
144/* Global variable holding the exception type for errors detected
145 by this module (but not argument type or memory errors, etc.). */
146
147static object *SocketError;
148
149
150/* Convenience function to raise an error according to errno
151 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000152
153static object *
154socket_error()
155{
156 return err_errno(SocketError);
157}
158
Guido van Rossum30a685f1991-06-27 15:51:29 +0000159
160/* The object holding a socket. It holds some extra information,
161 like the address family, which is used to decode socket address
162 arguments properly. */
163
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000164typedef struct {
165 OB_HEAD
Guido van Rossum30a685f1991-06-27 15:51:29 +0000166 int sock_fd; /* Socket file descriptor */
167 int sock_family; /* Address family, e.g., AF_INET */
168 int sock_type; /* Socket type, e.g., SOCK_STREAM */
169 int sock_proto; /* Protocol type, usually 0 */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000170} sockobject;
171
Guido van Rossum30a685f1991-06-27 15:51:29 +0000172
173/* A forward reference to the Socktype type object.
174 The Socktype variable contains pointers to various functions,
175 some of which call newsocobject(), which uses Socktype, so
Guido van Rossum54ba21b1991-09-10 14:57:12 +0000176 there has to be a circular reference. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000177
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178staticforward typeobject Socktype;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000179
Guido van Rossum30a685f1991-06-27 15:51:29 +0000180
181/* Create a new socket object.
182 This just creates the object and initializes it.
183 If the creation fails, return NULL and set an exception (implicit
184 in NEWOBJ()). */
185
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000186static sockobject *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000187BUILD_FUNC_DEF_4(newsockobject, int, fd, int, family, int, type, int, proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000188{
189 sockobject *s;
190 s = NEWOBJ(sockobject, &Socktype);
191 if (s != NULL) {
192 s->sock_fd = fd;
193 s->sock_family = family;
194 s->sock_type = type;
195 s->sock_proto = proto;
196 }
197 return s;
198}
199
Guido van Rossum30a685f1991-06-27 15:51:29 +0000200
201/* Convert a string specifying a host name or one of a few symbolic
202 names to a numeric IP address. This usually calls gethostbyname()
203 to do the work; the names "" and "<broadcast>" are special.
204 Return the length (should always be 4 bytes), or negative if
205 an error occurred; then an exception is raised. */
206
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000207static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000208BUILD_FUNC_DEF_2(setipaddr, char*, name, struct sockaddr_in *, addr_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000209{
210 struct hostent *hp;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000211 int d1, d2, d3, d4;
212 char ch;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000213
Guido van Rossum30a685f1991-06-27 15:51:29 +0000214 if (name[0] == '\0') {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000215 addr_ret->sin_addr.s_addr = INADDR_ANY;
216 return 4;
217 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000218 if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000219 addr_ret->sin_addr.s_addr = INADDR_BROADCAST;
220 return 4;
221 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000222 if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&
223 0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&
224 0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {
225 addr_ret->sin_addr.s_addr = htonl(
226 ((long) d1 << 24) | ((long) d2 << 16) |
227 ((long) d3 << 8) | ((long) d4 << 0));
228 return 4;
229 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000230 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000231 hp = gethostbyname(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000232 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000233 if (hp == NULL) {
234 err_setstr(SocketError, "host not found");
235 return -1;
236 }
237 memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
238 return hp->h_length;
239}
240
Guido van Rossum30a685f1991-06-27 15:51:29 +0000241
Guido van Rossum30a685f1991-06-27 15:51:29 +0000242/* Create a string object representing an IP address.
243 This is always a string of the form 'dd.dd.dd.dd' (with variable
244 size numbers). */
245
246static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000247BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000248{
249 long x = ntohl(addr->sin_addr.s_addr);
250 char buf[100];
251 sprintf(buf, "%d.%d.%d.%d",
252 (int) (x>>24) & 0xff, (int) (x>>16) & 0xff,
253 (int) (x>> 8) & 0xff, (int) (x>> 0) & 0xff);
254 return newstringobject(buf);
255}
256
257
258/* Create an object representing the given socket address,
259 suitable for passing it back to bind(), connect() etc.
260 The family field of the sockaddr structure is inspected
261 to determine what kind of address it really is. */
262
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000263/*ARGSUSED*/
264static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000265BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *, addr, int, addrlen)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000266{
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000267 if (addrlen == 0) {
268 /* No address -- may be recvfrom() from known socket */
269 INCREF(None);
270 return None;
271 }
272
Guido van Rossum30a685f1991-06-27 15:51:29 +0000273 switch (addr->sa_family) {
274
275 case AF_INET:
276 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000277 struct sockaddr_in *a = (struct sockaddr_in *) addr;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000278 object *addr = makeipaddr(a);
279 object *ret = mkvalue("Oi", addr, ntohs(a->sin_port));
280 XDECREF(addr);
281 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000282 }
Guido van Rossum30a685f1991-06-27 15:51:29 +0000283
Guido van Rossumb6775db1994-08-01 11:34:53 +0000284#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000285 case AF_UNIX:
286 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000287 struct sockaddr_un *a = (struct sockaddr_un *) addr;
288 return newstringobject(a->sun_path);
289 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000290#endif /* AF_UNIX */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000291
292 /* More cases here... */
293
294 default:
295 err_setstr(SocketError, "return unknown socket address type");
296 return NULL;
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000297
Guido van Rossum30a685f1991-06-27 15:51:29 +0000298 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000299}
300
Guido van Rossum30a685f1991-06-27 15:51:29 +0000301
302/* Parse a socket address argument according to the socket object's
303 address family. Return 1 if the address was in the proper format,
304 0 of not. The address is returned through addr_ret, its length
305 through len_ret. */
306
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000307static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000308BUILD_FUNC_DEF_4(
309getsockaddrarg,sockobject *,s, object *,args, struct sockaddr **,addr_ret, int *,len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000310{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000311 switch (s->sock_family) {
312
Guido van Rossumb6775db1994-08-01 11:34:53 +0000313#ifdef AF_UNIX
Guido van Rossum30a685f1991-06-27 15:51:29 +0000314 case AF_UNIX:
315 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000316 static struct sockaddr_un addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000317 char *path;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000318 int len;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000319 if (!getargs(args, "s#", &path, &len))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000320 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000321 if (len > sizeof addr.sun_path) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000322 err_setstr(SocketError, "AF_UNIX path too long");
323 return 0;
324 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000325 addr.sun_family = AF_UNIX;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000326 memcpy(addr.sun_path, path, len);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000327 *addr_ret = (struct sockaddr *) &addr;
328 *len_ret = len + sizeof addr.sun_family;
329 return 1;
330 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000331#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000332
Guido van Rossum30a685f1991-06-27 15:51:29 +0000333 case AF_INET:
334 {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000335 static struct sockaddr_in addr;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000336 char *host;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000337 int port;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000338 if (!getargs(args, "(si)", &host, &port))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000339 return 0;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000340 if (setipaddr(host, &addr) < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000341 return 0;
342 addr.sin_family = AF_INET;
343 addr.sin_port = htons(port);
344 *addr_ret = (struct sockaddr *) &addr;
345 *len_ret = sizeof addr;
346 return 1;
347 }
348
Guido van Rossum30a685f1991-06-27 15:51:29 +0000349 /* More cases here... */
350
351 default:
352 err_setstr(SocketError, "getsockaddrarg: bad family");
353 return 0;
354
355 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000356}
357
Guido van Rossum30a685f1991-06-27 15:51:29 +0000358
Guido van Rossum710e1df1992-06-12 10:39:36 +0000359/* Get the address length according to the socket object's address family.
360 Return 1 if the family is known, 0 otherwise. The length is returned
361 through len_ret. */
362
363static int
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000364BUILD_FUNC_DEF_2(getsockaddrlen,sockobject *,s, int *,len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +0000365{
366 switch (s->sock_family) {
367
Guido van Rossumb6775db1994-08-01 11:34:53 +0000368#ifdef AF_UNIX
Guido van Rossum710e1df1992-06-12 10:39:36 +0000369 case AF_UNIX:
370 {
371 *len_ret = sizeof (struct sockaddr_un);
372 return 1;
373 }
Guido van Rossumb6775db1994-08-01 11:34:53 +0000374#endif /* AF_UNIX */
Guido van Rossum710e1df1992-06-12 10:39:36 +0000375
376 case AF_INET:
377 {
378 *len_ret = sizeof (struct sockaddr_in);
379 return 1;
380 }
381
382 /* More cases here... */
383
384 default:
385 err_setstr(SocketError, "getsockaddrarg: bad family");
386 return 0;
387
388 }
389}
390
391
Guido van Rossum30a685f1991-06-27 15:51:29 +0000392/* s.accept() method */
393
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000394static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000395BUILD_FUNC_DEF_2(sock_accept,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000396{
397 char addrbuf[256];
398 int addrlen, newfd;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000399 object *sock, *addr, *res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000400 if (!getnoarg(args))
401 return NULL;
Guido van Rossum710e1df1992-06-12 10:39:36 +0000402 if (!getsockaddrlen(s, &addrlen))
403 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000404 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000405 newfd = accept(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000406 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000407 if (newfd < 0)
408 return socket_error();
Guido van Rossum30a685f1991-06-27 15:51:29 +0000409 /* Create the new object with unspecified family,
410 to avoid calls to bind() etc. on it. */
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000411 sock = (object *) newsockobject(newfd,
412 s->sock_family,
413 s->sock_type,
414 s->sock_proto);
415 if (sock == NULL)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000416 close(newfd);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000417 addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
418 res = mkvalue("OO", sock, addr);
419 XDECREF(sock);
420 XDECREF(addr);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000421 return res;
422}
423
Guido van Rossum30a685f1991-06-27 15:51:29 +0000424
Guido van Rossumc65a5251994-08-05 13:44:50 +0000425#if 0
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000426/* s.allowbroadcast() method */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000427/* XXX obsolete -- will disappear in next release */
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000428
429static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000430BUILD_FUNC_DEF_2(sock_allowbroadcast,sockobject *,s, object *,args)
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000431{
432 int flag;
433 int res;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000434 if (!getargs(args, "i", &flag))
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000435 return NULL;
436 res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000437 (ANY *)&flag, sizeof flag);
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000438 if (res < 0)
439 return socket_error();
440 INCREF(None);
441 return None;
442}
Guido van Rossumc65a5251994-08-05 13:44:50 +0000443#endif
Guido van Rossume0e5edc1991-10-20 20:22:28 +0000444
445
Guido van Rossume4485b01994-09-07 14:32:49 +0000446#ifndef NT
447
448/* s.setblocking(1 | 0) method */
449
450static object *
451sock_setblocking(s, args)
452 sockobject *s;
453 object *args;
454{
455 int block;
456 int delay_flag;
457 if (!getintarg(args, &block))
458 return NULL;
459 BGN_SAVE
460 delay_flag = fcntl (s->sock_fd, F_GETFL, 0);
461 if (block)
462 delay_flag &= (~O_NDELAY);
463 else
464 delay_flag |= O_NDELAY;
465 fcntl (s->sock_fd, F_SETFL, delay_flag);
466 END_SAVE
467
468 INCREF(None);
469 return None;
470}
471#endif
472
473
Guido van Rossumaee08791992-09-08 09:05:33 +0000474/* s.setsockopt() method.
475 With an integer third argument, sets an integer option.
476 With a string third argument, sets an option from a buffer;
477 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000478
479static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000480BUILD_FUNC_DEF_2(sock_setsockopt,sockobject *,s, object *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000481{
482 int level;
483 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000484 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000485 char *buf;
486 int buflen;
487 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000488
Guido van Rossumaee08791992-09-08 09:05:33 +0000489 if (getargs(args, "(iii)", &level, &optname, &flag)) {
490 buf = (char *) &flag;
491 buflen = sizeof flag;
492 }
493 else {
494 err_clear();
495 if (!getargs(args, "(iis#)", &level, &optname, &buf, &buflen))
496 return NULL;
497 }
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000498 res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000499 if (res < 0)
500 return socket_error();
501 INCREF(None);
502 return None;
503}
504
505
Guido van Rossumaee08791992-09-08 09:05:33 +0000506/* s.getsockopt() method.
507 With two arguments, retrieves an integer option.
508 With a third integer argument, retrieves a string buffer of that size;
509 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000510
511static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000512BUILD_FUNC_DEF_2(sock_getsockopt,sockobject *,s, object *,args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000513{
514 int level;
515 int optname;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000516 int res;
Guido van Rossumaee08791992-09-08 09:05:33 +0000517 object *buf;
518 int buflen;
519 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000520
Guido van Rossumaee08791992-09-08 09:05:33 +0000521 if (getargs(args, "(ii)", &level, &optname)) {
522 int flag = 0;
523 int flagsize = sizeof flag;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000524 res = getsockopt(s->sock_fd, level, optname,
525 (ANY *)&flag, &flagsize);
Guido van Rossumaee08791992-09-08 09:05:33 +0000526 if (res < 0)
527 return socket_error();
528 return newintobject(flag);
529 }
530 err_clear();
531 if (!getargs(args, "(iii)", &level, &optname, &buflen))
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000532 return NULL;
Guido van Rossumaee08791992-09-08 09:05:33 +0000533 if (buflen <= 0 || buflen > 1024) {
534 err_setstr(SocketError, "getsockopt buflen out of range");
535 return NULL;
536 }
537 buf = newsizedstringobject((char *)NULL, buflen);
538 if (buf == NULL)
539 return NULL;
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000540 res = getsockopt(s->sock_fd, level, optname,
541 (ANY *)getstringvalue(buf), &buflen);
Guido van Rossumaee08791992-09-08 09:05:33 +0000542 if (res < 0) {
543 DECREF(buf);
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000544 return socket_error();
Guido van Rossumaee08791992-09-08 09:05:33 +0000545 }
546 resizestring(&buf, buflen);
547 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +0000548}
549
550
Guido van Rossum30a685f1991-06-27 15:51:29 +0000551/* s.bind(sockaddr) method */
552
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000553static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000554BUILD_FUNC_DEF_2(sock_bind,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000555{
556 struct sockaddr *addr;
557 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000558 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000559 if (!getsockaddrarg(s, args, &addr, &addrlen))
560 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000561 BGN_SAVE
562 res = bind(s->sock_fd, addr, addrlen);
563 END_SAVE
564 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000565 return socket_error();
566 INCREF(None);
567 return None;
568}
569
Guido van Rossum30a685f1991-06-27 15:51:29 +0000570
571/* s.close() method.
572 Set the file descriptor to -1 so operations tried subsequently
573 will surely fail. */
574
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000575static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000576BUILD_FUNC_DEF_2(sock_close,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000577{
578 if (!getnoarg(args))
579 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000580 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000581 (void) close(s->sock_fd);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000582 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000583 s->sock_fd = -1;
584 INCREF(None);
585 return None;
586}
587
Guido van Rossum30a685f1991-06-27 15:51:29 +0000588
589/* s.connect(sockaddr) method */
590
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000591static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000592BUILD_FUNC_DEF_2(sock_connect,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000593{
594 struct sockaddr *addr;
595 int addrlen;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000596 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000597 if (!getsockaddrarg(s, args, &addr, &addrlen))
598 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000599 BGN_SAVE
600 res = connect(s->sock_fd, addr, addrlen);
601 END_SAVE
602 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000603 return socket_error();
604 INCREF(None);
605 return None;
606}
607
Guido van Rossum30a685f1991-06-27 15:51:29 +0000608
Guido van Rossumed233a51992-06-23 09:07:03 +0000609/* s.fileno() method */
610
611static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000612BUILD_FUNC_DEF_2(sock_fileno,sockobject *,s, object *,args)
Guido van Rossumed233a51992-06-23 09:07:03 +0000613{
614 if (!getnoarg(args))
615 return NULL;
616 return newintobject((long) s->sock_fd);
617}
618
619
Guido van Rossumc89705d1992-11-26 08:54:07 +0000620/* s.getsockname() method */
621
622static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000623BUILD_FUNC_DEF_2(sock_getsockname,sockobject *,s, object *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000624{
625 char addrbuf[256];
626 int addrlen, res;
627 if (!getnoarg(args))
628 return NULL;
629 if (!getsockaddrlen(s, &addrlen))
630 return NULL;
631 BGN_SAVE
632 res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
633 END_SAVE
634 if (res < 0)
635 return socket_error();
636 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
637}
638
639
Guido van Rossumb6775db1994-08-01 11:34:53 +0000640#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000641/* s.getpeername() method */
642
643static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000644BUILD_FUNC_DEF_2(sock_getpeername,sockobject *,s, object *,args)
Guido van Rossumc89705d1992-11-26 08:54:07 +0000645{
646 char addrbuf[256];
647 int addrlen, res;
648 if (!getnoarg(args))
649 return NULL;
650 if (!getsockaddrlen(s, &addrlen))
651 return NULL;
652 BGN_SAVE
653 res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
654 END_SAVE
655 if (res < 0)
656 return socket_error();
657 return makesockaddr((struct sockaddr *) addrbuf, addrlen);
658}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000659#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +0000660
661
Guido van Rossum30a685f1991-06-27 15:51:29 +0000662/* s.listen(n) method */
663
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000664static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000665BUILD_FUNC_DEF_2(sock_listen,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000666{
667 int backlog;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000668 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000669 if (!getintarg(args, &backlog))
670 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000671 BGN_SAVE
Guido van Rossumb6775db1994-08-01 11:34:53 +0000672 if (backlog < 1)
673 backlog = 1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000674 res = listen(s->sock_fd, backlog);
675 END_SAVE
676 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000677 return socket_error();
678 INCREF(None);
679 return None;
680}
681
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000682#ifndef NO_DUP
Guido van Rossum30a685f1991-06-27 15:51:29 +0000683/* s.makefile(mode) method.
684 Create a new open file object referring to a dupped version of
685 the socket's file descriptor. (The dup() call is necessary so
686 that the open file and socket objects may be closed independent
687 of each other.)
688 The mode argument specifies 'r' or 'w' passed to fdopen(). */
689
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000690static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000691BUILD_FUNC_DEF_2(sock_makefile,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000692{
Guido van Rossum30a685f1991-06-27 15:51:29 +0000693 extern int fclose PROTO((FILE *));
Guido van Rossumff4949e1992-08-05 19:58:53 +0000694 char *mode;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000695 int fd;
696 FILE *fp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000697 if (!getargs(args, "s", &mode))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000698 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000699 if ((fd = dup(s->sock_fd)) < 0 ||
Guido van Rossumff4949e1992-08-05 19:58:53 +0000700 (fp = fdopen(fd, mode)) == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000701 return socket_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000702 return newopenfileobject(fp, "<socket>", mode, fclose);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000703}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000704#endif /* NO_DUP */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000705
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000706/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000707
708static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000709BUILD_FUNC_DEF_2(sock_recv,sockobject *,s, object *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000710{
711 int len, n, flags;
712 object *buf;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000713 flags = 0;
714 if (!getargs(args, "i", &len)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000715 err_clear();
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000716 if (!getargs(args, "(ii)", &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000717 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000718 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000719 buf = newsizedstringobject((char *) 0, len);
720 if (buf == NULL)
721 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000722 BGN_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000723 n = recv(s->sock_fd, getstringvalue(buf), len, flags);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000724 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000725 if (n < 0)
726 return socket_error();
727 if (resizestring(&buf, n) < 0)
728 return NULL;
729 return buf;
730}
731
Guido van Rossum30a685f1991-06-27 15:51:29 +0000732
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000733/* s.recvfrom(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000734
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000735static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000736BUILD_FUNC_DEF_2(sock_recvfrom,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000737{
738 char addrbuf[256];
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000739 object *buf, *addr, *ret;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000740 int addrlen, len, n, flags;
741 flags = 0;
742 if (!getargs(args, "i", &len)) {
743 err_clear();
744 if (!getargs(args, "(ii)", &len, &flags))
745 return NULL;
746 }
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000747 if (!getsockaddrlen(s, &addrlen))
748 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000749 buf = newsizedstringobject((char *) 0, len);
Guido van Rossum18c9a4f1993-05-25 12:16:29 +0000750 if (buf == NULL)
751 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000752 BGN_SAVE
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000753 n = recvfrom(s->sock_fd, getstringvalue(buf), len, flags,
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000754#ifndef NT
Guido van Rossumb376a4a1993-11-23 17:53:17 +0000755 (ANY *)addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000756#else
757 (struct sockaddr *)addrbuf, &addrlen);
758#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +0000759 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000760 if (n < 0)
761 return socket_error();
762 if (resizestring(&buf, n) < 0)
763 return NULL;
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000764 addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
765 ret = mkvalue("OO", buf, addr);
766 XDECREF(addr);
767 XDECREF(buf);
768 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000769}
770
Guido van Rossum30a685f1991-06-27 15:51:29 +0000771
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000772/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000773
774static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000775BUILD_FUNC_DEF_2(sock_send,sockobject *,s, object *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000776{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000777 char *buf;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000778 int len, n, flags;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000779 flags = 0;
Guido van Rossum234f9421993-06-17 12:35:49 +0000780 if (!getargs(args, "s#", &buf, &len)) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000781 err_clear();
Guido van Rossum234f9421993-06-17 12:35:49 +0000782 if (!getargs(args, "(s#i)", &buf, &len, &flags))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783 return NULL;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000784 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000785 BGN_SAVE
786 n = send(s->sock_fd, buf, len, flags);
787 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000788 if (n < 0)
789 return socket_error();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000790 return newintobject((long)n);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000791}
792
793
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000794/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000795
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000797BUILD_FUNC_DEF_2(sock_sendto,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000798{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000799 object *addro;
800 char *buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000801 struct sockaddr *addr;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000802 int addrlen, len, n, flags;
803 flags = 0;
804 if (!getargs(args, "(s#O)", &buf, &len, &addro)) {
805 err_clear();
806 if (!getargs(args, "(s#iO)", &buf, &len, &flags, &addro))
807 return NULL;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000808 }
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000809 if (!getsockaddrarg(s, addro, &addr, &addrlen))
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000810 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000811 BGN_SAVE
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000812 n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000813 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000814 if (n < 0)
815 return socket_error();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000816 return newintobject((long)n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000817}
818
Guido van Rossum30a685f1991-06-27 15:51:29 +0000819
820/* s.shutdown(how) method */
821
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000822static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000823BUILD_FUNC_DEF_2(sock_shutdown,sockobject *,s, object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000824{
825 int how;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000826 int res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000827 if (!getintarg(args, &how))
828 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000829 BGN_SAVE
830 res = shutdown(s->sock_fd, how);
831 END_SAVE
832 if (res < 0)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000833 return socket_error();
834 INCREF(None);
835 return None;
836}
837
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838
839/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000840
841static struct methodlist sock_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000842 {"accept", (method)sock_accept},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000843#if 0
Guido van Rossumb6775db1994-08-01 11:34:53 +0000844 {"allowbroadcast", (method)sock_allowbroadcast},
Guido van Rossumc65a5251994-08-05 13:44:50 +0000845#endif
Guido van Rossume4485b01994-09-07 14:32:49 +0000846#ifndef NT
847 {"setblocking", (method)sock_setblocking},
848#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000849 {"setsockopt", (method)sock_setsockopt},
850 {"getsockopt", (method)sock_getsockopt},
851 {"bind", (method)sock_bind},
852 {"close", (method)sock_close},
853 {"connect", (method)sock_connect},
854 {"fileno", (method)sock_fileno},
855 {"getsockname", (method)sock_getsockname},
856#ifdef HAVE_GETPEERNAME
857 {"getpeername", (method)sock_getpeername},
Guido van Rossum9575a441993-04-07 14:06:14 +0000858#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000859 {"listen", (method)sock_listen},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000860#ifndef NO_DUP
Guido van Rossumb6775db1994-08-01 11:34:53 +0000861 {"makefile", (method)sock_makefile},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000862#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000863 {"recv", (method)sock_recv},
864 {"recvfrom", (method)sock_recvfrom},
865 {"send", (method)sock_send},
866 {"sendto", (method)sock_sendto},
867 {"shutdown", (method)sock_shutdown},
868 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000869};
870
Guido van Rossum30a685f1991-06-27 15:51:29 +0000871
872/* Deallocate a socket object in response to the last DECREF().
873 First close the file description. */
874
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875static void
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000876BUILD_FUNC_DEF_1(sock_dealloc, sockobject *,s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000877{
878 (void) close(s->sock_fd);
879 DEL(s);
880}
881
Guido van Rossum30a685f1991-06-27 15:51:29 +0000882
883/* Return a socket object's named attribute. */
884
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000885static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000886BUILD_FUNC_DEF_2(sock_getattr,sockobject *,s, char *,name)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000887{
888 return findmethod(sock_methods, (object *) s, name);
889}
890
Guido van Rossum30a685f1991-06-27 15:51:29 +0000891
Guido van Rossumb6775db1994-08-01 11:34:53 +0000892/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +0000893
Guido van Rossumb6775db1994-08-01 11:34:53 +0000894static typeobject Socktype = {
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000895 OB_HEAD_INIT(&Typetype)
896 0,
897 "socket",
898 sizeof(sockobject),
899 0,
Guido van Rossumb6775db1994-08-01 11:34:53 +0000900 (destructor)sock_dealloc, /*tp_dealloc*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000901 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000902 (getattrfunc)sock_getattr, /*tp_getattr*/
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000903 0, /*tp_setattr*/
904 0, /*tp_compare*/
905 0, /*tp_repr*/
906 0, /*tp_as_number*/
907 0, /*tp_as_sequence*/
908 0, /*tp_as_mapping*/
909};
910
Guido van Rossum30a685f1991-06-27 15:51:29 +0000911
Guido van Rossum81194471991-07-27 21:42:02 +0000912/* Python interface to gethostname(). */
913
914/*ARGSUSED*/
915static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000916BUILD_FUNC_DEF_2(socket_gethostname,object *,self, object *,args)
Guido van Rossum81194471991-07-27 21:42:02 +0000917{
918 char buf[1024];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000919 int res;
Guido van Rossum81194471991-07-27 21:42:02 +0000920 if (!getnoarg(args))
921 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000922 BGN_SAVE
923 res = gethostname(buf, (int) sizeof buf - 1);
924 END_SAVE
925 if (res < 0)
Guido van Rossum81194471991-07-27 21:42:02 +0000926 return socket_error();
927 buf[sizeof buf - 1] = '\0';
928 return newstringobject(buf);
929}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000930
931
Guido van Rossum30a685f1991-06-27 15:51:29 +0000932/* Python interface to gethostbyname(name). */
933
934/*ARGSUSED*/
935static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000936BUILD_FUNC_DEF_2(socket_gethostbyname,object *,self, object *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000937{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000938 char *name;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000939 struct sockaddr_in addrbuf;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000940 if (!getargs(args, "s", &name))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000941 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000942 if (setipaddr(name, &addrbuf) < 0)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000943 return NULL;
944 return makeipaddr(&addrbuf);
945}
946
947
948/* Python interface to getservbyname(name).
949 This only returns the port number, since the other info is already
950 known or not useful (like the list of aliases). */
951
952/*ARGSUSED*/
953static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000954BUILD_FUNC_DEF_2(socket_getservbyname,object *,self, object *,args)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000955{
Guido van Rossumff4949e1992-08-05 19:58:53 +0000956 char *name, *proto;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000957 struct servent *sp;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000958 if (!getargs(args, "(ss)", &name, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000959 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000960 BGN_SAVE
961 sp = getservbyname(name, proto);
962 END_SAVE
Guido van Rossum30a685f1991-06-27 15:51:29 +0000963 if (sp == NULL) {
964 err_setstr(SocketError, "service/proto not found");
965 return NULL;
966 }
967 return newintobject((long) ntohs(sp->s_port));
968}
969
970
971/* Python interface to socket(family, type, proto).
972 The third (protocol) argument is optional.
973 Return a new socket object. */
974
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000975/*ARGSUSED*/
976static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000977BUILD_FUNC_DEF_2(socket_socket,object *,self,object *,args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000978{
979 sockobject *s;
Guido van Rossum2a7178e1992-12-08 13:38:24 +0000980 int fd, family, type, proto;
981 proto = 0;
982 if (!getargs(args, "(ii)", &family, &type)) {
983 err_clear();
984 if (!getargs(args, "(iii)", &family, &type, &proto))
Guido van Rossum30a685f1991-06-27 15:51:29 +0000985 return NULL;
986 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000987 BGN_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000988 fd = socket(family, type, proto);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000989 END_SAVE
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000990 if (fd < 0)
991 return socket_error();
992 s = newsockobject(fd, family, type, proto);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000993 /* If the object can't be created, don't forget to close the
994 file descriptor again! */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000995 if (s == NULL)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000996 (void) close(fd);
Guido van Rossum81194471991-07-27 21:42:02 +0000997 /* From now on, ignore SIGPIPE and let the error checking
998 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000999#ifdef SIGPIPE
Guido van Rossum81194471991-07-27 21:42:02 +00001000 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001001#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001002 return (object *) s;
1003}
1004
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001005#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001006/* Create a socket object from a numeric file description.
1007 Useful e.g. if stdin is a socket.
1008 Additional arguments as for socket(). */
1009
1010/*ARGSUSED*/
1011static object *
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001012BUILD_FUNC_DEF_2(socket_fromfd,object *,self,object *,args)
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001013{
1014 sockobject *s;
1015 int fd, family, type, proto;
1016 proto = 0;
1017 if (!getargs(args, "(iii)", &fd, &family, &type)) {
1018 err_clear();
1019 if (!getargs(args, "(iiii)", &fd, &family, &type, &proto))
1020 return NULL;
1021 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001022 /* Dup the fd so it and the socket can be closed independently */
1023 fd = dup(fd);
1024 if (fd < 0)
1025 return socket_error();
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001026 s = newsockobject(fd, family, type, proto);
1027 /* From now on, ignore SIGPIPE and let the error checking
1028 do the work. */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001029#ifdef SIGPIPE
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001030 (void) signal(SIGPIPE, SIG_IGN);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001031#endif
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001032 return (object *) s;
1033}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001034#endif /* NO_DUP */
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001035
Guido van Rossum30a685f1991-06-27 15:51:29 +00001036/* List of functions exported by this module. */
1037
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001038static struct methodlist socket_methods[] = {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001039 {"gethostbyname", socket_gethostbyname},
Guido van Rossum81194471991-07-27 21:42:02 +00001040 {"gethostname", socket_gethostname},
Guido van Rossum30a685f1991-06-27 15:51:29 +00001041 {"getservbyname", socket_getservbyname},
1042 {"socket", socket_socket},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001043#ifndef NO_DUP
Guido van Rossum2a7178e1992-12-08 13:38:24 +00001044 {"fromfd", socket_fromfd},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001045#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001046 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001047};
1048
Guido van Rossum30a685f1991-06-27 15:51:29 +00001049
1050/* Convenience routine to export an integer value.
1051 For simplicity, errors (which are unlikely anyway) are ignored. */
1052
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001053static void
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001054BUILD_FUNC_DEF_3(insint,object *,d,char *,name,int,value)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001055{
1056 object *v = newintobject((long) value);
1057 if (v == NULL) {
1058 /* Don't bother reporting this error */
1059 err_clear();
1060 }
1061 else {
1062 dictinsert(d, name, v);
1063 DECREF(v);
1064 }
1065}
1066
Guido van Rossum30a685f1991-06-27 15:51:29 +00001067
1068/* Initialize this module.
1069 This is called when the first 'import socket' is done,
1070 via a table in config.c, if config.c is compiled with USE_SOCKET
1071 defined. */
1072
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001073void
1074initsocket()
1075{
1076 object *m, *d;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001077 m = initmodule("socket", socket_methods);
1078 d = getmoduledict(m);
1079 SocketError = newstringobject("socket.error");
1080 if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
1081 fatal("can't define socket.error");
1082 insint(d, "AF_INET", AF_INET);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001083#ifdef AF_UNIX
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001084 insint(d, "AF_UNIX", AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001085#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001086 insint(d, "SOCK_STREAM", SOCK_STREAM);
1087 insint(d, "SOCK_DGRAM", SOCK_DGRAM);
1088 insint(d, "SOCK_RAW", SOCK_RAW);
1089 insint(d, "SOCK_SEQPACKET", SOCK_SEQPACKET);
1090 insint(d, "SOCK_RDM", SOCK_RDM);
1091}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001092
1093#ifdef NT
1094BOOL WINAPI DllMain (HANDLE hInst,
1095 ULONG ul_reason_for_call,
1096 LPVOID lpReserved)
1097{
1098 switch (ul_reason_for_call)
1099 {
1100 case DLL_PROCESS_ATTACH:
1101 WSADATA WSAData;
1102 if (WSAStartup(MAKEWORD(2,0), &WSAData)) {
1103 OutputDebugString("Python can't initialize Windows Sockets DLL!");
1104 return FALSE;
1105 }
1106 break;
1107 case DLL_PROCESS_DETACH:
1108 WSACleanup();
1109 break;
1110
1111 }
1112 return TRUE;
1113}
1114#endif /* NT */