1 /*
2 * $Id: js.c,v 1.16 2005/04/10 15:26:37 aonoto 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 Kyoto University Research Institute for Mathematical Sciences
10 * 1987, 1988, 1989, 1990, 1991, 1992
11 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999
12 * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992
13 * Copyright FreeWnn Project 1999, 2000, 2001, 2002, 2003
14 *
15 * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp>
16 *
17 * This library is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU Lesser General Public
19 * License as published by the Free Software Foundation; either
20 * version 2 of the License, or (at your option) any later version.
21 *
22 * This library is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 * Lesser General Public License for more details.
26 *
27 * You should have received a copy of the GNU Lesser General Public
28 * License along with this library; if not, write to the
29 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
30 * Boston, MA 02111-1307, USA.
31 */
32
33 /*
34 Nihongo Henkan Library
35 */
36 /*
37 entry functions
38
39 js_open_lang js_close
40 js_change_current_jserver
41 js_connect_lang js_disconnect
42 js_isconnect
43
44 js_param_get js_param_set
45
46 js_access js_mkdir
47
48 js_get_lang js_set_lang
49
50
51 extern Variables
52 int wnn_errorno;
53 */
54
55 #if defined(HAVE_CONFIG_H)
56 #include <config.h>
57 #endif
58
59 #include <stdio.h>
60 #include <ctype.h>
61 #include <errno.h>
62 #include <signal.h>
63 #if STDC_HEADERS
64 # include <stdlib.h>
65 # include <string.h>
66 #else
67 # if HAVE_MALLOC_H
68 # include <malloc.h>
69 # endif
70 # if HAVE_STRINGS_H
71 # include <strings.h>
72 # endif
73 #endif /* STDC_HEADERS */
74 #if HAVE_FCNTL_H
75 # include <fcntl.h>
76 #endif
77 #include <pwd.h>
78 #if HAVE_UNISTD_H
79 # include <unistd.h>
80 #endif
81 #include <sys/stat.h>
82 #include <sys/types.h>
83
84 #include "jd_sock.h"
85 #include "commonhd.h"
86 #include "demcom.h"
87 #include "wnn_config.h"
88
89 #include "wnnerror.h"
90 #include "jslib.h"
91 #include "jh.h"
92
93 #include "msg.h"
94
95 #define JS /* For include ../etc/bdic.c */
96 #include "../etc/bdic.c"
97 #include "../etc/pwd.c"
98
99 /* defined in wnn_os.h & should be modified in the future */
100 /* #define bzero(adr,n) memset((adr),0,(n)) */
101
102 int wnn_errorno = 0;
103 struct msg_cat *wnn_msg_cat = NULL;
104
105 /* j Lib. */
106
107 static int current_sd; /** �����å�fd **/
108 static WNN_JSERVER_ID *current_js = NULL;
109
110
111 /* Packet Buffers */
112 static unsigned char snd_buf[S_BUF_SIZ]; /** ���� **/
113 static unsigned char *sbp = snd_buf;
114
115 #if defined(EAGAIN)
116 # if defined(EWOULDBLOCK)
117 # define ERRNO_CHECK(no) ((no) == EAGAIN || (no) == EWOULDBLOCK)
118 # else /* defined(EWOULDBLOCK) */
119 # define ERRNO_CHECK(no) ((no) == EAGAIN)
120 # endif /* defined(EWOULDBLOCK) */
121 #else /* defined(EAGAIN) */
122 # if defined(EWOULDBLOCK)
123 # define ERRNO_CHECK(no) ((no) == EWOULDBLOCK)
124 # else /* defined(EWOULDBLOCK) */
125 # define ERRNO_CHECK(no) (0)
126 # endif /* defined(EWOULDBLOCK) */
127 #endif /* defined(EAGAIN) */
128
129 static void connect_timeout ();
130 static int _get_server_name ();
131 static int writen ();
132 static int rcv_flush();
133 static char *get_unixdomain_of_serv_defs (), *get_service_of_serv_defs ();
134 static int get_port_num_of_serv_defs ();
135 void xerror ();
136
137 /********* V4 *****************/
138 /***
139 jserver_dead Macro
140 ***/
141
142 static jmp_buf current_jserver_dead;
143
144 #define handler_of_jserver_dead(err_val) \
145 { \
146 if (current_js) { \
147 if(current_js->js_dead){wnn_errorno=WNN_JSERVER_DEAD;return err_val;}\
148 if(setjmp(current_jserver_dead)){ \
149 wnn_errorno=WNN_JSERVER_DEAD; \
150 return err_val; \
151 } \
152 wnn_errorno = 0; /* here initialize wnn_errorno; */ \
153 } \
154 }
155
156 static void
set_current_js(server)157 set_current_js (server)
158 register WNN_JSERVER_ID *server;
159 {
160 current_js = server;
161 current_sd = current_js->sd;
162 }
163
164 /** �ǡ���������Τ���θ���� **/
165 static void
daemon_dead()166 daemon_dead ()
167 {
168 current_js->js_dead = -1;
169 wnn_errorno = WNN_JSERVER_DEAD;
170 shutdown (current_sd, 2);
171 #ifdef HAVE_CLOSESOCKET
172 closesocket (current_sd);
173 #else
174 close (current_sd);
175 #endif
176 #if DEBUG
177 fprintf (stderr, "jslib:JSERVER %s is Dead\n", current_js->js_name);
178 #endif
179 if (current_js->js_dead_env_flg)
180 {
181 longjmp (current_js->js_dead_env, 666);
182 }
183 longjmp (current_jserver_dead, 666);
184 /* never reach */
185 }
186
187
188 /**
189 �����åȤ��ץ�current_sd�˥����å�fd���֤�
190 (cd�Ȥ����Τϥ��ߥ�˥��������ǥХ�����̾��)
191 **/
192 static int
cd_open_un(const char * lang)193 cd_open_un(const char *lang)
194 {
195 #if !defined(AF_UNIX)
196 return -1;
197 #else
198 int sd;
199 struct sockaddr_un saddr;
200 char *sock_name = NULL;
201 saddr.sun_family = AF_UNIX;
202
203 /* find socket name from table by lang */
204 if (lang && *lang) {
205 if ((sock_name = get_unixdomain_of_serv_defs(lang)) == NULL)
206 sock_name = sockname;
207 } else
208 sock_name = sockname; /* Jserver */
209 strcpy (saddr.sun_path, sock_name);
210
211 if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) == ERROR) {
212 #if DEBUG
213 xerror ("jslib:Can't create unix domain socket.\n");
214 #endif /* DEBUG */
215 return -1;
216 }
217
218 #if !defined(SUN_LEN)
219 # define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
220 #endif /* !defined(SUN_LEN) */
221 if (connect(sd, (struct sockaddr *)&saddr, SUN_LEN(&saddr)) == ERROR) {
222 #if DEBUG
223 xerror ("jslib:Can't connect unix domain socket.\n");
224 #endif /* DEBUG */
225 close (sd);
226 return -1;
227 }
228
229 return sd;
230 #endif
231 }
232
233 static int
cd_open_in(const char * server,const char * lang,const int timeout)234 cd_open_in(const char *server,
235 const char *lang,
236 const int timeout)
237 {
238 int sd;
239
240 struct addrinfo hints, *res, *res0;
241 struct sockaddr sa;
242 char sbuf[NI_MAXSERV];
243
244 int error;
245
246 struct servent *sp = NULL;
247 int serverNO, port_num;
248 int ret;
249 char pserver[NI_MAXHOST];
250 char sserver[NI_MAXHOST];
251 char *serv_name = NULL;
252
253 #if DEBUG
254 fprintf(stderr, "cd_open_in: Enter: server=%s, lang=%s\n",
255 server, lang);
256 #endif
257 serverNO = _get_server_name(server, pserver);
258 #if DEBUG
259 fprintf(stderr, "cd_open_in: serverNO=%d\n", serverNO);
260 #endif
261 /* find service name from table by lang */
262 if (lang && *lang) {
263 if ((serv_name = get_service_of_serv_defs (lang)) == NULL) {
264 strncpy (sserver, SERVERNAME, sizeof(sserver) - 1);
265 sserver[sizeof(sserver) - 1] = '\0';
266 } else {
267 strncpy (sserver, serv_name, sizeof(sserver) - 1);
268 sserver[sizeof(sserver) - 1] = '\0';
269 }
270 } else {
271 strncpy (sserver, SERVERNAME, sizeof(sserver) - 1);
272 sserver[sizeof(sserver) - 1] = '\0';
273 }
274
275 memset(&sa, 0, sizeof(struct sockaddr));
276 error = getnameinfo(&sa, sa.sa_len,
277 NULL, 0, sbuf, sizeof(sbuf), NI_NUMERICSERV);
278 if (!error) {
279 serverNO += atoi(sbuf);
280 } else {
281 if ((port_num = get_port_num_of_serv_defs (lang)) == -1)
282 serverNO += WNN_PORT_IN;
283 else
284 serverNO += port_num;
285 }
286 #if DEBUG
287 fprintf(stderr, "cd_open_in: fixed serverNO=%d\n", serverNO);
288 #endif
289 memset(&hints, 0, sizeof(hints));
290 hints.ai_family = PF_UNSPEC;
291 hints.ai_socktype = SOCK_STREAM;
292 sprintf(sbuf, "%d", serverNO);
293
294 error = getaddrinfo(pserver, sbuf, &hints, &res0);
295 if (error) {
296 xerror(gai_strerror(error));
297 return -1;
298 }
299
300 for (res = res0; res ; res = res->ai_next) {
301 switch (res->ai_family) {
302 case AF_INET:
303 #ifdef INET6
304 case AF_INET6:
305 #endif
306 sd = socket(res->ai_family,
307 res->ai_socktype,
308 res->ai_protocol);
309
310 if (sd == ERROR) {
311 switch (res->ai_family) {
312 case AF_INET:
313 xerror ("jslib:Can't create inet socket.\n");
314 #ifdef INET6
315 case AF_INET6:
316 xerror ("jslib:Can't create inet6 socket.\n");
317 #endif
318 default:
319 xerror("jslib:Cannot create socket. Unknown socket type.\n");
320 }
321
322 break;
323 }
324 if (timeout) {
325 signal(SIGALRM, connect_timeout);
326 alarm(timeout);
327 }
328 ret = connect(sd,
329 res->ai_addr,
330 res->ai_addrlen);
331 if (timeout) {
332 alarm(0);
333 signal(SIGALRM, SIG_IGN);
334 }
335 if (ret == ERROR) {
336 switch (res->ai_family) {
337 case AF_INET:
338 fprintf(stderr, "jslib:Can't connect inet socket. (sd=%d)\n", sd);
339 break;
340 #ifdef INET6
341 case AF_INET6:
342 fprintf(stderr, "jslib:Can't connect inet6 socket. (sd=%d)\n", sd);
343 break;
344 #endif
345 default:
346 xerror("jslib:Cannot connect. Unknown socket type.\n");
347 break;
348 }
349 #ifdef HAVE_CLOSESOCKET
350 closesocket(sd);
351 #else
352 close(sd);
353 #endif
354 sd = ERROR;
355 }
356 #if DEBUG
357 fprintf(stderr, "connect: sd=%d\n", sd);
358 #endif
359 freeaddrinfo(res0);
360 return sd;
361 }
362 }
363 freeaddrinfo(res0);
364 return sd;
365 }
366
367 static void
connect_timeout()368 connect_timeout()
369 {
370 }
371
372 /* get server name and return serverNo */
373 static int
_get_server_name(char * server,char * pserver)374 _get_server_name(char *server,
375 char *pserver)
376 {
377 char *p;
378 #ifdef INET6
379 int len;
380
381 if (server[0] == '[') {
382 p = strchr(server++, ']');
383 if (p) {
384 len = p-server < NI_MAXHOST - 1 ? p-server : NI_MAXHOST - 1;
385 strncpy(pserver, server, len);
386 pserver[len] = '\0';
387 } else
388 pserver[0] = '\0';
389 } else {
390 #endif
391 /* Workaround for pserver buffer overrun : Nov 11,1999 by T.Aono */
392 /* assumes pserver[NI_MAXHOST]. variable length string is not supported. */
393 strncpy(pserver, server, NI_MAXHOST - 1);
394 pserver[NI_MAXHOST - 1] = '\0';
395 p = pserver;
396 #ifdef INET6
397 }
398 #endif
399
400 for (; *p && *p != ':'; p++);
401 if (!*p) /* does not have a colon */
402 return (0);
403 *p = 0;
404 return (atoi (++p));
405 }
406
407 /* Packet SND/RCV subroutines */
408 static void put4com ();
409
410 /* send packet header */
411 static void
snd_head(int cmd)412 snd_head(int cmd)
413 {
414 sbp = snd_buf;
415 put4com(cmd);
416 rcv_flush();
417 }
418
419 /* send environment header */
420 static int
snd_env_head(struct wnn_env * env,int cmd)421 snd_env_head (struct wnn_env *env,
422 int cmd)
423 {
424 snd_head(cmd);
425 put4com(env->env_id);
426 return 0;
427 }
428
429 /* send server header */
430 static int
snd_server_head(WNN_JSERVER_ID * server,int cmd)431 snd_server_head(WNN_JSERVER_ID *server,
432 int cmd)
433 {
434 snd_head(cmd);
435 return 0;
436 }
437
438 /* flush send buffer */
439 static int
snd_flush()440 snd_flush()
441 {
442 /* empty buffer; no need to flush */
443 if (sbp == snd_buf)
444 return 0;
445
446 writen(sbp);
447 return 0;
448 }
449
450 /* send data */
451 static int
writen(unsigned char * sp)452 writen(unsigned char *sp)
453 {
454 unsigned char *bp = snd_buf;
455 int n;
456 size_t total = sp - bp;
457
458 while (bp < sp && bp <= snd_buf + sizeof(snd_buf)) {
459 #if DEBUG_IO
460 fprintf(stderr,
461 "writen: loop: sp - bp = %d\n", sp - bp);
462 #endif
463 #ifdef HAVE_SEND
464 n = send(current_sd, bp, sp - bp, 0);
465 #else
466 n = write(current_sd, bp, sp - bp);
467 #endif
468 if (n < 0) {
469 if (ERRNO_CHECK (errno) || errno == EINTR) {
470 continue;
471 } else {
472 #if DEBUG_IO
473 fprintf(stderr,
474 "writen: failed. errno=%d\n", errno);
475 #endif
476 daemon_dead();
477 return -1;
478 }
479 }
480 bp += n;
481 }
482 sbp = snd_buf;
483 #if DEBUG_IO
484 fprintf (stderr, "jslib:writen=%d\n", total);
485 #endif
486 return 0;
487 }
488
489 /* send one byte to server */
490 static void
put1com(int c)491 put1com(int c)
492 {
493 unsigned int data = c & 0xff;
494
495 #if DEBUG_IO
496 fprintf(stderr, "put1com: [%02x]\n", data);
497 #endif
498
499 /* flush buffer if full */
500 if (sbp - snd_buf >= S_BUF_SIZ) {
501 writen(sbp);
502 }
503 *(sbp++) = data;
504 }
505
506 /* send two bytes */
507 static void
put2com(int c)508 put2com(int c)
509 {
510 unsigned int data = c & 0xffff;
511 #if DEBUG_IO
512 fprintf(stderr, "put2com: [%04x]\n", data);
513 #endif
514 put1com(data >> (8 * 1));
515 put1com(data);
516 }
517
518 /* send four bytes */
519 static void
put4com(int c)520 put4com(int c)
521 {
522 unsigned int data = c & 0xffffffff;
523 #if DEBUG_IO
524 fprintf(stderr, "put4com: [%08x]\n", data);
525 #endif
526 put1com(data >> (8 * 3));
527 put1com(data >> (8 * 2));
528 put1com(data >> (8 * 1));
529 put1com(data);
530 }
531
532 /* send w_char string */
533 static void
putwscom(w_char * p)534 putwscom(w_char *p)
535 {
536 if (p == NULL) {
537 put2com(0x0000);
538 return;
539 }
540
541 #if DEBUG_IO
542 fprintf(stderr, "putwscom: [%s]\n", p);
543 #endif
544 while(*p)
545 put2com (*p++);
546 put2com(0x0000);
547 }
548
549 /* send string */
550 static void
putscom(unsigned char * p)551 putscom(unsigned char *p)
552 {
553 if (p == NULL) {
554 put1com(0x00);
555 return;
556 }
557 #if DEBUG_IO
558 fprintf(stderr, "putscom: [%s]\n", p);
559 #endif
560 while (*p)
561 put1com(*p++);
562 put1com(0);
563 }
564
565 static unsigned char rcv_buf[R_BUF_SIZ];
566 static unsigned char *rbp = rcv_buf;
567 static unsigned char *rp = rcv_buf;
568
569 static int
rcv_flush()570 rcv_flush()
571 {
572 #if DEBUG_IO
573 fprintf(stderr, "rcv_flush\n");
574 #endif
575 rbp = rp = &rcv_buf[0];
576 return 0;
577 }
578
579 static unsigned int
get1com()580 get1com()
581 {
582 int n;
583
584 #if DEBUG_IO
585 fprintf(stderr, "get1com: Enter\n");
586 #endif
587 if (rp == rbp) {
588 /* rp == rbp case; no data in rcv_buf */
589
590 rbp = rp = rcv_buf;
591
592 while (rbp == rp) {
593 errno = 0;
594 #ifdef HAVE_RECV
595 n = recv(current_sd, rcv_buf, sizeof(rcv_buf), 0);
596 #else
597 n = read(current_sd, rcv_buf, sizeof(rcv_buf));
598 #endif
599 #if DEBUG_IO
600 fprintf(stderr, "recvloop: n=%d\n", n);
601 #endif
602 if (n == 0) {
603 if (ERRNO_CHECK(errno)) {
604 continue;
605 } else {
606 daemon_dead();
607 return -1;
608 }
609 }
610 if (n < 0) {
611 if (ERRNO_CHECK(errno) || errno == EINTR) {
612 continue;
613 } else {
614 daemon_dead();
615 return -1;
616 }
617 }
618 rp += n;
619 }
620 #if DEBUG_IO
621 fprintf (stderr, "jslib:read:rp - rbp =%d\n", rp - rbp);
622 #endif
623 }
624
625 #if DEBUG_IO
626 fprintf(stderr, "get1com: data [%02x]\n", *rbp & 0xff);
627
628 fprintf(stderr, "rcv_buf: ");
629 {
630 int i;
631 for (i=0; i < rp - rbp; i++) {
632 fprintf(stderr, "[%02x]", *(rbp + i));
633 }
634 fprintf(stderr, "\n");
635 }
636 #endif
637 return (*(rbp++) & 0xff);
638 }
639
640 /* get two bytes */
641 static unsigned int
get2com()642 get2com()
643 {
644 unsigned int h;
645 #if DEBUG_IO
646 fprintf(stderr, "get2com: Enter\n");
647 #endif
648 h = get1com() << 8;
649 h |= get1com();
650
651 #if DEBUG_IO
652 fprintf(stderr, "get2com: [%04x]\n", h);
653 #endif
654 return h;
655 }
656
657 /* get four bytes */
658 static unsigned int
get4com()659 get4com()
660 {
661 unsigned int h;
662 #if DEBUG_IO
663 fprintf(stderr, "get4com: Enter\n");
664 #endif
665 h = get1com() << 24;
666 h |= get1com() << 16;
667 h |= get1com() << 8;
668 h |= get1com();
669 #if DEBUG_IO
670 fprintf(stderr, "get4com: [%08x]\n", h);
671 #endif
672 return h;
673 }
674
675 /* get string */
676 static void
getscom(unsigned char * p)677 getscom(unsigned char *p)
678 {
679 unsigned char *bp = p;
680 while (*p++ = get1com())
681 ;
682 #if DEBUG_IO
683 fprintf(stderr, "getscom: [%s]\n", bp);
684 #endif
685 }
686
687 /* get wstring */
688 static void
getwscom(w_char * p)689 getwscom(w_char *p)
690 {
691 while (*p++ = get2com ())
692 ;
693 }
694
695 #ifdef nodef
696 /* Moved from ../etc/string.c */
697 /** **/
698 static int
Strlen(s)699 Strlen (s)
700 register w_char *s;
701 {
702 register int n;
703
704 for (n = 0; *s++ != 0; n++);
705 return n;
706 }
707
708 /** **/
709 static w_char *
Strcpy(s1,s2)710 Strcpy (s1, s2)
711 register w_char *s1;
712 register w_char *s2;
713 {
714 register w_char *d;
715
716 for (d = s1; (*d++ = *s2++) != 0;);
717 return s1;
718 }
719 #endif
720
721
722 /* Debug Subroutines */
723 void
xerror(s)724 xerror (s)
725 char *s;
726 {
727 fprintf (stderr, "%s\n", s);
728 }
729
730 void
dmp(p,c)731 dmp (p, c)
732 char *p;
733 {
734 int i, j;
735 for (i = 0;; i += 16)
736 {
737 for (j = 0; j < 16; j++)
738 {
739 if (c <= 0)
740 {
741 fprintf (stderr, "\n");
742 return;
743 }
744 fprintf (stderr, "%02x ", p[i + j] & 0xFF);
745 c--;
746 }
747 fprintf (stderr, "\n");
748 }
749 }
750
751 /* get login name form /etc/passwd file */
752 static char *
getlogname()753 getlogname ()
754 {
755 struct passwd *getpwuid ();
756 return getpwuid (getuid ())->pw_name;
757 }
758
759
760
761
762 /*
763 * Lib. Functions
764 * raw lib.
765 */
766
767 /***
768 js
769 ��global
770 ***/
771
772 /** jserver ����³���롣jserver_id ���֤��� **/
773 WNN_JSERVER_ID *
js_open_lang(char * server,char * lang,int timeout)774 js_open_lang (char *server,
775 char *lang,
776 int timeout)
777 {
778 char *new_js;
779 char host[WNN_HOSTLEN];
780 char user[WNN_ENVNAME_LEN];
781 int x;
782
783 if (wnn_msg_cat == NULL) {
784 char nlspath[MAXPATHLEN];
785 strcpy (nlspath, LIBDIR);
786 strcat (nlspath, "/%L/%N");
787 wnn_msg_cat = msg_open ("libwnn.msg", nlspath, lang);
788 if (wnn_msg_cat == NULL) {
789 fprintf (stderr,
790 "libwnn: Cannot open message file for libwnn.a\n");
791 }
792 }
793
794 if (!(new_js = (char *) malloc (sizeof (WNN_JSERVER_ID)))) {
795 wnn_errorno = WNN_ALLOC_FAIL;
796 return NULL;
797 }
798
799 current_js = (WNN_JSERVER_ID *) new_js;
800 if (server == NULL) {
801 current_js->js_name[0] = '\0';
802 } else {
803 strncpy(current_js->js_name, server, sizeof (current_js->js_name) - 1);
804 current_js->js_name[sizeof (current_js->js_name) - 1] = '\0';
805 }
806
807 current_js->js_dead = 0;
808 current_js->js_dead_env_flg = 0;
809 /*
810 if(user == NULL || 0==strcmp(user,""))
811 */
812 strncpy(user, getlogname (), WNN_ENVNAME_LEN);
813 user[WNN_ENVNAME_LEN - 1] = '\0'; /* truncate by WNN_ENVNAME_LEN */
814
815 #if DEBUG
816 fprintf(stderr, "js_open_lang: server: %s\n", server);
817 #endif
818 if (server == NULL
819 || 0 == strcmp(server, "")
820 || 0 == strcmp(server, "unix")) {
821 strcpy(host, "unix");
822 if ((current_sd = cd_open_un(lang)) == -1) {
823 wnn_errorno = WNN_SOCK_OPEN_FAIL;
824 free ((char *) current_js);
825 current_js = NULL;
826 return NULL;
827 }
828 } else {
829 gethostname (host, WNN_HOSTLEN);
830 host[WNN_HOSTLEN - 1] = '\0'; /* truncate by WNN_HOSTLEN */
831 #if DEBUG
832 fprintf(stderr, "js_open_lang: before cd_open_in\n");
833 #endif
834 if ((current_sd = cd_open_in(server, lang, timeout)) == -1) {
835 wnn_errorno = WNN_SOCK_OPEN_FAIL;
836 free((char *)current_js);
837 current_js = NULL;
838 #if DEBUG
839 fprintf(stderr, "js_open_lang: cd_open_in failed\n");
840 #endif
841 return NULL;
842 }
843 #if DEBUG
844 fprintf(stderr, "js_open_lang: after cd_open_in\n");
845 #endif
846 }
847
848 #if DEBUG
849 fprintf(stderr, "current_sd=%d\n", current_sd);
850 #endif
851 current_js->sd = current_sd;
852 handler_of_jserver_dead (NULL);
853 snd_head(JS_OPEN);
854 put4com(JLIB_VERSION); /* H.T. */
855 putscom(host);
856 putscom(user);
857 snd_flush();
858
859 #if DEBUG
860 fprintf(stderr, "cd_open_in: before get4com\n");
861 #endif
862
863 if (get4com() == -1) {
864 x = wnn_errorno = get4com ();
865 js_close(current_js); /* H.T. */
866 current_js = NULL;
867 wnn_errorno = x;
868 return NULL;
869 }
870
871 return current_js;
872 }
873
874
875 /** �����åȤ������� **/
876 /** jserver �Ȥ���³�� close ���롣 **/
877 int
js_close(server)878 js_close (server)
879 WNN_JSERVER_ID *server;
880 {
881 register int x;
882 WNN_JSERVER_ID tmp_js_id;
883 if (server == 0)
884 return (-1);
885 tmp_js_id = *server;
886 free ((char *) server);
887 current_js = &tmp_js_id;
888 current_sd = current_js->sd;
889 /* handler of jserver dead */
890 handler_of_jserver_dead (-1);
891 snd_head (JS_CLOSE);
892 snd_flush ();
893 x = get4com ();
894 if (x == -1)
895 wnn_errorno = get4com ();
896 #ifdef HAVE_CLOSESOCKET
897 closesocket (current_sd);
898 #else
899 close (current_sd);
900 #endif
901 return x;
902 }
903
904
905 /*
906 jserver �Ȥδ֤� connection ��ĥ�ꡢƱ���� jserver �������˴�
907 �����롣env_name �˴���¸�ߤ���Ķ�����ꤷ�����ˤϤ��δĶ���
908 �֤���NULL ����ꤷ�����ˤϿ������Ķ����ä��֤���
909 */
910
911 struct wnn_env *
js_connect_lang(server,env_name,lang)912 js_connect_lang (server, env_name, lang)
913 register char *env_name;
914 WNN_JSERVER_ID *server;
915 char *lang;
916 {
917 register int e_id;
918 register struct wnn_env *env;
919 void js_set_lang ();
920
921 set_current_js (server);
922 if (!(env = (struct wnn_env *) malloc (sizeof (struct wnn_env))))
923 {
924 wnn_errorno = WNN_ALLOC_FAIL;
925 return NULL;
926 }
927 handler_of_jserver_dead (NULL);
928 snd_head (JS_CONNECT);
929 putscom (env_name);
930 snd_flush ();
931 e_id = get4com ();
932 if (e_id == -1)
933 {
934 wnn_errorno = get4com ();
935 free (env);
936 return NULL;
937 }
938 env->env_id = e_id;
939 env->js_id = server;
940 strcpy (env->lang, lang); /* set language name */
941 return env;
942 }
943
944 #ifdef nodef
945 /* set language value to env */
946 void
js_set_lang(env,lang)947 js_set_lang (env, lang)
948 struct wnn_env *env;
949 register char *lang;
950 {
951 register char *p;
952 extern char *getenv ();
953
954 /* if not specified language , use $LANG */
955 if (lang == 0 || *lang == 0)
956 lang = getenv ("LANG");
957 if (lang == 0 || *lang == 0)
958 lang = WNN_DEFAULT_LANG;
959 for (p = env->lang; *lang != '.' && *lang != '@' && *lang != 0; lang++, p++)
960 *p = *lang;
961 *p = 0;
962 }
963 #endif
964
965 /* get language value from env */
966 char *
js_get_lang(env)967 js_get_lang (env)
968 struct wnn_env *env;
969 {
970 return (env->lang);
971 }
972
973 int
js_env_exist(server,env_name)974 js_env_exist (server, env_name)
975 register char *env_name;
976 register WNN_JSERVER_ID *server;
977 {
978 set_current_js (server);
979 handler_of_jserver_dead (-1);
980 snd_head (JS_ENV_EXIST);
981 putscom (env_name);
982 snd_flush ();
983 return (get4com ());
984 }
985
986 int
js_env_sticky(env)987 js_env_sticky (env)
988 register struct wnn_env *env;
989 {
990 if (env == 0)
991 return (-1);
992 set_current_js (env->js_id);
993 handler_of_jserver_dead (-1);
994 snd_env_head (env, JS_ENV_STICKY);
995 snd_flush ();
996 return (get4com ());
997 }
998
999 int
js_env_un_sticky(env)1000 js_env_un_sticky (env)
1001 register struct wnn_env *env;
1002 {
1003 if (env == 0)
1004 return (-1);
1005 set_current_js (env->js_id);
1006 handler_of_jserver_dead (-1);
1007 snd_env_head (env, JS_ENV_UN_STICKY);
1008 snd_flush ();
1009 return (get4com ());
1010 }
1011
1012 /**
1013 env �Ǽ������Ķ���̵������
1014 **/
1015 int
js_disconnect(env)1016 js_disconnect (env)
1017 register struct wnn_env *env;
1018 {
1019 register int x;
1020 struct wnn_env tmp_env;
1021 if (env == 0)
1022 return (-1);
1023 tmp_env = *env;
1024 /* ����ϡ�free ���ʤ��㤢����Τ����ɡ����������������ʤ�����
1025 �ޤ���8�Х��Ȥ����顢���ߤ��Ĥ뤱�ɤ���������
1026 free((char *)env);
1027 */
1028 set_current_js (env->js_id);
1029 handler_of_jserver_dead (NULL);
1030 snd_env_head (&tmp_env, JS_DISCONNECT);
1031 snd_flush ();
1032 x = get4com ();
1033 if (x == -1)
1034 {
1035 wnn_errorno = get4com ();
1036 }
1037 return x;
1038 }
1039
1040 /** �����Фȥ��ͥ��Ȥ��Ƥ��뤫 **/
1041 int
js_isconnect(env)1042 js_isconnect (env)
1043 register struct wnn_env *env;
1044 {
1045 if (env && env->js_id)
1046 return (env->js_id->js_dead);
1047 return (-1);
1048 }
1049
1050 /**
1051 env �� �Ķ� �Ȥ��̿��Хåե��� flush ���롣
1052 **/
1053 void
js_flush(env)1054 js_flush (env)
1055 struct wnn_env *env;
1056 {
1057 }
1058
1059
1060
1061 /* Parameter set/get */
1062 /** �Ѵ� parameter �����ꤹ�롣 **/
1063 /** js_param_set **/
1064 int
js_param_set(env,para)1065 js_param_set (env, para)
1066 struct wnn_env *env;
1067 register struct wnn_param *para;
1068 {
1069 register int x;
1070 if (env == 0)
1071 return (-1);
1072 set_current_js (env->js_id);
1073 handler_of_jserver_dead (-1);
1074 snd_env_head (env, JS_PARAM_SET);
1075 put4com (para->n); /* ��(��)ʸ����ϤΣ� */
1076 put4com (para->nsho); /* ��ʸ����ξ�ʸ��κ���� */
1077 put4com (para->p1); /* ��������٤Υѥ��� */
1078 put4com (para->p2); /* ��ʸ��Ĺ�Υѥ��� */
1079 put4com (para->p3); /* ����Ĺ�Υѥ��� */
1080 put4com (para->p4); /* ���Ȥä���ӥåȤΥѥ��� */
1081 put4com (para->p5); /* ����Υѥ��� */
1082 put4com (para->p6); /* ��ʸ���ɾ���ͤΥѥ��� */
1083 put4com (para->p7); /* ��ʸ��Ĺ�Υѥ��� */
1084 put4com (para->p8); /* ��ʸ����Υѥ��� */
1085
1086 put4com (para->p9); /* �����ʻ� ���������� */
1087 put4com (para->p10); /* �����ʻ� ���ʤ����� *//* CWNN �ѿ������� */
1088 put4com (para->p11); /* �����ʻ� �ѿ������� *//* CWNN ��������� */
1089 put4com (para->p12); /* �����ʻ� ��������� *//* CWNN ����̤����� */
1090 put4com (para->p13); /* �����ʻ� �ij�̤����� *//* CWNN �ij�̤����� */
1091 put4com (para->p14); /* �����ʻ� ��°������� *//* BWNN No of koho */
1092 put4com (para->p15); /* �����ʻ� ����̤����� *//* CWNN Not used */
1093
1094 snd_flush ();
1095 x = get4com ();
1096 if (x == -1)
1097 {
1098 wnn_errorno = get4com ();
1099 return -1;
1100 }
1101 return 0;
1102 }
1103
1104 /** js_param_get **/
1105 /** env �Ǽ������Ķ����Ѵ� parameter ����Ф��� **/
1106 int
js_param_get(env,para)1107 js_param_get (env, para)
1108 struct wnn_env *env;
1109 register struct wnn_param *para;
1110 {
1111 if (env == 0)
1112 return (-1);
1113 set_current_js (env->js_id);
1114 handler_of_jserver_dead (-1);
1115 snd_env_head (env, JS_PARAM_GET);
1116 snd_flush ();
1117 if (get4com () == -1)
1118 {
1119 wnn_errorno = get4com ();
1120 return -1;
1121 }
1122 para->n = get4com (); /* ��(��)ʸ����ϤΣ� */
1123 para->nsho = get4com (); /* ��ʸ����ξ�ʸ��κ���� */
1124 para->p1 = get4com (); /* ��������٤Υѥ��� */
1125 para->p2 = get4com (); /* ��ʸ��Ĺ�Υѥ��� */
1126 para->p3 = get4com (); /* ����Ĺ�Υѥ��� */
1127 para->p4 = get4com (); /* ���Ȥä���ӥåȤΥѥ��� */
1128 para->p5 = get4com (); /* ����Υѥ��� */
1129 para->p6 = get4com (); /* ��ʸ���ɾ���ͤΥѥ��� */
1130 para->p7 = get4com (); /* ��ʸ��Ĺ�Υѥ��� */
1131 para->p8 = get4com (); /* ��ʸ����Υѥ��� */
1132 para->p9 = get4com (); /* �����ʻ� ���������� */
1133 para->p10 = get4com (); /* �����ʻ� ���ʤ����� */
1134 para->p11 = get4com (); /* �����ʻ� �ѿ������� */
1135 para->p12 = get4com (); /* �����ʻ� ��������� */
1136 para->p13 = get4com (); /* �����ʻ� �ij�̤����� */
1137 para->p14 = get4com (); /* �����ʻ� ��°������� */
1138 para->p15 = get4com (); /* �����ʻ� ����̤����� */
1139
1140 return 0;
1141 }
1142
1143 /*
1144 global File Operation
1145 */
1146 /** js_mkdir **/
1147 int
js_mkdir(env,path)1148 js_mkdir (env, path)
1149 struct wnn_env *env;
1150 char *path;
1151 {
1152 register int x;
1153 if (env == 0)
1154 return (-1);
1155 set_current_js (env->js_id);
1156 handler_of_jserver_dead (-1);
1157 snd_env_head (env, JS_MKDIR);
1158 putscom (path);
1159 snd_flush ();
1160 x = get4com ();
1161 if (x == -1)
1162 wnn_errorno = get4com ();
1163 return x;
1164 }
1165
1166 /** js_access **/
1167 int
js_access(env,path,amode)1168 js_access (env, path, amode)
1169 struct wnn_env *env;
1170 char *path;
1171 int amode;
1172 {
1173 register int x;
1174 if (env == 0)
1175 return (-1);
1176 set_current_js (env->js_id);
1177 handler_of_jserver_dead (-1);
1178 snd_env_head (env, JS_ACCESS);
1179 put4com (amode);
1180 putscom (path);
1181 snd_flush ();
1182 x = get4com ();
1183 return x;
1184 }
1185
1186 /** js_file_list_all **/
1187 static int rcv_file_list ();
1188
1189 int
js_file_list_all(server,ret)1190 js_file_list_all (server, ret)
1191 WNN_JSERVER_ID *server;
1192 struct wnn_ret_buf *ret;
1193 {
1194 set_current_js (server);
1195 handler_of_jserver_dead (-1);
1196 snd_server_head (server, JS_FILE_LIST_ALL);
1197 snd_flush ();
1198 return rcv_file_list (ret);
1199 }
1200
1201
1202 /** js_file_list **/
1203 int
js_file_list(env,ret)1204 js_file_list (env, ret)
1205 struct wnn_env *env;
1206 struct wnn_ret_buf *ret;
1207 {
1208 if (env == 0)
1209 return (-1);
1210 set_current_js (env->js_id);
1211 handler_of_jserver_dead (-1);
1212 snd_env_head (env, JS_FILE_LIST);
1213 snd_flush ();
1214 return rcv_file_list (ret);
1215 }
1216
1217 static void re_alloc ();
1218
1219 static int
rcv_file_list(ret)1220 rcv_file_list (ret)
1221 struct wnn_ret_buf *ret;
1222 {
1223 register int i, count;
1224 WNN_FILE_INFO_STRUCT *files;
1225 count = get4com ();
1226 re_alloc (ret, sizeof (WNN_FILE_INFO_STRUCT) * count);
1227 files = (WNN_FILE_INFO_STRUCT *) ret->buf;
1228 for (i = 0; i < count; i++)
1229 {
1230 files->fid = get4com ();
1231 files->localf = get4com ();
1232 files->ref_count = get4com ();
1233 files->type = get4com ();
1234 getscom (files->name);
1235 files++;
1236 }
1237 return count;
1238 }
1239
1240 /** js_file_stat **/
1241 int
js_file_stat(env,path,s)1242 js_file_stat (env, path, s)
1243 struct wnn_env *env;
1244 char *path;
1245 WNN_FILE_STAT *s;
1246 {
1247 register int x;
1248 if (env == 0)
1249 return (-1);
1250 set_current_js (env->js_id);
1251 handler_of_jserver_dead (-1);
1252 snd_env_head (env, JS_FILE_STAT);
1253 putscom (path);
1254 snd_flush ();
1255 x = get4com ();
1256 s->type = x;
1257 return x;
1258 }
1259
1260
1261 /** js_file_info **/
1262 int
js_file_info(env,fid,file)1263 js_file_info (env, fid, file)
1264 struct wnn_env *env;
1265 int fid;
1266 register WNN_FILE_INFO_STRUCT *file;
1267 {
1268 register int x;
1269 if (env == 0)
1270 return (-1);
1271 set_current_js (env->js_id);
1272 handler_of_jserver_dead (-1);
1273 snd_env_head (env, JS_FILE_INFO);
1274 put4com (fid);
1275 snd_flush ();
1276 file->fid = fid;
1277 x = get4com ();
1278 if (x == -1)
1279 {
1280 wnn_errorno = get4com ();
1281 return (-1);
1282 }
1283 getscom (file->name);
1284 file->localf = get4com ();
1285 file->ref_count = get4com ();
1286 file->type = get4com ();
1287 return 0;
1288 }
1289
1290 /** js_file_loaded **/
1291 int
js_file_loaded(server,path)1292 js_file_loaded (server, path)
1293 WNN_JSERVER_ID *server;
1294 char *path;
1295 {
1296 register int x;
1297 set_current_js (server);
1298 handler_of_jserver_dead (-1);
1299 snd_server_head (server, JS_FILE_LOADED);
1300 putscom (path);
1301 snd_flush ();
1302 x = get4com ();
1303 return x;
1304 }
1305
1306 /** js_file_loaded_local **/
1307 static int check_local_file ();
1308 static int file_loaded_local ();
1309
1310 int
js_file_loaded_local(server,path)1311 js_file_loaded_local (server, path)
1312 WNN_JSERVER_ID *server;
1313 char *path;
1314 {
1315 int x;
1316 set_current_js (server);
1317 handler_of_jserver_dead (-1);
1318
1319 if (check_local_file (path) == -1)
1320 return (-1);
1321 snd_server_head (server, JS_FILE_LOADED_LOCAL);
1322 x = file_loaded_local (path);
1323 if (x == -1)
1324 {
1325 return -1;
1326 }
1327 return x;
1328 }
1329
1330 static int
check_local_file(path)1331 check_local_file (path)
1332 char *path;
1333 {
1334 register FILE *f;
1335 register int x;
1336 struct wnn_file_head fh;
1337
1338 #ifdef WRITE_CHECK
1339 check_backup (path);
1340 #endif /* WRITE_CHECK */
1341 f = fopen (path, "r");
1342 if (f == NULL)
1343 {
1344 wnn_errorno = WNN_OPENF_ERR;
1345 return -1;
1346 }
1347 x = input_file_header (f, &fh);
1348 if (x == -1)
1349 {
1350 fclose (f);
1351 wnn_errorno = WNN_NOT_A_FILE;
1352 return -1;
1353 }
1354 if (check_inode (f, &fh) == -1)
1355 {
1356 change_file_uniq (&fh, path);
1357 #ifdef WRITE_CHECK
1358 fclose (f);
1359 f = fopen (path, "r");
1360 if (f == NULL)
1361 {
1362 wnn_errorno = WNN_OPENF_ERR;
1363 return (-1);
1364 }
1365 #endif /* WRITE_CHECK */
1366 if (check_inode (f, &fh) == -1)
1367 {
1368 fclose (f);
1369 wnn_errorno = WNN_INODE_CHECK_ERROR;
1370 return (-1);
1371 }
1372 }
1373 fclose (f);
1374 return 0;
1375 }
1376
1377
1378 static int
file_loaded_local(path)1379 file_loaded_local (path)
1380 char *path;
1381 {
1382 register int x, i;
1383 FILE *f;
1384 struct wnn_file_head fh;
1385
1386 #ifdef WRITE_CHECK
1387 check_backup (path);
1388 #endif /* WRITE_CHECK */
1389 f = fopen (path, "r");
1390 if (f == NULL)
1391 {
1392 wnn_errorno = WNN_OPENF_ERR;
1393 return -1;
1394 }
1395 x = input_file_header (f, &fh);
1396 if (x == -1)
1397 {
1398 fclose (f);
1399 wnn_errorno = WNN_NOT_A_FILE;
1400 return -1;
1401 }
1402 put4com (fh.file_uniq.time);
1403 put4com (fh.file_uniq.dev);
1404 put4com (fh.file_uniq.inode);
1405 for (i = 0; i < WNN_HOSTLEN; i++)
1406 {
1407 put1com (fh.file_uniq.createhost[i]);
1408 }
1409
1410 snd_flush ();
1411 x = get4com ();
1412 fclose (f);
1413 return x;
1414 }
1415
1416
1417 /** js_hindo_file_create **/
1418 int
js_hindo_file_create(env,fid,fn,comment,hpasswd)1419 js_hindo_file_create (env, fid, fn, comment, hpasswd)
1420 struct wnn_env *env;
1421 int fid;
1422 char *fn;
1423 w_char *comment;
1424 char *hpasswd;
1425 {
1426 register int x;
1427 if (env == 0)
1428 return (-1);
1429 set_current_js (env->js_id);
1430 handler_of_jserver_dead (-1);
1431 snd_env_head (env, JS_HINDO_FILE_CREATE);
1432 put4com (fid);
1433 putscom (fn);
1434 putwscom (comment);
1435 putscom (hpasswd);
1436 snd_flush ();
1437 x = get4com ();
1438 if (x == -1)
1439 wnn_errorno = get4com ();
1440 return x;
1441 }
1442
1443 /** js_dic_file_create **/
1444 int
js_dic_file_create(env,fn,type,comment,passwd,hpasswd)1445 js_dic_file_create (env, fn, type, comment, passwd, hpasswd)
1446 struct wnn_env *env;
1447 char *fn;
1448 w_char *comment;
1449 char *passwd, *hpasswd;
1450 int type;
1451 {
1452 register int x;
1453 if (env == 0)
1454 return (-1);
1455 set_current_js (env->js_id);
1456 handler_of_jserver_dead (-1);
1457 snd_env_head (env, JS_DIC_FILE_CREATE);
1458 putscom (fn);
1459 putwscom (comment);
1460 putscom (passwd);
1461 putscom (hpasswd);
1462 put4com (type);
1463 snd_flush ();
1464 x = get4com ();
1465 if (x == -1)
1466 wnn_errorno = get4com ();
1467 return x;
1468 }
1469
1470
1471 /** js_file_discard **/
1472 int
js_file_discard(env,fid)1473 js_file_discard (env, fid)
1474 struct wnn_env *env;
1475 int fid;
1476 {
1477 register int x;
1478 if (env == 0)
1479 return (-1);
1480 set_current_js (env->js_id);
1481 handler_of_jserver_dead (-1);
1482 snd_env_head (env, JS_FILE_DISCARD);
1483 put4com (fid);
1484 snd_flush ();
1485 x = get4com ();
1486 if (x == -1)
1487 wnn_errorno = get4com ();
1488 return x;
1489 }
1490
1491 /** js_file_read **/
1492 int
js_file_read(env,fn)1493 js_file_read (env, fn)
1494 struct wnn_env *env;
1495 char *fn;
1496 {
1497 register int x;
1498 if (env == 0)
1499 return (-1);
1500 set_current_js (env->js_id);
1501 handler_of_jserver_dead (-1);
1502 snd_env_head (env, JS_FILE_READ);
1503 putscom (fn);
1504 snd_flush ();
1505 x = get4com ();
1506 if (x == -1)
1507 wnn_errorno = get4com ();
1508 return x;
1509 }
1510
1511 /** js_file_write **/
1512 int
js_file_write(env,fid,fn)1513 js_file_write (env, fid, fn)
1514 struct wnn_env *env;
1515 int fid;
1516 char *fn;
1517 {
1518 register int x;
1519 if (env == 0)
1520 return (-1);
1521 set_current_js (env->js_id);
1522 handler_of_jserver_dead (-1);
1523 snd_env_head (env, JS_FILE_WRITE);
1524 put4com (fid);
1525 putscom (fn);
1526 snd_flush ();
1527 x = get4com ();
1528 if (x == -1)
1529 wnn_errorno = get4com ();
1530 return x;
1531 }
1532
1533 /** js_file_receive **/
1534 static int xget1com ();
1535 static void xput1com ();
1536
1537 int
js_file_receive(env,fid,fn)1538 js_file_receive (env, fid, fn)
1539 struct wnn_env *env;
1540 int fid;
1541 char *fn;
1542 {
1543 register int mode, x;
1544 char file_name[1024];
1545 char buf[1024];
1546 FILE *f;
1547 int n;
1548 struct wnn_file_head fh;
1549 int i;
1550 #ifdef WRITE_CHECK
1551 char *tmp, *backup = NULL, tmp_x;
1552 int tmp_err = 0;
1553 #endif /* WRITE_CHECK */
1554
1555 if (env == 0)
1556 return (-1);
1557 set_current_js (env->js_id);
1558 handler_of_jserver_dead (-1);
1559 snd_env_head (env, JS_FILE_RECEIVE);
1560 put4com (fid);
1561 snd_flush ();
1562 /**/ getscom (file_name);
1563 if (fn == NULL || strcmp (fn, "") == 0)
1564 {
1565 gethostname (buf, 1024);
1566 n = strlen (buf);
1567 buf[n] = C_LOCAL;
1568 buf[n + 1] = 0;
1569 if (strncmp (buf, file_name, n + 1) == 0)
1570 {
1571 fn = file_name + n + 1;
1572 }
1573 }
1574 #ifdef WRITE_CHECK
1575 check_backup (fn);
1576 #endif /* WRITE_CHECK */
1577 if ((f = fopen (fn, "r")) == NULL)
1578 { /* New File */
1579 fh.file_uniq.time = fh.file_uniq.dev = fh.file_uniq.inode = 0;
1580 }
1581 else
1582 { /* Old File Exists */
1583 if (input_file_header (f, &fh) == -1)
1584 {
1585 wnn_errorno = WNN_NOT_A_FILE;
1586 fclose (f);
1587 put4com (-1);
1588 snd_flush ();
1589 sleep (1); /* enssure handshake */
1590 return (-1);
1591 }
1592 fclose (f);
1593 }
1594 put4com (0); /* Ack */
1595 put4com (fh.file_uniq.time);
1596 put4com (fh.file_uniq.dev);
1597 put4com (fh.file_uniq.inode);
1598 for (i = 0; i < WNN_HOSTLEN; i++)
1599 {
1600 put1com (fh.file_uniq.createhost[i]);
1601 }
1602
1603 snd_flush ();
1604
1605 if ((mode = get4com ()) == -1)
1606 { /* check stat */
1607 wnn_errorno = get4com ();
1608 return -1;
1609 }
1610 else if (mode == 0)
1611 {
1612 return 0; /* need not saving */
1613 }
1614 else if (mode == 1 || mode == 3)
1615 { /* mode == 3 means the file is a new one. */
1616 #ifdef WRITE_CHECK
1617 backup = make_backup_file (fn);
1618 if ((tmp = make_tmp_file (fn, 0, &f)) == NULL)
1619 {
1620 delete_tmp_file (backup);
1621 #else /* WRITE_CHECK */
1622 if ((f = fopen (fn, "w+")) == NULL)
1623 {
1624 #endif /* WRITE_CHECK */
1625 wnn_errorno = WNN_FILE_WRITE_ERROR;
1626 put4com (-1);
1627 snd_flush ();
1628 sleep (1); /* enssure handshake */
1629 return (-1);
1630 }
1631 }
1632 else if (mode == 2)
1633 {
1634 #ifdef WRITE_CHECK
1635 backup = make_backup_file (fn);
1636 if ((tmp = make_tmp_file (fn, 1, &f)) == NULL)
1637 {
1638 delete_tmp_file (backup);
1639 #else /* WRITE_CHECK */
1640 if ((f = fopen (fn, "r+")) == NULL)
1641 { /* New File */
1642 #endif /* WRITE_CHECK */
1643 wnn_errorno = WNN_FILE_WRITE_ERROR;
1644 put4com (-1);
1645 snd_flush ();
1646 sleep (1); /* enssure handshake */
1647 return (-1);
1648 }
1649 }
1650 put4com (0);
1651 snd_flush (); /* ACK */
1652 for (;;)
1653 {
1654 if ((x = xget1com ()) == -1)
1655 break; /* EOF */
1656 #ifdef WRITE_CHECK
1657 tmp_x = (char) x;
1658 if (fwrite (&tmp_x, sizeof (char), 1, f) == -1)
1659 tmp_err = 1;
1660 #else /* WRITE_CHECK */
1661 fputc (x, f);
1662 #endif /* WRITE_CHECK */
1663 }
1664 fclose (f);
1665 #ifdef WRITE_CHECK
1666 if (tmp_err == 0)
1667 {
1668 move_tmp_to_org (tmp, fn, 1);
1669 }
1670 else
1671 {
1672 delete_tmp_file (tmp);
1673 }
1674 delete_tmp_file (backup);
1675 #endif /* WRITE_CHECK */
1676
1677 x = get4com ();
1678 if (x == -1)
1679 wnn_errorno = get4com ();
1680 #ifdef WRITE_CHECK
1681 if (tmp_err)
1682 {
1683 wnn_errorno = WNN_FILE_WRITE_ERROR;
1684 return (-1);
1685 }
1686 #endif /* WRITE_CHECK */
1687
1688 return x;
1689 }
1690
1691 static int
xget1com()1692 xget1com ()
1693 {
1694 register int x;
1695 if ((x = get1com ()) != 0xFF)
1696 return x;
1697 if (get1com () == 0xFF)
1698 return -1; /* EOF */
1699 return 0xFF;
1700 }
1701
1702 /** js_file_send **/
1703 int
js_file_send(env,fn)1704 js_file_send (env, fn)
1705 struct wnn_env *env;
1706 char *fn;
1707 {
1708 register int x;
1709 FILE *f;
1710 int n;
1711 char buf[1024], *b;
1712 register int cc, i;
1713 if (env == 0)
1714 return (-1);
1715 set_current_js (env->js_id);
1716 handler_of_jserver_dead (-1);
1717
1718 if (check_local_file (fn) == -1)
1719 return (-1);
1720
1721 snd_env_head (env, JS_FILE_SEND);
1722 x = file_loaded_local (fn);
1723 if (x != -1)
1724 { /* file is already loaded */
1725 if (get4com () == -1)
1726 {
1727 wnn_errorno = get4com ();
1728 return (-1);
1729 }
1730 return x;
1731 }
1732
1733 x = get4com ();
1734 if (x == -1)
1735 {
1736 wnn_errorno = get4com ();
1737 return -1;
1738 }
1739
1740 gethostname (buf, 1024);
1741 n = strlen (buf);
1742 buf[n] = C_LOCAL;
1743 strcpy (buf + n + 1, fn);
1744 putscom (buf);
1745
1746 #ifdef WRITE_CHECK
1747 check_backup (fn);
1748 #endif /* WRITE_CHECK */
1749 if ((f = fopen (fn, "r")) == NULL)
1750 {
1751 xput1com (-1); /* EOF */
1752 return -1;
1753 }
1754
1755 /* send contents of file */
1756 for (;;)
1757 {
1758 cc = fread (buf, 1, 1024, f);
1759 if (cc <= 0)
1760 break; /* EOF */
1761 for (b = buf, i = 0; i < cc; i++)
1762 {
1763 xput1com ((int) *b++ & 0xff);
1764 }
1765 }
1766 fclose (f);
1767 xput1com (-1); /* EOF */
1768 snd_flush ();
1769 x = get4com ();
1770 if (x == -1)
1771 wnn_errorno = get4com ();
1772 return x;
1773 }
1774
1775 static void
xput1com(d)1776 xput1com (d)
1777 int d;
1778 {
1779 if (d == -1)
1780 {
1781 put1com (0xFF);
1782 put1com (0xFF);
1783 return; /* EOF */
1784 }
1785 put1com (d);
1786 if (d == 0xFF)
1787 {
1788 put1com (0x00);
1789 }
1790 }
1791
1792
1793 /*** Dic. Operation for Env. ***/
1794
1795 /** js_dic_add **/
1796 int
js_dic_add(env,fid,hfid,rev,jnice,rw,hrw,pw1,pw2)1797 js_dic_add (env, fid, hfid, rev, jnice, rw, hrw, pw1, pw2)
1798 struct wnn_env *env;
1799 int fid, hfid, rev, jnice, rw, hrw;
1800 char *pw1, *pw2;
1801 {
1802 register int x;
1803 if (env == 0)
1804 return (-1);
1805 set_current_js (env->js_id);
1806 handler_of_jserver_dead (-1);
1807 snd_env_head (env, JS_DIC_ADD);
1808 put4com (fid);
1809 put4com (hfid);
1810 put4com (jnice);
1811 put4com (rw);
1812 put4com (hrw);
1813 putscom (pw1);
1814 putscom (pw2);
1815 put4com (rev); /* rev is to add it as reverse dict */
1816 snd_flush ();
1817 x = get4com ();
1818 if (x == -1)
1819 wnn_errorno = get4com ();
1820 return x;
1821 }
1822
1823 /** js_dic_delete **/
1824 int
js_dic_delete(env,dicno)1825 js_dic_delete (env, dicno)
1826 struct wnn_env *env;
1827 int dicno;
1828 {
1829 register int x;
1830 if (env == 0)
1831 return (-1);
1832 set_current_js (env->js_id);
1833 handler_of_jserver_dead (-1);
1834 snd_env_head (env, JS_DIC_DELETE);
1835 put4com (dicno);
1836 snd_flush ();
1837 x = get4com ();
1838 if (x == -1)
1839 wnn_errorno = get4com ();
1840 return x;
1841 }
1842
1843 /** js_dic_use **/
1844 int
js_dic_use(env,dic_no,flag)1845 js_dic_use (env, dic_no, flag)
1846 struct wnn_env *env;
1847 int dic_no, flag;
1848 {
1849 register int x;
1850 if (env == 0)
1851 return (-1);
1852 set_current_js (env->js_id);
1853 handler_of_jserver_dead (-1);
1854 snd_env_head (env, JS_DIC_USE);
1855 put4com (dic_no);
1856 put4com (flag);
1857 snd_flush ();
1858 x = get4com ();
1859 if (x == -1)
1860 wnn_errorno = get4com ();
1861 return x;
1862 }
1863
1864 /** js_fuzokugo_set **/
1865 int
js_fuzokugo_set(env,fid)1866 js_fuzokugo_set (env, fid)
1867 struct wnn_env *env;
1868 int fid;
1869 {
1870 register int x;
1871 if (env == 0)
1872 return (-1);
1873 set_current_js (env->js_id);
1874 handler_of_jserver_dead (-1);
1875 snd_env_head (env, JS_FUZOKUGO_SET);
1876 put4com (fid);
1877 snd_flush ();
1878 x = get4com ();
1879 if (x == -1)
1880 wnn_errorno = get4com ();
1881 return x;
1882 }
1883
1884 /** js_fuzokugo_get **/
1885 int
js_fuzokugo_get(env)1886 js_fuzokugo_get (env)
1887 struct wnn_env *env;
1888 {
1889 register int x;
1890 if (env == 0)
1891 return (-1);
1892 set_current_js (env->js_id);
1893 handler_of_jserver_dead (-1);
1894 snd_env_head (env, JS_FUZOKUGO_GET);
1895 snd_flush ();
1896 x = get4com ();
1897 if (x == -1)
1898 wnn_errorno = get4com ();
1899 return x;
1900 }
1901
1902 /** js_dic_list_all **/
1903 static int rcv_dic_list ();
1904 static void get_dic_info ();
1905
1906 int
js_dic_list_all(server,ret)1907 js_dic_list_all (server, ret)
1908 WNN_JSERVER_ID *server;
1909 struct wnn_ret_buf *ret;
1910 {
1911 set_current_js (server);
1912 handler_of_jserver_dead (-1);
1913 snd_server_head (server, JS_DIC_LIST_ALL);
1914 snd_flush ();
1915 return rcv_dic_list (ret);
1916 }
1917
1918
1919 /** js_dic_list **/
1920 int
js_dic_list(env,ret)1921 js_dic_list (env, ret)
1922 struct wnn_env *env;
1923 struct wnn_ret_buf *ret;
1924 {
1925 if (env == 0)
1926 return (-1);
1927 set_current_js (env->js_id);
1928 handler_of_jserver_dead (-1);
1929 snd_env_head (env, JS_DIC_LIST);
1930 snd_flush ();
1931 return rcv_dic_list (ret);
1932 }
1933
1934 static int
rcv_dic_list(ret)1935 rcv_dic_list (ret)
1936 struct wnn_ret_buf *ret;
1937 {
1938 register int i, count;
1939 register WNN_DIC_INFO *dic;
1940 count = get4com ();
1941 re_alloc (ret, sizeof (WNN_DIC_INFO) * (count + 1));
1942
1943 dic = (WNN_DIC_INFO *) ret->buf;
1944 for (i = 0; i < count; i++)
1945 {
1946 get_dic_info (dic);
1947 dic++;
1948 }
1949 dic->dic_no = -1;
1950 return count;
1951 }
1952
1953 static void
get_dic_info(dic)1954 get_dic_info (dic)
1955 register WNN_DIC_INFO *dic;
1956 {
1957 dic->dic_no = get4com (); /* dic_No */
1958 dic->body = get4com (); /* body fid */
1959 dic->hindo = get4com (); /* hindo fid */
1960 dic->rw = get4com (); /* r/w */
1961 dic->hindo_rw = get4com (); /* hindo r/w */
1962 dic->enablef = get4com (); /* enable/disable */
1963 dic->nice = get4com (); /* nice */
1964 dic->rev = get4com ();
1965 /* added H.T */
1966 getwscom (dic->comment);
1967 getscom (dic->fname);
1968 getscom (dic->hfname);
1969 getscom (dic->passwd);
1970 getscom (dic->hpasswd);
1971 dic->type = get4com ();
1972 dic->gosuu = get4com ();
1973 dic->localf = get4com ();
1974 dic->hlocalf = get4com ();
1975 }
1976
1977 /*** Dic. Operation by dic_No. ***/
1978
1979 /** js_word_add **/
1980 int
js_word_add(env,dic_no,yomi,kanji,comment,hinshi,init_hindo)1981 js_word_add (env, dic_no, yomi, kanji, comment, hinshi, init_hindo)
1982 struct wnn_env *env;
1983 int dic_no;
1984 w_char *yomi, *kanji, *comment;
1985 int hinshi, init_hindo;
1986 {
1987 register int x;
1988 if (env == 0)
1989 return (-1);
1990 set_current_js (env->js_id);
1991 handler_of_jserver_dead (-1);
1992 snd_env_head (env, JS_WORD_ADD);
1993 put4com (dic_no);
1994 putwscom (yomi);
1995 putwscom (kanji);
1996 putwscom (comment);
1997 put4com (hinshi);
1998 put4com (init_hindo);
1999 snd_flush ();
2000 x = get4com ();
2001 if (x == -1)
2002 wnn_errorno = get4com ();
2003 return x;
2004 }
2005
2006 /** js_word_delete **/
2007 int
js_word_delete(env,dic_no,entry)2008 js_word_delete (env, dic_no, entry)
2009 struct wnn_env *env;
2010 int dic_no;
2011 int entry;
2012 {
2013 register int x;
2014 if (env == 0)
2015 return (-1);
2016 set_current_js (env->js_id);
2017 handler_of_jserver_dead (-1);
2018 snd_env_head (env, JS_WORD_DELETE);
2019 put4com (dic_no);
2020 put4com (entry);
2021 snd_flush ();
2022 x = get4com ();
2023 if (x == -1)
2024 wnn_errorno = get4com ();
2025 return x;
2026 }
2027
2028
2029 /** js_word_search **/
2030 static int rcv_word_data ();
2031
2032 int
js_word_search(env,dic_no,yomi,ret)2033 js_word_search (env, dic_no, yomi, ret)
2034 struct wnn_env *env;
2035 int dic_no;
2036 w_char *yomi;
2037 struct wnn_ret_buf *ret;
2038 {
2039 if (env == 0)
2040 return (-1);
2041 set_current_js (env->js_id);
2042 handler_of_jserver_dead (-1);
2043 snd_env_head (env, JS_WORD_SEARCH);
2044 put4com (dic_no);
2045 putwscom (yomi);
2046 snd_flush ();
2047
2048 return (rcv_word_data (ret, yomi));
2049 }
2050
2051 /** js_word_search_by_env **/
2052 int
js_word_search_by_env(env,yomi,ret)2053 js_word_search_by_env (env, yomi, ret)
2054 struct wnn_env *env;
2055 w_char *yomi;
2056 struct wnn_ret_buf *ret;
2057 {
2058 if (env == 0)
2059 return (-1);
2060 set_current_js (env->js_id);
2061 handler_of_jserver_dead (-1);
2062 snd_env_head (env, JS_WORD_SEARCH_BY_ENV);
2063 putwscom (yomi);
2064 snd_flush ();
2065
2066 return (rcv_word_data (ret, yomi));
2067 }
2068
2069 /** js_word_info **/
2070 int
js_word_info(env,dic_no,entry,ret)2071 js_word_info (env, dic_no, entry, ret)
2072 struct wnn_env *env;
2073 int dic_no, entry;
2074 struct wnn_ret_buf *ret;
2075 {
2076 register int x;
2077 w_char yomi[LENGTHYOMI];
2078
2079 if (env == 0)
2080 return (-1);
2081 set_current_js (env->js_id);
2082 handler_of_jserver_dead (-1);
2083 snd_env_head (env, JS_WORD_INFO);
2084 put4com (dic_no);
2085 put4com (entry);
2086 snd_flush ();
2087 x = get4com ();
2088 if (x == -1)
2089 {
2090 wnn_errorno = get4com ();
2091 return (-1);
2092 }
2093 getwscom (yomi);
2094 rcv_word_data (ret, yomi);
2095 return (0);
2096 }
2097
2098 int
js_word_comment_set(env,dic_no,entry,comment)2099 js_word_comment_set (env, dic_no, entry, comment)
2100 struct wnn_env *env;
2101 int dic_no, entry;
2102 w_char *comment;
2103 {
2104 register int x;
2105 if (env == 0)
2106 return (-1);
2107 set_current_js (env->js_id);
2108 handler_of_jserver_dead (-1);
2109 snd_env_head (env, JS_WORD_COMMENT_SET);
2110 put4com (dic_no);
2111 put4com (entry);
2112 putwscom (comment);
2113 snd_flush ();
2114 x = get4com ();
2115 if (x == -1)
2116 {
2117 wnn_errorno = get4com ();
2118 return (-1);
2119 }
2120 return (0);
2121 }
2122
2123 /** rcv for word_search **/
2124 static int
rcv_word_data(ret,yomi)2125 rcv_word_data (ret, yomi)
2126 struct wnn_ret_buf *ret;
2127 w_char *yomi; /* Yomi is not sent from server
2128 * (at least for the time being).
2129 */
2130 {
2131 register int x, j_c, k_c;
2132 w_char *k;
2133 register struct wnn_jdata *jd;
2134 register int cnt;
2135
2136 j_c = get4com ();
2137 k_c = get4com ();
2138 re_alloc (ret, sizeof (struct wnn_jdata) * (j_c + 1) + sizeof (w_char) * (k_c + j_c * 3 + j_c * wnn_Strlen (yomi)));
2139 jd = (struct wnn_jdata *) ret->buf;
2140 for (cnt = 0;; cnt++)
2141 {
2142 jd->dic_no = x = get4com ();
2143 if (x == -1)
2144 break;
2145 jd->serial = get4com ();
2146 jd->hinshi = get4com ();
2147 jd->hindo = get4com ();
2148 jd->ima = get4com ();
2149 jd->int_hindo = get4com ();
2150 jd->int_ima = get4com ();
2151 jd++;
2152 }
2153 jd++;
2154 k = (w_char *) jd;
2155 jd = (struct wnn_jdata *) ret->buf;
2156 for (;;)
2157 {
2158 if (jd->dic_no == -1)
2159 break;
2160
2161 jd->yomi = k; /* Copy Yomi */
2162 wnn_Strcpy (k, yomi);
2163 k += wnn_Strlen (k) + 1;
2164
2165 jd->kanji = k; /* Get Kanji */
2166 getwscom (k);
2167 k += wnn_Strlen (k) + 1;
2168
2169 jd->com = k; /* Get Comment */
2170 getwscom (k);
2171 k += wnn_Strlen (k) + 1;
2172 jd++;
2173 }
2174 return cnt;
2175 }
2176
2177
2178 /** js_dic_info **/
2179 int
js_dic_info(env,dic_no,ret)2180 js_dic_info (env, dic_no, ret)
2181 struct wnn_env *env;
2182 int dic_no;
2183 register WNN_DIC_INFO *ret;
2184 {
2185 register int x;
2186 if (env == 0)
2187 return (-1);
2188 set_current_js (env->js_id);
2189 handler_of_jserver_dead (-1);
2190 snd_env_head (env, JS_DIC_INFO);
2191 put4com (dic_no);
2192 snd_flush ();
2193 x = get4com ();
2194 if (x == -1)
2195 {
2196 return get4com ();
2197 }
2198 get_dic_info (ret);
2199 return dic_no;
2200 }
2201
2202
2203 /** js_who **/
2204 int
js_who(server,ret)2205 js_who (server, ret)
2206 WNN_JSERVER_ID *server;
2207 struct wnn_ret_buf *ret;
2208 {
2209 register int i, j, c;
2210 WNN_JWHO *w;
2211 set_current_js (server);
2212 handler_of_jserver_dead (-1);
2213 snd_server_head (server, JS_WHO);
2214 snd_flush ();
2215
2216 c = get4com ();
2217 if (c == -1)
2218 {
2219 wnn_errorno = get4com ();
2220 return -1;
2221 }
2222
2223 re_alloc (ret, sizeof (WNN_JWHO) * c);
2224 w = (WNN_JWHO *) ret->buf;
2225 for (i = 0; i < c; i++)
2226 {
2227 w->sd = get4com ();
2228 getscom (w->user_name);
2229 getscom (w->host_name);
2230 for (j = 0; j < WNN_MAX_ENV_OF_A_CLIENT; j++)
2231 {
2232 (w->env)[j] = get4com ();
2233 }
2234 w++;
2235 }
2236 return (c);
2237 }
2238
2239 /** jserver ������ƤδĶ��˴ؤ����������롣
2240 (���鵻)
2241 **/
2242 int
js_env_list(server,ret)2243 js_env_list (server, ret)
2244 WNN_JSERVER_ID *server;
2245 struct wnn_ret_buf *ret;
2246 {
2247 register int i, j, c;
2248 WNN_ENV_INFO *w;
2249 set_current_js (server);
2250 handler_of_jserver_dead (-1);
2251 snd_server_head (server, JS_ENV_LIST);
2252 snd_flush ();
2253
2254 c = get4com ();
2255 if (c == -1)
2256 {
2257 wnn_errorno = get4com ();
2258 return -1;
2259 }
2260
2261 re_alloc (ret, sizeof (WNN_ENV_INFO) * c);
2262 w = (WNN_ENV_INFO *) ret->buf;
2263 for (i = 0; i < c; i++)
2264 {
2265 w->env_id = get4com ();
2266 getscom (w->env_name);
2267 w->ref_count = get4com ();
2268 w->fzk_fid = get4com ();
2269 w->jishomax = get4com ();
2270 for (j = 0; j < WNN_MAX_JISHO_OF_AN_ENV; j++)
2271 {
2272 (w->jisho)[j] = get4com ();
2273 }
2274 for (j = 0; j < WNN_MAX_FILE_OF_AN_ENV; j++)
2275 {
2276 (w->file)[j] = get4com ();
2277 }
2278 w++;
2279 }
2280 return (c);
2281 }
2282
2283 /****
2284
2285 ****/
2286 int
js_hindo_set(env,dic,entry,ima,hindo)2287 js_hindo_set (env, dic, entry, ima, hindo)
2288 struct wnn_env *env;
2289 int dic, entry, ima, hindo;
2290 {
2291 register int x;
2292 if (env == 0)
2293 return (-1);
2294 set_current_js (env->js_id);
2295 handler_of_jserver_dead (-1);
2296 snd_env_head (env, JS_HINDO_SET);
2297
2298 put4com (dic);
2299 put4com (entry);
2300 put4com (ima);
2301 put4com (hindo);
2302 snd_flush ();
2303 if ((x = get4com ()) == -1)
2304 {
2305 wnn_errorno = get4com ();
2306 return -1;
2307 }
2308 return x;
2309 }
2310
2311
2312 /****
2313 Henkan
2314 ****/
2315
2316 static void
put_fzk_vec(hinsi,fzk,vec,vec1)2317 put_fzk_vec (hinsi, fzk, vec, vec1)
2318 int hinsi;
2319 w_char *fzk;
2320 int vec;
2321 int vec1;
2322 {
2323 put4com (hinsi);
2324 putwscom (fzk);
2325 put4com (vec);
2326 put4com (vec1);
2327 }
2328
2329 /**
2330 kanren
2331 **/
2332 static int rcv_dai ();
2333 static void rcv_sho_x ();
2334 static void rcv_sho_kanji ();
2335
2336 int
js_kanren(env,yomi,hinsi,fzk,vec,vec1,vec2,rb)2337 js_kanren (env, yomi, hinsi, fzk, vec, vec1, vec2, rb)
2338 struct wnn_env *env;
2339 w_char *yomi;
2340 int hinsi;
2341 w_char *fzk;
2342 int vec;
2343 int vec1;
2344 int vec2;
2345 struct wnn_ret_buf *rb;
2346 {
2347 if (env == 0)
2348 return (-1);
2349 set_current_js (env->js_id);
2350 handler_of_jserver_dead (-1);
2351
2352 snd_env_head (env, JS_KANREN);
2353 putwscom (yomi);
2354 put_fzk_vec (hinsi, fzk, vec, vec1);
2355 put4com (vec2);
2356 snd_flush ();
2357 return rcv_dai (rb);
2358 }
2359
2360 /* rcv dai */
2361 static int
rcv_dai(ret)2362 rcv_dai (ret)
2363 struct wnn_ret_buf *ret;
2364 {
2365 int dai_cnt, sho_sum, kanji_sum, d_size, s_size, k_size, x;
2366 register int i;
2367 struct wnn_dai_bunsetsu *dai_list;
2368 register struct wnn_dai_bunsetsu *dp;
2369 struct wnn_sho_bunsetsu *sho_list;
2370 register struct wnn_sho_bunsetsu *sp;
2371 w_char *kanji, *kp;
2372
2373 dai_cnt = get4com ();
2374 if (dai_cnt == -1)
2375 { /* error dayo */
2376 wnn_errorno = get4com ();
2377 return -1;
2378 }
2379 sho_sum = get4com ();
2380 kanji_sum = get4com ();
2381
2382 d_size = sizeof (struct wnn_dai_bunsetsu) * dai_cnt;
2383 s_size = sizeof (struct wnn_sho_bunsetsu) * sho_sum;
2384 k_size = sizeof (w_char) * kanji_sum;
2385
2386 /* re_alloc(ret, d_size+s_size+k_size); Seems This cause Bug?? H.T.*/
2387 re_alloc (ret, d_size + s_size + k_size);
2388
2389 dai_list = (struct wnn_dai_bunsetsu *) ret->buf;
2390 sho_list = (struct wnn_sho_bunsetsu *) ((char *) ret->buf + d_size);
2391 kanji = (w_char *) ((char *) ret->buf + d_size + s_size);
2392
2393 for (dp = dai_list, i = 0; i < dai_cnt; i++)
2394 {
2395 dp->end = get4com ();
2396 dp->start = get4com ();
2397 dp->sbncnt = get4com ();
2398 dp->hyoka = get4com ();
2399 dp++;
2400 }
2401
2402 for (dp = dai_list, sp = sho_list, i = 0; i < dai_cnt; i++)
2403 {
2404 dp->sbn = sp;
2405 x = dp->sbncnt;
2406 rcv_sho_x (sp, x);
2407 sp += x;
2408 dp++;
2409 }
2410
2411 for (dp = dai_list, kp = kanji, i = 0; i < dai_cnt; i++)
2412 {
2413 rcv_sho_kanji (dp->sbn, dp->sbncnt, &kp);
2414 dp++;
2415 }
2416 return dai_cnt;
2417 }
2418
2419 /* rcv sho routines */
2420 static void
rcv_sho_x(sho_list,sho_cnt)2421 rcv_sho_x (sho_list, sho_cnt)
2422 register struct wnn_sho_bunsetsu *sho_list;
2423 int sho_cnt;
2424 {
2425 register int i;
2426 for (i = 0; i < sho_cnt; i++)
2427 {
2428 sho_list->end = get4com ();
2429 sho_list->start = get4com ();
2430 sho_list->jiriend = get4com ();
2431 sho_list->dic_no = get4com ();
2432 sho_list->entry = get4com ();
2433 sho_list->hindo = get4com ();
2434 sho_list->ima = get4com ();
2435 sho_list->hinsi = get4com ();
2436 sho_list->status = get4com ();
2437 sho_list->status_bkwd = get4com ();
2438 sho_list->kangovect = get4com ();
2439 sho_list->hyoka = get4com ();
2440 sho_list++;
2441 }
2442 }
2443
2444 static void
rcv_sho_kanji(sho_list,sho_cnt,kanji)2445 rcv_sho_kanji (sho_list, sho_cnt, kanji)
2446 struct wnn_sho_bunsetsu *sho_list;
2447 int sho_cnt;
2448 w_char **kanji;
2449 {
2450 register w_char *k;
2451 register int i, x;
2452 k = *kanji;
2453 for (i = 0; i < sho_cnt; i++)
2454 {
2455 sho_list->kanji = k;
2456 getwscom (k);
2457 x = wnn_Strlen (k);
2458 k += x + 1;
2459
2460 sho_list->yomi = k;
2461 getwscom (k);
2462 x = wnn_Strlen (k);
2463 k += x + 1;
2464
2465 sho_list->fuzoku = k;
2466 getwscom (k);
2467 x = wnn_Strlen (k);
2468 k += x + 1;
2469 sho_list++;
2470 }
2471 *kanji = k;
2472 }
2473
2474
2475 static int
rcv_sho(ret)2476 rcv_sho (ret)
2477 struct wnn_ret_buf *ret;
2478 {
2479 register int sho_sum, kanji_sum, s_size, k_size;
2480 struct wnn_sho_bunsetsu *sho_list;
2481 w_char *kanji, *kp;
2482
2483 sho_sum = get4com ();
2484 if (sho_sum == -1)
2485 { /* error dayo */
2486 wnn_errorno = get4com ();
2487 return -1;
2488 }
2489 kanji_sum = get4com ();
2490
2491 s_size = sizeof (struct wnn_sho_bunsetsu) * sho_sum;
2492 k_size = sizeof (w_char) * kanji_sum;
2493
2494 re_alloc (ret, s_size + k_size);
2495
2496 sho_list = (struct wnn_sho_bunsetsu *) ((char *) ret->buf);
2497 kanji = (w_char *) ((char *) ret->buf + s_size);
2498
2499 rcv_sho_x (sho_list, sho_sum);
2500 kp = kanji;
2501 rcv_sho_kanji (sho_list, sho_sum, &kp);
2502 return sho_sum;
2503 }
2504
2505 /**
2506 kantan
2507 **/
2508 int
js_kantan_dai(env,yomi,hinsi,fzk,vec,vec1,rb)2509 js_kantan_dai (env, yomi, hinsi, fzk, vec, vec1, rb)
2510 struct wnn_env *env;
2511 w_char *yomi;
2512 int hinsi;
2513 w_char *fzk;
2514 int vec;
2515 int vec1;
2516 struct wnn_ret_buf *rb;
2517 {
2518 if (env == 0)
2519 return (-1);
2520 set_current_js (env->js_id);
2521 handler_of_jserver_dead (-1);
2522
2523 snd_env_head (env, JS_KANTAN_DAI);
2524 putwscom (yomi);
2525 put_fzk_vec (hinsi, fzk, vec, vec1);
2526 snd_flush ();
2527
2528 return rcv_dai (rb);
2529 }
2530
2531 int
js_kantan_sho(env,yomi,hinsi,fzk,vec,vec1,rb)2532 js_kantan_sho (env, yomi, hinsi, fzk, vec, vec1, rb)
2533 struct wnn_env *env;
2534 w_char *yomi;
2535 int hinsi;
2536 w_char *fzk;
2537 int vec;
2538 int vec1;
2539 struct wnn_ret_buf *rb;
2540 {
2541 int sbncnt;
2542 if (env == 0)
2543 return (-1);
2544 set_current_js (env->js_id);
2545 handler_of_jserver_dead (-1);
2546
2547 snd_env_head (env, JS_KANTAN_SHO);
2548 putwscom (yomi);
2549 put_fzk_vec (hinsi, fzk, vec, vec1);
2550 snd_flush ();
2551
2552 sbncnt = rcv_sho (rb);
2553 return sbncnt;
2554 }
2555
2556 /**
2557 kanzen
2558 **/
2559 int
js_kanzen_dai(env,yomi,hinsi,fzk,vec,vec1,rb)2560 js_kanzen_dai (env, yomi, hinsi, fzk, vec, vec1, rb)
2561 struct wnn_env *env;
2562 w_char *yomi;
2563 int hinsi;
2564 w_char *fzk;
2565 int vec;
2566 int vec1;
2567 struct wnn_ret_buf *rb;
2568 {
2569 if (env == 0)
2570 return (-1);
2571 set_current_js (env->js_id);
2572 handler_of_jserver_dead (-1);
2573 snd_env_head (env, JS_KANZEN_DAI);
2574 putwscom (yomi);
2575 put_fzk_vec (hinsi, fzk, vec, vec1);
2576 snd_flush ();
2577
2578 return rcv_dai (rb);
2579 }
2580
2581
2582 int
js_kanzen_sho(env,yomi,hinsi,fzk,vec,vec1,rb)2583 js_kanzen_sho (env, yomi, hinsi, fzk, vec, vec1, rb)
2584 struct wnn_env *env;
2585 w_char *yomi;
2586 int hinsi;
2587 w_char *fzk;
2588 int vec;
2589 int vec1;
2590 struct wnn_ret_buf *rb;
2591 {
2592 int sbncnt;
2593 if (env == 0)
2594 return (-1);
2595 set_current_js (env->js_id);
2596 handler_of_jserver_dead (-1);
2597 snd_env_head (env, JS_KANZEN_SHO);
2598 putwscom (yomi);
2599 put_fzk_vec (hinsi, fzk, vec, vec1);
2600 snd_flush ();
2601
2602 sbncnt = rcv_sho (rb);
2603 return sbncnt;
2604 }
2605
2606 /** js_version **/
2607 int
js_version(server,serv,libv)2608 js_version (server, serv, libv)
2609 int *serv, *libv;
2610 WNN_JSERVER_ID *server;
2611 {
2612 set_current_js (server);
2613 handler_of_jserver_dead (-1);
2614 snd_server_head (server, JS_VERSION);
2615 snd_flush ();
2616 *libv = JLIB_VERSION;
2617 return *serv = get4com ();
2618 }
2619
2620 static void
re_alloc(ret,size)2621 re_alloc (ret, size)
2622 register struct wnn_ret_buf *ret;
2623 int size;
2624 {
2625 if (ret->size < size)
2626 {
2627 if (ret->buf)
2628 free ((char *) ret->buf);
2629 ret->buf = malloc (size);
2630 ret->size = size;
2631 }
2632 }
2633
2634
2635 int
js_kill(server)2636 js_kill (server)
2637 WNN_JSERVER_ID *server;
2638 {
2639 int x;
2640 set_current_js (server);
2641 handler_of_jserver_dead (-1);
2642 snd_server_head (server, JS_KILL);
2643 snd_flush ();
2644 x = get4com ();
2645 return (x);
2646 }
2647
2648
2649 int
js_file_remove(server,n,pwd)2650 js_file_remove (server, n, pwd)
2651 WNN_JSERVER_ID *server;
2652 char *n, *pwd;
2653 {
2654 register int x;
2655 set_current_js (server);
2656 handler_of_jserver_dead (-1);
2657 snd_server_head (server, JS_FILE_REMOVE);
2658 putscom (n);
2659 putscom (pwd);
2660 snd_flush ();
2661 if ((x = get4com ()) == -1)
2662 {
2663 wnn_errorno = get4com ();
2664 return -1;
2665 }
2666 return (x);
2667 }
2668
2669 int
js_file_remove_client(server,n,pwd)2670 js_file_remove_client (server, n, pwd)
2671 WNN_JSERVER_ID *server;
2672 char *n, *pwd;
2673 {
2674 struct wnn_file_head fh;
2675 register FILE *fp;
2676 set_current_js (server);
2677 handler_of_jserver_dead (-1);
2678 if (js_file_loaded_local (server, n) != -1)
2679 {
2680 wnn_errorno = WNN_FILE_IN_USE;
2681 return (-1);
2682 }
2683 #ifdef WRITE_CHECK
2684 check_backup (n);
2685 #endif /* WRITE_CHECK */
2686 if ((fp = fopen (n, "r")) == NULL)
2687 {
2688 wnn_errorno = WNN_FILE_READ_ERROR;
2689 return (-1);
2690 }
2691 if (input_file_header (fp, &fh) == -1)
2692 {
2693 fclose (fp);
2694 wnn_errorno = WNN_NOT_A_FILE;
2695 return (-1);
2696 }
2697 fclose (fp);
2698 if (!check_pwd (pwd, fh.file_passwd))
2699 {
2700 wnn_errorno = WNN_INCORRECT_PASSWD;
2701 return (-1);
2702 }
2703 if (unlink (n) == -1)
2704 {
2705 wnn_errorno = WNN_UNLINK;
2706 return (-1);
2707 }
2708 return (0);
2709 }
2710
2711 /** js_dic_file_create_client **/
2712 int
js_dic_file_create_client(env,fn,type,com,passwd,hpasswd)2713 js_dic_file_create_client (env, fn, type, com, passwd, hpasswd)
2714 struct wnn_env *env;
2715 int type;
2716 char *fn;
2717 w_char *com;
2718 char *passwd, *hpasswd;
2719 {
2720 int x;
2721 if (type != WNN_REV_DICT && type != CWNN_REV_DICT && type != BWNN_REV_DICT && type != WNN_UD_DICT)
2722 {
2723 wnn_errorno = WNN_NOT_A_UD;
2724 return (-1);
2725 }
2726 x = create_null_dic (fn, com, passwd, hpasswd, type);
2727 if (x == -1)
2728 {
2729 wnn_errorno = WNN_FILE_CREATE_ERROR;
2730 return (-1);
2731 }
2732 return (0);
2733 }
2734
2735
2736 /** js_hindo_file_create_client **/
2737 int
js_hindo_file_create_client(env,fid,fn,com,hpasswd)2738 js_hindo_file_create_client (env, fid, fn, com, hpasswd)
2739 struct wnn_env *env;
2740 int fid;
2741 char *fn;
2742 w_char *com;
2743 char *hpasswd;
2744 {
2745 register int x;
2746 struct wnn_file_uniq funiq;
2747 int serial;
2748 register int i;
2749
2750 if (env == 0)
2751 return (-1);
2752 set_current_js (env->js_id);
2753 handler_of_jserver_dead (-1);
2754 snd_env_head (env, JS_HINDO_FILE_CREATE_CLIENT);
2755 put4com (fid);
2756 snd_flush ();
2757 x = get4com ();
2758 if (x == -1)
2759 {
2760 wnn_errorno = get4com ();
2761 return (-1);
2762 }
2763 serial = get4com ();
2764 funiq.time = get4com ();
2765 funiq.dev = get4com ();
2766 funiq.inode = get4com ();
2767 for (i = 0; i < WNN_HOSTLEN; i++)
2768 {
2769 funiq.createhost[i] = get1com ();
2770 }
2771 /* getscom(funiq.createhost); */
2772 if (create_hindo_file (&funiq, fn, com, hpasswd, serial) == -1)
2773 {
2774 wnn_errorno = WNN_FILE_CREATE_ERROR;
2775 return (-1);
2776 }
2777 return (0);
2778 }
2779
2780 int
js_file_comment_set(env,fid,comment)2781 js_file_comment_set (env, fid, comment)
2782 struct wnn_env *env;
2783 int fid;
2784 w_char *comment;
2785 {
2786 register int x;
2787 if (env == 0)
2788 return (-1);
2789 set_current_js (env->js_id);
2790 handler_of_jserver_dead (-1);
2791 snd_env_head (env, JS_FILE_COMMENT_SET);
2792 put4com (fid);
2793 putwscom (comment);
2794 snd_flush ();
2795 x = get4com ();
2796 if (x == -1)
2797 {
2798 wnn_errorno = get4com ();
2799 return (-1);
2800 }
2801 return (0);
2802 }
2803
2804
2805 /*
2806 * Hinsi Primitives
2807 */
2808
2809 int
js_hinsi_name(server,no,rb)2810 js_hinsi_name (server, no, rb)
2811 WNN_JSERVER_ID *server;
2812 int no;
2813 struct wnn_ret_buf *rb;
2814 {
2815 register int size;
2816
2817 set_current_js (server);
2818 handler_of_jserver_dead (-1);
2819 snd_server_head (server, JS_HINSI_NAME);
2820 put4com (no);
2821 snd_flush ();
2822 if ((size = get4com ()) == -1)
2823 {
2824 wnn_errorno = get4com ();
2825 return (-1);
2826 }
2827 re_alloc (rb, sizeof (w_char) * (size + 1));
2828 getwscom ((w_char *) rb->buf);
2829 return (0);
2830 }
2831
2832
2833 int
js_hinsi_number(server,name)2834 js_hinsi_number (server, name)
2835 WNN_JSERVER_ID *server;
2836 w_char *name;
2837 {
2838 register int no;
2839
2840 set_current_js (server);
2841 handler_of_jserver_dead (-1);
2842 snd_server_head (server, JS_HINSI_NUMBER);
2843 putwscom (name);
2844 snd_flush ();
2845 if ((no = get4com ()) == -1)
2846 {
2847 wnn_errorno = get4com ();
2848 return (-1);
2849 }
2850 return (no);
2851 }
2852
2853
2854 int
js_hinsi_list(env,dic_no,name,rb)2855 js_hinsi_list (env, dic_no, name, rb)
2856 struct wnn_env *env;
2857 int dic_no;
2858 w_char *name;
2859 struct wnn_ret_buf *rb;
2860 {
2861 int size;
2862 int count;
2863 register w_char *s;
2864 register w_char **r;
2865 register int k;
2866
2867 if (env == 0)
2868 return (-1);
2869 set_current_js (env->js_id);
2870 handler_of_jserver_dead (-1);
2871 snd_env_head (env, JS_HINSI_LIST);
2872 put4com (dic_no);
2873 putwscom (name);
2874 snd_flush ();
2875 if ((count = get4com ()) == -1)
2876 {
2877 wnn_errorno = get4com ();
2878 return (-1);
2879 }
2880 size = get4com ();
2881 re_alloc (rb, sizeof (w_char) * (size + 1) + count * sizeof (w_char *));
2882 r = (w_char **) rb->buf;
2883 s = (w_char *) ((w_char **) rb->buf + count);
2884 for (k = 0; k < count; k++)
2885 {
2886 *r++ = s;
2887 getwscom (s);
2888 s += wnn_Strlen (s) + 1;
2889 }
2890 return (count);
2891 }
2892
2893
2894 int
js_hinsi_dicts(env,no,rb)2895 js_hinsi_dicts (env, no, rb)
2896 struct wnn_env *env;
2897 int no;
2898 struct wnn_ret_buf *rb;
2899 {
2900 register int k, count;
2901 int *p;
2902
2903 if (env == 0)
2904 return (-1);
2905 set_current_js (env->js_id);
2906 handler_of_jserver_dead (-1);
2907 snd_env_head (env, JS_HINSI_DICTS);
2908 put4com (no);
2909 snd_flush ();
2910 if ((count = get4com ()) == -1)
2911 {
2912 wnn_errorno = get4com ();
2913 return (-1);
2914 }
2915 re_alloc (rb, sizeof (int) * (count + 1));
2916 p = (int *) rb->buf;
2917
2918 for (k = 0; k < count; k++)
2919 {
2920 *p++ = get4com ();
2921 }
2922 return (count);
2923 }
2924
2925
2926 char *wnn_dic_types[] = { "", "����", "��Ͽ", "�հ�", "����" };
2927
2928 char *cwnn_dic_types[] = { "", "�̶�", "��¼", "ƴ��", "����" };
2929 char *bwnn_dic_types[] = { "", "�̶�", "��¼", "����", "����" };
2930
2931 char *kwnn_dic_types[] = { "", "����", "���", "����", "����" };
2932 /* ͳ�� ���� ��� ��Ю */
2933
2934 /* New primitives 9/8 */
2935
2936 int
js_file_password_set(env,fid,which,old,new)2937 js_file_password_set (env, fid, which, old, new)
2938 struct wnn_env *env;
2939 int fid;
2940 int which; /* 1 for dic, 2 for hindo 3(0) for both */
2941 char *old, *new;
2942 {
2943 register int x;
2944 if (env == 0)
2945 return (-1);
2946 set_current_js (env->js_id);
2947 handler_of_jserver_dead (-1);
2948 snd_env_head (env, JS_FILE_PASSWORD_SET);
2949 put4com (fid);
2950 put4com (which);
2951 putscom (old);
2952 putscom (new);
2953 snd_flush ();
2954 x = get4com ();
2955 if (x == -1)
2956 {
2957 wnn_errorno = get4com ();
2958 return (-1);
2959 }
2960 return (0);
2961 }
2962
2963 int
js_hinsi_table_set(env,dic_no,hinsi_table)2964 js_hinsi_table_set (env, dic_no, hinsi_table)
2965 struct wnn_env *env;
2966 int dic_no;
2967 w_char *hinsi_table;
2968 {
2969 int x;
2970 if (env == 0)
2971 return (-1);
2972 set_current_js (env->js_id);
2973 handler_of_jserver_dead (-1);
2974 snd_env_head (env, JS_HINSI_TABLE_SET);
2975 put4com (dic_no);
2976 putwscom (hinsi_table);
2977 snd_flush ();
2978 x = get4com ();
2979 if (x == -1)
2980 {
2981 wnn_errorno = get4com ();
2982 return (-1);
2983 }
2984 return (0);
2985 }
2986
2987 #define SERVERDEFS_FILE "/serverdefs"
2988
2989 #define MACHINE_NAME 1
2990 #define UNIXDOMAIN_NAME 2
2991 #define SERVICE_NAME 3
2992 #define SERVICE_PORT_NUM 4
2993
2994 static char *
get_serv_defs(lang,cnt)2995 get_serv_defs (lang, cnt)
2996 char *lang;
2997 int cnt;
2998 {
2999 FILE *fp;
3000 static char s[7][EXPAND_PATH_LENGTH];
3001 char serv_defs[EXPAND_PATH_LENGTH];
3002 char data[1024];
3003 int num;
3004
3005 strcpy (serv_defs, LIBDIR);
3006 strcat (serv_defs, SERVERDEFS_FILE);
3007 if ((fp = fopen (serv_defs, "r")) == NULL)
3008 {
3009 return (NULL);
3010 }
3011 while (fgets (data, 1024, fp) != NULL)
3012 {
3013 num = sscanf (data, "%s %s %s %s %s %s %s", s[0], s[1], s[2], s[3], s[4], s[5], s[6]);
3014 if ((num < 4) || s[0][0] == ';')
3015 {
3016 continue;
3017 }
3018 if (!strncmp (lang, s[0], strlen (s[0])))
3019 {
3020 fclose (fp);
3021 if (cnt == SERVICE_PORT_NUM && num < 5)
3022 return (NULL);
3023 if (strlen (s[cnt]) == strlen ("NULL") && !strcmp (s[cnt], "NULL"))
3024 {
3025 return (NULL);
3026 }
3027 else
3028 {
3029 return (s[cnt]);
3030 }
3031 }
3032 }
3033 fclose (fp);
3034 return (NULL);
3035 }
3036
3037 char *
_wnn_get_machine_of_serv_defs(char * lang)3038 _wnn_get_machine_of_serv_defs(char *lang)
3039 {
3040 return (get_serv_defs (lang, MACHINE_NAME));
3041 }
3042
3043 static char *
get_unixdomain_of_serv_defs(char * lang)3044 get_unixdomain_of_serv_defs(char *lang)
3045 {
3046 return (get_serv_defs (lang, UNIXDOMAIN_NAME));
3047 }
3048
3049 static char *
get_service_of_serv_defs(char * lang)3050 get_service_of_serv_defs(char *lang)
3051 {
3052 return (get_serv_defs (lang, SERVICE_NAME));
3053 }
3054
3055 static int
get_port_num_of_serv_defs(char * lang)3056 get_port_num_of_serv_defs(char *lang)
3057 {
3058 char *port_char;
3059
3060 if ((port_char = get_serv_defs (lang, SERVICE_PORT_NUM)) == NULL)
3061 {
3062 return (-1);
3063 }
3064 else
3065 {
3066 return (atoi (port_char));
3067 }
3068 }
3069