earlybrowserreborn - Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 roytam 1 /*
2  * Copyright 1990 Pei-Yuan Wei. All rights reserved.
3  *
4  * Permission to use, copy, and/or distribute for any purpose and
5  * without fee is hereby granted, provided that both the above copyright
6  * notice and this permission notice appear in all copies and derived works.
7  * Fees for distribution or use of this software or derived works may only
8  * be charged with express written permission of the copyright holder.
9  * This software is provided ``as is'' without express or implied warranty.
10  */
11 /*
12  * class        : socket
13  * superClass   : client
14  */
15 /*
16  * Contributors:
17  *
18  * Kurt Pires (kjpires@xcf): initial socket code.
19  * Tor Lillqvist (tml@tik.vtt.fi): HP-UX compatibility.
20  */
21 #include "utils.h"
22 #include <ctype.h>
23 #include "error.h"
24 #include "mystrings.h"
25 #include "hash.h"
26 #include "ident.h"
27 #include "scanutils.h"
28 #include "obj.h"
29 #include "packet.h"
30 #include "membership.h"
31 #include "class.h"
32 #include "slotaccess.h"
33 #include "classlist.h"
34 #include "cl_socket.h"
35 #include "misc.h"
36 #include "glib.h"
37 #include "event.h"
38  
39 #include <netdb.h>
40 #include <sys/socket.h>
41 #include <arpa/inet.h>
42 #include <netinet/in.h>
43 #ifdef _AIX
44 #include <sys/select.h>
45 #endif
46  
47 SlotInfo cl_socket_NCSlots[] = {
48         NULL
49 };
50 SlotInfo cl_socket_NPSlots[] = {
51 {
52         STR_host,
53         PTRS | SLOT_RW,
54         (long)""
55 },{
56         STR_port,
57         LONG | SLOT_RW,
58  
59 },{
60         NULL
61 }
62 };
63 SlotInfo cl_socket_CSlots[] = {
64 {
65         STR_class,
66         PTRS | SLOT_RW,
67         (long)"socket"
68 },{
69         STR_classScript,
70         PTRS,
71         (long)"\n\
72                 switch (arg[0]) {\n\
73                 case \"config\":\n\
74                         config(arg[1], arg[2], arg[3], arg[4]);\n\
75                 break;\n\
76                 case \"configSelf\":\n\
77                         /* icky! but necessary to give script a chance to \n\
78                          * intercept and do something...*/\n\
79                         send(self(), \"config\", \n\
80                                 x(), y(), width(), height());\n\
81                 break;\n\
82                 case \"expose\":\n\
83                         expose(arg[1], arg[2], arg[3], arg[4]);\n\
84                 break;\n\
85                 case \"render\":\n\
86                         render();\n\
87                 break;\n\
88                 case \"visible\":\n\
89                         set(\"visible\", arg[1]);\n\
90                 break;\n\
91                 case \"mouseMove\":\n\
92                 case \"enter\":\n\
93                 case \"leave\":\n\
94                 case \"buttonPress\":\n\
95                 case \"buttonRelease\":\n\
96                 case \"keyPress\":\n\
97                 case \"keyRelease\":\n\
98                 case \"shownPositionH\":\n\
99                 case \"shownPositionV\":\n\
100                 case \"shownInfoV\":\n\
101                 case \"shownInfoH\":\n\
102                 break;\n\
103                 case \"focus\":\n\
104                         mousePos = mouse();\n\
105                         winPos = windowPosition();\n\
106                         mx = mousePos[0];\n\
107                         my = mousePos[1];\n\
108                         dx = ((winPos[0] + width() / 2) - mx) / 10.0;\n\
109                         dy = ((winPos[1] + height() / 2) - my) / 10.0;\n\
110                         for (i = 0; i < 10; i = i + 1) {\n\
111                                 mx = mx + dx;\n\
112                                 my = my + dy;\n\
113                                 setMouse(mx, my);\n\
114                         }\n\
115                 break;\n\
116                 case \"key_up\":\n\
117                         send(parent(), \"key_up\");\n\
118                         return;\n\
119                 break;\n\
120                 case \"key_down\":\n\
121                         send(parent(), \"key_down\");\n\
122                         return;\n\
123                 break;\n\
124                 case \"init\":\n\
125                         initialize();\n\
126                 break;\n\
127                 case \"raise\":\n\
128                         raise();\n\
129                 break;\n\
130                 case \"info\":\n\
131                         info();\n\
132                 break;\n\
133                 case \"freeSelf\":\n\
134                         return freeSelf();\n\
135                 break;\n\
136                 default:\n\
137                         print(\"unknown message, clsss = \", get(\"class\"),\n\
138                                 \": self = \", get(\"name\"), \" args: \");\n\
139                         for (i = 0; i < arg[]; i++) print(arg[i], \", \");\n\
140                         print(\"\n\");\n\
141                 break;\n\
142                 }\n\
143         ",
144 },{
145         NULL
146 }
147 };
148 SlotInfo cl_socket_PSlots[] = {
149 {
150         STR__classInfo,
151         CLSI,
152         (long)&class_socket
153 },{
154         NULL
155 }
156 };
157  
158 SlotInfo *slots_socket[] = {
159         (SlotInfo*)cl_socket_NCSlots,
160         (SlotInfo*)cl_socket_NPSlots,
161         (SlotInfo*)cl_socket_CSlots,
162         (SlotInfo*)cl_socket_PSlots
163 };
164  
165 MethodInfo meths_socket[] = {
166         /* local methods */
167 {
168         STR__startClient,
169         meth_socket__startClient
170 },{
171         STR_freeSelf,
172         meth_socket_freeSelf,
173 },{
174         STR_geta,
175         meth_socket_get,
176 },{
177         STR_seta,
178         meth_socket_set
179 },{
180         NULL
181 }
182 };
183  
184 ClassInfo class_socket = {
185         helper_socket_get,
186         helper_socket_set,
187         slots_socket,           /* class slot information       */
188         meths_socket,           /* class methods                */
189         STR_socket,             /* class identifier number      */
190         &class_client,          /* super class info             */
191 };
192  
193 int meth_socket__startClient(self, result, argc, argv)
194         VObj *self;
195         Packet *result;
196         int argc;
197         Packet argv[];
198 {
199         int fd;
200         int socket_open();
201  
202         fd = socket_open("tcp", GET_host(self), GET_port(self));
203  
204         result->type = PKT_INT;
205         result->canFree = 0;
206         result->info.i = fd;
207  
208         return 1;
209 }
210  
211 int helper_socket_get(self, result, argc, argv, labelID)
212         VObj *self;
213         Packet *result;
214         int argc;
215         Packet argv[];
216         int labelID;
217 {
218         switch (labelID) {
219         case STR_pid:
220                 result->type = PKT_INT;
221                 result->canFree = 0;
222                 result->info.i = GET_pid(self);
223                 return 1;
224  
225         case STR_args:
226                 result->type = PKT_STR;
227                 result->canFree = PK_CANFREE_STR;
228                 result->info.s = SaveString(GET_args(self));
229                 return 1;
230  
231         case STR_path:
232                 result->type = PKT_STR;
233                 result->canFree = PK_CANFREE_STR;
234                 result->info.s = SaveString(GET_path(self));
235                 return 1;
236  
237         }
238         return helper_client_get(self, result, argc, argv, labelID);
239 }
240 int meth_socket_get(self, result, argc, argv)
241         VObj *self;
242         Packet *result;
243         int argc;
244         Packet argv[];
245 {
246         return helper_socket_get(self, result, argc, argv,
247                                 getIdent(PkInfo2Str(argv)));
248 }
249  
250 int meth_socket_freeSelf(self, result, argc, argv)
251         VObj *self;
252         Packet *result;
253         int argc;
254         Packet argv[];
255 {
256         int fd = GET_clientFD(self);
257  
258         if (fd != -1) {
259                 SET_clientFD(self, 0);
260                 close(fd);
261                 objFDList[fd] = NULL;
262         }
263         free(GET_host(self));
264         free(GET_port(self));
265         meth_client_freeSelf(self, result, argc, argv);
266  
267         return 1;
268 }
269  
270 int helper_socket_set(self, result, argc, argv, labelID)
271         VObj *self;
272         Packet *result;
273         int argc;
274         Packet argv[];
275         int labelID;
276 {
277         switch (labelID) {
278         case STR_host:
279                 result->info.s = SaveString(PkInfo2Str(&argv[1]));
280                 SET_host(self, result->info.s);
281                 result->type = PKT_STR;
282                 result->canFree = 0;
283                 return 1;
284  
285         case STR_port:
286                 result->info.i = PkInfo2Int(&argv[1]);
287                 SET_port(self, result->info.i);
288                 result->type = PKT_INT;
289                 result->canFree = 0;
290                 return 1;
291         }
292         return helper_client_set(self, result, argc, argv, labelID);
293 }
294 int meth_socket_set(self, result, argc, argv)
295         VObj *self;
296         Packet *result;
297         int argc;
298         Packet argv[];
299 {
300         return helper_socket_set(self, result, argc, argv,
301                                 getIdent(PkInfo2Str(argv)));
302 }
303  
304 /******/
305 /*
306  * KJ's code
307  */
308 int socket_open(proto, host, port)
309         char    *proto;                 /* "tcp" or "udp" */
310         char    *host;                  /* name or dotted quad */
311         int     port;                   /* service name or number */
312 {
313         struct  sockaddr_in     addr;
314         int                     s;
315         int                     stype;
316  
317         if (strcmp("tcp", proto) == 0)
318                 stype = SOCK_STREAM;
319         else if (strcmp("udp", proto) != 0)
320                 stype = SOCK_DGRAM;
321         else
322                 return -1;
323  
324         if ((addr.sin_addr.s_addr = inet_addr(host)) != -1) {
325                 addr.sin_family = AF_INET;
326         } else {
327                 struct  hostent *hp;
328  
329                 if ((hp = gethostbyname(host)) == NULL)
330                         return -2;
331  
332                 bcopy(hp->h_addr, (char *)&addr.sin_addr, hp->h_length);
333                 addr.sin_family = hp->h_addrtype;
334         }
335  
336         if (addr.sin_port = port) {
337                 addr.sin_port = htons(addr.sin_port);
338         } else {
339                 struct  servent         *sp;
340  
341                 if ((sp = getservbyname(port, proto)) == NULL)
342                         return -3;
343  
344                 addr.sin_port = sp->s_port;
345         }
346  
347         if ((s = socket(addr.sin_family, stype, 0)) < 0)
348                 return -4;
349  
350         if (connect(s, (struct sockaddr *)&addr, sizeof addr) < 0) {
351                 close(s);
352                 return -5;
353         }
354  
355         return s;
356 }