Mercurial > freewnn
comparison Xwnmo/xwnmo/do_socket.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:bbc77ca4def5 |
---|---|
1 /* | |
2 * $Id: do_socket.c,v 1.2 2001/06/14 18:16:14 ura Exp $ | |
3 */ | |
4 | |
5 /* | |
6 * FreeWnn is a network-extensible Kana-to-Kanji conversion system. | |
7 * This file is part of FreeWnn. | |
8 * | |
9 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 | |
10 * Copyright 1991, 1992 by Massachusetts Institute of Technology | |
11 * | |
12 * Author: OMRON SOFTWARE Co., Ltd. <freewnn@rd.kyoto.omronsoft.co.jp> | |
13 * | |
14 * This program is free software; you can redistribute it and/or modify | |
15 * it under the terms of the GNU General Public License as published by | |
16 * the Free Software Foundation; either version 2, or (at your option) | |
17 * any later version. | |
18 * | |
19 * This program is distributed in the hope that it will be useful, | |
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
22 * GNU General Public License for more details. | |
23 * | |
24 * You should have received a copy of the GNU General Public License | |
25 * along with GNU Emacs; see the file COPYING. If not, write to the | |
26 * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
27 * | |
28 * Commentary: | |
29 * | |
30 * Change log: | |
31 * | |
32 * Last modified date: 8,Feb.1999 | |
33 * | |
34 * Code: | |
35 * | |
36 */ | |
37 | |
38 #include <stdio.h> | |
39 #include <errno.h> | |
40 #include <X11/Xlib.h> | |
41 #ifdef X11R4 | |
42 #define NEED_EVENTS 1 | |
43 #include <X11/Xlibos.h> | |
44 #else /* X11R4 */ | |
45 #include "Xlibnet.h" | |
46 | |
47 #ifndef X11R5 | |
48 /* followings were included in Xlibnet.h, but none in X11R6 */ | |
49 #include <netinet/in.h> | |
50 #include <sys/ioctl.h> | |
51 #include <netdb.h> | |
52 /* end */ | |
53 #endif /* !X11R5 */ | |
54 | |
55 #endif /* X11R4 */ | |
56 #include <X11/Xos.h> | |
57 #if defined(TCPCONN) || defined(UNIXCONN) | |
58 #include <sys/socket.h> | |
59 #endif /* defined(TCPCONN) || defined(UNIXCONN) */ | |
60 #ifdef TCPCONN | |
61 #define XIM_PORT_IN 0x9495 | |
62 #endif /* TCPCONN */ | |
63 | |
64 #ifdef UNIXCONN | |
65 #include <sys/un.h> | |
66 #ifndef XIM_UNIX_PATH | |
67 #define XIM_UNIX_PATH "/tmp/.X11-unix/XIM" | |
68 #endif /* XIM_UNIX_PATH */ | |
69 #endif /* UNIXCONN */ | |
70 | |
71 #include "sdefine.h" | |
72 #include "commonhd.h" | |
73 #include "xim.h" | |
74 #include "proto.h" | |
75 #include "ext.h" | |
76 | |
77 #if defined(XJPLIB) && defined(XJPLIB_DIRECT) | |
78 #define MAX_ACCEPT 5 | |
79 #else | |
80 #define MAX_ACCEPT 3 | |
81 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ | |
82 | |
83 #define UNIX_ACPT 0 | |
84 #define INET_ACPT 1 | |
85 #define SERVER_ACPT 2 | |
86 | |
87 char my_byteOrder; | |
88 | |
89 XIMCmblk accept_blk[MAX_ACCEPT]; | |
90 XIMCmblk *cblk; | |
91 XIMCmblk *cur_cblk = NULL; | |
92 | |
93 int *all_socks; | |
94 int *ready_socks; | |
95 static int *dummy1_socks, *dummy2_socks; | |
96 static int sel_width; | |
97 | |
98 static int nofile; | |
99 int max_client; | |
100 int cur_sock = -1; | |
101 static int rest_length = 0; | |
102 | |
103 #ifndef SEND_BUF_SZ | |
104 #define SEND_BUF_SZ 8192 | |
105 #endif | |
106 #ifndef RECV_BUF_SZ | |
107 #define RECV_BUF_SZ 8192 | |
108 #endif | |
109 | |
110 static char send_buf[SEND_BUF_SZ]; | |
111 static int sp = 0; | |
112 static char recv_buf[RECV_BUF_SZ]; | |
113 static int rp = 0; | |
114 static int rc = 0; | |
115 | |
116 #define BINTSIZE (sizeof(int)*8) | |
117 #define sock_set(array,pos) (array[pos/BINTSIZE] |= (1<<(pos%BINTSIZE))) | |
118 #define sock_clr(array,pos) (array[pos/BINTSIZE] &= ~(1<<(pos%BINTSIZE))) | |
119 #define sock_tst(array,pos) (array[pos/BINTSIZE] & (1<<(pos%BINTSIZE))) | |
120 | |
121 extern int read (), write (); | |
122 | |
123 #define _Read(fd, data, size) read((fd), (data), (size)) | |
124 #define _Write(fd, data, size) write((fd), (data), (size)) | |
125 | |
126 static void | |
127 _Error () | |
128 { | |
129 #ifndef X11R5 | |
130 XimError (cur_sock); | |
131 #endif | |
132 close_socket (cur_sock); | |
133 } | |
134 | |
135 static int | |
136 _Writen (num) | |
137 register int num; | |
138 { | |
139 register int i, ret; | |
140 | |
141 if (cur_sock < 0) | |
142 return (-1); | |
143 for (i = 0; i < num;) | |
144 { | |
145 ret = _Write (cur_sock, &send_buf[i], num - i); | |
146 if (ret <= 0) | |
147 { | |
148 _Error (); | |
149 return (-1); | |
150 } | |
151 i += ret; | |
152 } | |
153 return (0); | |
154 } | |
155 | |
156 int | |
157 _Send_Flush () | |
158 { | |
159 if (sp == 0) | |
160 { | |
161 return (0); | |
162 } | |
163 if (_Writen (sp) == -1) | |
164 { | |
165 sp = 0; | |
166 return (-1); | |
167 } | |
168 sp = 0; | |
169 return (0); | |
170 } | |
171 | |
172 #define my_bcopy(src, dst, size) {register int i; \ | |
173 register unsigned char *ppp, *qqq;\ | |
174 for(i=size,ppp=(unsigned char*)src,qqq=(unsigned char*)dst;i>0;i--) \ | |
175 *qqq++=*ppp++; \ | |
176 } | |
177 | |
178 int | |
179 _WriteToClient (p, num) | |
180 register char *p; | |
181 register int num; | |
182 { | |
183 if (num <= 0) | |
184 return (0); | |
185 for (;;) | |
186 { | |
187 if ((sp + num) > SEND_BUF_SZ) | |
188 { | |
189 my_bcopy (p, &send_buf[sp], SEND_BUF_SZ - sp); | |
190 if (_Writen (SEND_BUF_SZ) == -1) | |
191 { | |
192 sp = 0; | |
193 return (-1); | |
194 } | |
195 num -= (SEND_BUF_SZ - sp); | |
196 p += (SEND_BUF_SZ - sp); | |
197 sp = 0; | |
198 } | |
199 else | |
200 { | |
201 my_bcopy (p, &send_buf[sp], num); | |
202 sp += num; | |
203 return (0); | |
204 } | |
205 } | |
206 } | |
207 | |
208 int | |
209 _ReadFromClient (p, num) | |
210 register char *p; | |
211 register int num; | |
212 { | |
213 register char *x = p; | |
214 | |
215 if (num <= 0) | |
216 return (0); | |
217 for (;;) | |
218 { | |
219 if (num > rc) | |
220 { | |
221 if (rc > 0) | |
222 { | |
223 my_bcopy (&recv_buf[rp], x, rc); | |
224 x += rc; | |
225 num -= rc; | |
226 rc = 0; | |
227 } | |
228 rc = _Read (cur_sock, recv_buf, RECV_BUF_SZ); | |
229 if (rc <= 0) | |
230 { | |
231 _Error (); | |
232 rp = 0; | |
233 rc = 0; | |
234 return (-1); | |
235 } | |
236 rp = 0; | |
237 } | |
238 else | |
239 { | |
240 my_bcopy (&recv_buf[rp], x, num); | |
241 rc -= num; | |
242 rp += num; | |
243 return (0); | |
244 } | |
245 } | |
246 } | |
247 | |
248 static int | |
249 init_net_area () | |
250 { | |
251 register int sel_w; | |
252 register int sel_bwidth; | |
253 register char *p; | |
254 | |
255 nofile = OPEN_MAX; | |
256 sel_w = (nofile - 1) / BINTSIZE + 1; | |
257 sel_width = sel_w * sizeof (int); | |
258 sel_bwidth = sel_width * 8; | |
259 max_client = OPEN_MAX - MAX_ACCEPT; | |
260 | |
261 p = (char *) Malloc ((4 * sel_width) + (max_client * sizeof (XIMCmblk))); | |
262 if (!p) | |
263 { | |
264 malloc_error ("allocation of dates for socket"); | |
265 return (-1); | |
266 } | |
267 all_socks = (int *) p; | |
268 p += sel_width; | |
269 ready_socks = (int *) p; | |
270 p += sel_width; | |
271 dummy1_socks = (int *) p; | |
272 p += sel_width; | |
273 dummy2_socks = (int *) p; | |
274 p += sel_width; | |
275 bzero (all_socks, sel_width); | |
276 bzero (ready_socks, sel_width); | |
277 | |
278 cblk = (XIMCmblk *) p; | |
279 bzero ((char *) cblk, max_client * sizeof (XIMCmblk)); | |
280 bzero ((char *) accept_blk, MAX_ACCEPT * sizeof (XIMCmblk)); | |
281 #ifdef UNIXCONN | |
282 accept_blk[UNIX_ACPT].sd = -1; | |
283 #endif /* UNIXCONN */ | |
284 #ifdef TCPCONN | |
285 accept_blk[INET_ACPT].sd = -1; | |
286 #endif /* TCPCONN */ | |
287 return (0); | |
288 } | |
289 | |
290 #ifdef UNIXCONN | |
291 static int | |
292 init_net_un () | |
293 { | |
294 int so; | |
295 struct sockaddr_un saddr_un; | |
296 extern int unlink (), socket (), bind (), shutdown (), listen (); | |
297 | |
298 unlink (XIM_UNIX_PATH); | |
299 saddr_un.sun_family = AF_UNIX; | |
300 strcpy (saddr_un.sun_path, XIM_UNIX_PATH); | |
301 | |
302 if ((so = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) | |
303 { | |
304 return (-1); | |
305 } | |
306 if (bind (so, (struct sockaddr *) &saddr_un, strlen (saddr_un.sun_path) + 2) < 0) | |
307 { | |
308 shutdown (so, 2); | |
309 return (-1); | |
310 } | |
311 if (listen (so, 5) < 0) | |
312 { | |
313 shutdown (so, 2); | |
314 return (-1); | |
315 } | |
316 accept_blk[UNIX_ACPT].sd = so; | |
317 sock_set (all_socks, so); | |
318 return (0); | |
319 } | |
320 #endif /* UNIXCONN */ | |
321 | |
322 #ifdef TCPCONN | |
323 static short | |
324 init_net_in () | |
325 { | |
326 int so; | |
327 struct servent *sp; | |
328 struct sockaddr_in saddr_in; | |
329 unsigned short port; | |
330 #ifndef SOLARIS | |
331 int on = 1; | |
332 #else /* SOLARIS */ | |
333 int on = 0; | |
334 #endif /* SOLARIS */ | |
335 int i, ok = 0; | |
336 extern int setsockopt (); | |
337 | |
338 if ((sp = getservbyname ("xim", "tcp")) == NULL) | |
339 { | |
340 port = XIM_PORT_IN; | |
341 } | |
342 else | |
343 { | |
344 port = ntohs (sp->s_port); | |
345 } | |
346 saddr_in.sin_family = AF_INET; | |
347 saddr_in.sin_port = htons (port); | |
348 saddr_in.sin_addr.s_addr = htonl (INADDR_ANY); | |
349 | |
350 for (i = 0; i < MAX_PORT_NUMBER; i++) | |
351 { | |
352 if ((so = socket (AF_INET, SOCK_STREAM, 0)) < 0) | |
353 { | |
354 return ((short) -1); | |
355 } | |
356 setsockopt (so, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (int)); | |
357 if (bind (so, (struct sockaddr *) &saddr_in, sizeof (struct sockaddr_in)) == 0) | |
358 { | |
359 ok = 1; | |
360 break; | |
361 } | |
362 shutdown (so, 2); | |
363 saddr_in.sin_port = htons (++port); | |
364 } | |
365 if (ok == 0) | |
366 { | |
367 return ((short) -1); | |
368 } | |
369 if (listen (so, 5) < 0) | |
370 { | |
371 shutdown (so, 2); | |
372 return ((short) -1); | |
373 } | |
374 accept_blk[INET_ACPT].sd = so; | |
375 sock_set (all_socks, so); | |
376 return ((short) port); | |
377 } | |
378 #endif /* TCPCONN */ | |
379 | |
380 short | |
381 init_net (fd, displayname) | |
382 int fd; | |
383 char *displayname; | |
384 { | |
385 short port = -1; | |
386 int indian = 1; | |
387 | |
388 if (*(char *) &indian) | |
389 { | |
390 my_byteOrder = 'l'; | |
391 } | |
392 else | |
393 { | |
394 my_byteOrder = 'B'; | |
395 } | |
396 if (init_net_area () < 0) | |
397 return (port); | |
398 #ifdef UNIXCONN | |
399 if (!strncmp (displayname, "unix:", 5) || !strncmp (displayname, ":", 1)) | |
400 { | |
401 if (init_net_un () == (short) -1) | |
402 { | |
403 print_out ("Could not open UNIX domain socket."); | |
404 } | |
405 } | |
406 #endif /* UNIXCONN */ | |
407 #ifdef TCPCONN | |
408 if ((port = init_net_in ()) == (short) -1) | |
409 { | |
410 print_out ("Could not open INET domain socket."); | |
411 return (port); | |
412 } | |
413 accept_blk[SERVER_ACPT].sd = fd; | |
414 sock_set (all_socks, fd); | |
415 #endif /* TCPCONN */ | |
416 #if defined(XJPLIB) && defined(XJPLIB_DIRECT) | |
417 XJp_init_net (); | |
418 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ | |
419 return (port); | |
420 } | |
421 | |
422 void | |
423 close_net () | |
424 { | |
425 int i; | |
426 int trueFlag = 1; | |
427 #ifdef UNIXCONN | |
428 struct sockaddr_un addr_un; | |
429 #endif /* UNIXCONN */ | |
430 #ifdef TCPCONN | |
431 struct sockaddr_in addr_in; | |
432 #endif /* TCPCONN */ | |
433 #if defined(UNIXCONN) || defined(TCPCONN) | |
434 int addrlen; | |
435 extern int accept (), close (); | |
436 #endif | |
437 | |
438 #ifdef UNIXCONN | |
439 if (accept_blk[UNIX_ACPT].sd != -1) | |
440 { | |
441 #ifndef SOLARIS | |
442 #if defined(FIONBIO) | |
443 ioctl (accept_blk[UNIX_ACPT].sd, FIONBIO, &trueFlag); | |
444 #endif | |
445 #else /* !SOLARIS */ | |
446 fcntl (accept_blk[UNIX_ACPT].sd, F_SETFL, F_UNLCK); | |
447 #endif /* !SOLARIS */ | |
448 for (;;) | |
449 { | |
450 addrlen = sizeof (addr_un); | |
451 if (accept (accept_blk[UNIX_ACPT].sd, (struct sockaddr *) &addr_un, &addrlen) < 0) | |
452 break; | |
453 } | |
454 shutdown (accept_blk[UNIX_ACPT].sd, 2); | |
455 close (accept_blk[UNIX_ACPT].sd); | |
456 } | |
457 #endif /* UNIXCONN */ | |
458 | |
459 #ifdef TCPCONN | |
460 if (accept_blk[INET_ACPT].sd != -1) | |
461 { | |
462 #ifndef SOLARIS | |
463 #if defined(FIONBIO) | |
464 ioctl (accept_blk[INET_ACPT].sd, FIONBIO, &trueFlag); | |
465 #endif | |
466 #else /* !SOLARIS */ | |
467 fcntl (accept_blk[INET_ACPT].sd, F_SETFL, F_UNLCK); | |
468 #endif /* !SOLARIS */ | |
469 for (;;) | |
470 { | |
471 addrlen = sizeof (addr_in); | |
472 if (accept (accept_blk[INET_ACPT].sd, (struct sockaddr *) &addr_in, &addrlen) < 0) | |
473 break; | |
474 } | |
475 shutdown (accept_blk[INET_ACPT].sd, 2); | |
476 close (accept_blk[INET_ACPT].sd); | |
477 } | |
478 #endif /* TCPCONN */ | |
479 #if defined(XJPLIB) && defined(XJPLIB_DIRECT) | |
480 XJp_close_net (); | |
481 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ | |
482 | |
483 for (i = 0; i < max_client; i++) | |
484 { | |
485 if (cblk[i].use) | |
486 { | |
487 shutdown (cblk[i].sd, 2); | |
488 close (cblk[i].sd); | |
489 } | |
490 } | |
491 } | |
492 | |
493 #if defined(UNIXCONN) || defined(TCPCONN) | |
494 static int | |
495 get_screen_number (p) | |
496 char *p; | |
497 { | |
498 register char *s; | |
499 | |
500 if (!(s = index (p, ':'))) | |
501 return (-1); | |
502 if (!(s = index (s, '.'))) | |
503 return (-1); | |
504 if (!*(++s)) | |
505 return (-1); | |
506 return (atoi (s)); | |
507 } | |
508 | |
509 #if defined(X11R5) || defined(BC_X11R5) | |
510 static void | |
511 new_cl_sock (b) | |
512 XIMCmblk *b; | |
513 { | |
514 char displaybuf[256]; | |
515 ximConnClient client; | |
516 ximNormalReply reply; | |
517 int len; | |
518 | |
519 if (_ReadFromClient (&client, sz_ximConnClient) == -1) | |
520 return; | |
521 if (my_byteOrder != client.byteOrder) | |
522 { | |
523 b->byteOrder = True; | |
524 } | |
525 else | |
526 { | |
527 b->byteOrder = False; | |
528 } | |
529 if (need_byteswap () == True) | |
530 { | |
531 client.length = byteswap_s (client.length); | |
532 } | |
533 if (_ReadFromClient (displaybuf, client.length) == -1) | |
534 return; | |
535 displaybuf[client.length] = '\0'; | |
536 if ((len = strlen (displaybuf)) > 0) | |
537 { | |
538 b->screen = get_screen_number (displaybuf); | |
539 } | |
540 else | |
541 { | |
542 b->screen = -1; | |
543 } | |
544 reply.state = 0; | |
545 if (need_byteswap () == True) | |
546 { | |
547 byteswap_NormalReply (&reply); | |
548 } | |
549 if (_WriteToClient (&reply, sz_ximNormalReply) == -1) | |
550 return; | |
551 if (_Send_Flush () == -1) | |
552 return; | |
553 } | |
554 #endif /* defined(X11R5) || defined(BC_X11R5) */ | |
555 | |
556 #ifndef X11R5 | |
557 static void | |
558 xim_new_cl_sock (b) | |
559 XIMCmblk *b; | |
560 { | |
561 #ifdef BC_X11R5 | |
562 extern int ximr5_client; | |
563 b->ximr5 = ximr5_client; | |
564 if (b->ximr5) | |
565 { | |
566 new_cl_sock (b); | |
567 return; | |
568 } | |
569 ximr5_client = 1; | |
570 #endif /* BC_X11R5 */ | |
571 /* nothing to do, all are done in XimPreConnect() */ | |
572 } | |
573 #endif /* !X11R5 */ | |
574 | |
575 #endif /* defined(UNIXCONN) || defined(TCPCONN) */ | |
576 | |
577 static int | |
578 new_client_acpt (fd) | |
579 int fd; | |
580 { | |
581 #ifdef UNIXCONN | |
582 struct sockaddr_un addr_un; | |
583 #endif /* UNIXCONN */ | |
584 #ifdef TCPCONN | |
585 struct sockaddr_in addr_in; | |
586 #endif /* TCPCONN */ | |
587 #if defined(UNIXCONN) || defined(TCPCONN) | |
588 register int i; | |
589 int addrlen; | |
590 #endif | |
591 | |
592 #ifdef UNIXCONN | |
593 if (accept_blk[UNIX_ACPT].sd != -1) | |
594 { | |
595 if (fd == accept_blk[UNIX_ACPT].sd) | |
596 { | |
597 for (i = 0; i < max_client; i++) | |
598 { | |
599 if (cblk[i].use == 0) | |
600 { | |
601 addrlen = sizeof (addr_un); | |
602 if ((cblk[i].sd = accept (fd, (struct sockaddr *) &addr_un, &addrlen)) < 0) | |
603 { | |
604 return (-1); | |
605 } | |
606 cur_cblk = &cblk[i]; | |
607 cur_cblk->use = 1; | |
608 #if defined(XJPLIB) && defined(XJPLIB_DIRECT) | |
609 cur_cblk->xjp = 0; | |
610 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ | |
611 cur_sock = cur_cblk->sd; | |
612 sock_set (all_socks, cur_sock); | |
613 #ifdef X11R5 | |
614 new_cl_sock (cur_cblk); | |
615 #else | |
616 xim_new_cl_sock (cur_cblk); | |
617 #endif /* X11R5 */ | |
618 return (0); | |
619 } | |
620 } | |
621 } | |
622 } | |
623 #endif /* UNIXCONN */ | |
624 #ifdef TCPCONN | |
625 if (fd == accept_blk[INET_ACPT].sd) | |
626 { | |
627 for (i = 0; i < max_client; i++) | |
628 { | |
629 if (cblk[i].use == 0) | |
630 { | |
631 addrlen = sizeof (addr_in); | |
632 if ((cblk[i].sd = accept (fd, (struct sockaddr *) &addr_in, &addrlen)) < 0) | |
633 { | |
634 return (-1); | |
635 } | |
636 cur_cblk = &cblk[i]; | |
637 cur_cblk->use = 1; | |
638 #if defined(XJPLIB) && defined(XJPLIB_DIRECT) | |
639 cur_cblk->xjp = 0; | |
640 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ | |
641 cur_sock = cur_cblk->sd; | |
642 sock_set (all_socks, cur_sock); | |
643 #ifdef X11R5 | |
644 new_cl_sock (cur_cblk); | |
645 #else | |
646 xim_new_cl_sock (cur_cblk); | |
647 #endif /* X11R5 */ | |
648 break; | |
649 } | |
650 } | |
651 } | |
652 #endif /* TCPCONN */ | |
653 return (0); | |
654 } | |
655 | |
656 int | |
657 wait_for_socket () | |
658 { | |
659 register int i; | |
660 int n, ret; | |
661 extern int errno; | |
662 extern int select (); | |
663 | |
664 /* | |
665 * If recv_buf has some data, return with as cur_sock get data | |
666 */ | |
667 if (cur_sock != -1 && rc > 0) | |
668 { | |
669 #if defined(XJPLIB) && defined(XJPLIB_DIRECT) | |
670 if (cur_cblk && cur_cblk->xjp) | |
671 return (XJP_DIRECT_TYPE); | |
672 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ | |
673 #ifdef X11R5 | |
674 return (REQUEST_TYPE); | |
675 #else | |
676 #ifdef BC_X11R5 | |
677 if (cur_cblk && cur_cblk->ximr5) | |
678 return REQUEST_TYPE; | |
679 else | |
680 #endif /* BC_X11R5 */ | |
681 return REQUEST_TYPE_XIM; | |
682 #endif /* X11R5 */ | |
683 } | |
684 if (!*ready_socks) | |
685 { | |
686 my_bcopy (all_socks, ready_socks, sel_width); | |
687 bzero (dummy1_socks, sel_width); | |
688 bzero (dummy2_socks, sel_width); | |
689 | |
690 if ((n = select (nofile, ready_socks, dummy1_socks, dummy2_socks, (struct timeval *) NULL)) == -1) | |
691 { | |
692 if (errno != EINTR) | |
693 do_end (); | |
694 else | |
695 { | |
696 bzero (ready_socks, sel_width); | |
697 return (0); | |
698 } | |
699 } | |
700 } | |
701 #ifdef UNIXCONN | |
702 if (accept_blk[UNIX_ACPT].sd != -1) | |
703 { | |
704 if (sock_tst (ready_socks, accept_blk[UNIX_ACPT].sd)) | |
705 { | |
706 sock_clr (ready_socks, accept_blk[UNIX_ACPT].sd); | |
707 cur_cblk = NULL; | |
708 cur_sock = -1; | |
709 new_client_acpt (accept_blk[UNIX_ACPT].sd); | |
710 return (0); | |
711 } | |
712 } | |
713 #endif /* UNIXCONN */ | |
714 #ifdef TCPCONN | |
715 if (accept_blk[INET_ACPT].sd != -1) | |
716 { | |
717 if (sock_tst (ready_socks, accept_blk[INET_ACPT].sd)) | |
718 { | |
719 sock_clr (ready_socks, accept_blk[INET_ACPT].sd); | |
720 cur_cblk = NULL; | |
721 cur_sock = -1; | |
722 new_client_acpt (accept_blk[INET_ACPT].sd); | |
723 return (0); | |
724 } | |
725 } | |
726 #endif /* TCPCONN */ | |
727 if (sock_tst (ready_socks, accept_blk[SERVER_ACPT].sd)) | |
728 { | |
729 sock_clr (ready_socks, accept_blk[SERVER_ACPT].sd); | |
730 cur_cblk = NULL; | |
731 cur_sock = -1; | |
732 return (XEVENT_TYPE); | |
733 } | |
734 else | |
735 { | |
736 if (cur_sock != -1 && sock_tst (ready_socks, cur_sock)) | |
737 { | |
738 sock_clr (ready_socks, cur_sock); | |
739 #if defined(XJPLIB) && defined(XJPLIB_DIRECT) | |
740 if (cur_cblk && cur_cblk->xjp) | |
741 return (XJP_DIRECT_TYPE); | |
742 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ | |
743 #ifdef X11R5 | |
744 return (REQUEST_TYPE); | |
745 #else | |
746 #ifdef BC_X11R5 | |
747 if (cur_cblk && cur_cblk->ximr5) | |
748 return REQUEST_TYPE; | |
749 else | |
750 #endif /* BC_X11R5 */ | |
751 return REQUEST_TYPE_XIM; | |
752 #endif /* X11R5 */ | |
753 } | |
754 cur_cblk = NULL; | |
755 cur_sock = -1; | |
756 for (i = 0; i < max_client; i++) | |
757 { | |
758 if (cblk[i].use && sock_tst (ready_socks, cblk[i].sd)) | |
759 { | |
760 sock_clr (ready_socks, cblk[i].sd); | |
761 cur_cblk = &cblk[i]; | |
762 cur_sock = cur_cblk->sd; | |
763 #if defined(XJPLIB) && defined(XJPLIB_DIRECT) | |
764 if (cur_cblk && cur_cblk->xjp) | |
765 return (XJP_DIRECT_TYPE); | |
766 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ | |
767 #ifdef X11R5 | |
768 return (REQUEST_TYPE); | |
769 #else | |
770 #ifdef BC_X11R5 | |
771 if (cur_cblk && cur_cblk->ximr5) | |
772 return REQUEST_TYPE; | |
773 else | |
774 #endif /* BC_X11R5 */ | |
775 return REQUEST_TYPE_XIM; | |
776 #endif /* X11R5 */ | |
777 } | |
778 } | |
779 #if defined(XJPLIB) && defined(XJPLIB_DIRECT) | |
780 if (ret = XJp_wait_for_socket ()) | |
781 return (0); | |
782 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ | |
783 return (0); | |
784 } | |
785 } | |
786 | |
787 void | |
788 close_socket (fd) | |
789 int fd; | |
790 { | |
791 int i; | |
792 for (i = 0; i < max_client; i++) | |
793 { | |
794 if (fd == cblk[i].sd && cblk[i].use == 1) | |
795 { | |
796 cblk[i].use = 0; | |
797 shutdown (cblk[i].sd, 2); | |
798 sock_clr (all_socks, cblk[i].sd); | |
799 close (cblk[i].sd); | |
800 #if defined(XJPLIB) && defined(XJPLIB_DIRECT) | |
801 if (cblk[i].xjp) | |
802 XJp_destroy_for_sock (cblk[i].sd); | |
803 else | |
804 #endif /* defined(XJPLIB) && defined(XJPLIB_DIRECT) */ | |
805 destroy_for_sock (cblk[i].sd); | |
806 if (cur_sock == fd) | |
807 cur_sock = -1; | |
808 return; | |
809 } | |
810 } | |
811 } | |
812 | |
813 int | |
814 get_cur_sock () | |
815 { | |
816 return (cur_sock); | |
817 } | |
818 | |
819 int | |
820 get_rest_len () | |
821 { | |
822 return (rest_length); | |
823 } | |
824 | |
825 int | |
826 read_requestheader () | |
827 { | |
828 ximRequestHeader request_header; | |
829 | |
830 if (_ReadFromClient (&request_header, sz_ximRequestHeader) == -1) | |
831 { | |
832 return (-1); | |
833 } | |
834 else | |
835 { | |
836 if (need_byteswap () == True) | |
837 request_header.length = byteswap_s (request_header.length); | |
838 rest_length = request_header.length - sz_ximRequestHeader; | |
839 return (request_header.reqType); | |
840 } | |
841 } | |
842 | |
843 int | |
844 read_strings (p, p_len, r_len) | |
845 char **p; | |
846 int *p_len, r_len; | |
847 { | |
848 register int len; | |
849 register char *ptr; | |
850 char tmp; | |
851 | |
852 if (r_len > 0) | |
853 { | |
854 if (*p_len <= r_len) | |
855 { | |
856 len = r_len + 1; | |
857 if (!(ptr = Malloc (len))) | |
858 { | |
859 malloc_error ("allocation of client data"); | |
860 for (; r_len > 0; r_len--) | |
861 { /* read data in dummy */ | |
862 if (_ReadFromClient (&tmp, 1) == 1) | |
863 return (-1); | |
864 } | |
865 return (-2); | |
866 } | |
867 if (*p) | |
868 Free (*p); | |
869 *p = ptr; | |
870 *p_len = len; | |
871 } | |
872 if (_ReadFromClient (*p, r_len) == 1) | |
873 return (-1); | |
874 p[0][r_len] = '\0'; | |
875 } | |
876 else | |
877 { | |
878 if (*p_len > 0) | |
879 **p = '\0'; | |
880 } | |
881 return (0); | |
882 } | |
883 | |
884 /* *INDENT-OFF* */ | |
885 Bool | |
886 need_byteswap () | |
887 /* *INDENT-ON* */ | |
888 | |
889 { | |
890 if (!cur_cblk) | |
891 return (False); | |
892 return (cur_cblk->byteOrder); | |
893 } | |
894 | |
895 int | |
896 get_client_screen () | |
897 { | |
898 if (!cur_cblk) | |
899 return (-1); | |
900 return (cur_cblk->screen); | |
901 } |