diff options
Diffstat (limited to 'japanese/FreeWnn-lib/files/patch-Wnn-jlib-js.c')
-rw-r--r-- | japanese/FreeWnn-lib/files/patch-Wnn-jlib-js.c | 1126 |
1 files changed, 1003 insertions, 123 deletions
diff --git a/japanese/FreeWnn-lib/files/patch-Wnn-jlib-js.c b/japanese/FreeWnn-lib/files/patch-Wnn-jlib-js.c index 681038ceaeeb..d6bf4c787f04 100644 --- a/japanese/FreeWnn-lib/files/patch-Wnn-jlib-js.c +++ b/japanese/FreeWnn-lib/files/patch-Wnn-jlib-js.c @@ -2,12 +2,25 @@ Index: Wnn/jlib/js.c =================================================================== RCS file: /home/cvs/private/hrs/freewnn/Wnn/jlib/js.c,v retrieving revision 1.1.1.1 -retrieving revision 1.2 -diff -d -u -I\$FreeBSD$ -w -r1.1.1.1 -r1.2 +retrieving revision 1.3 +diff -u -p -r1.1.1.1 -r1.3 --- Wnn/jlib/js.c 20 Dec 2008 07:13:30 -0000 1.1.1.1 -+++ Wnn/jlib/js.c 2 Jan 2009 21:55:55 -0000 1.2 -@@ -132,9 +132,7 @@ ++++ Wnn/jlib/js.c 2 Jan 2010 11:51:21 -0000 1.3 +@@ -110,8 +110,7 @@ static WNN_JSERVER_ID *current_js = NULL + + /* Packet Buffers */ + static unsigned char snd_buf[S_BUF_SIZ]; /** 送信 **/ +-static int sbp = 0; /** 送信バッファーポインター **/ +-static int rbc = -1; /** 受信バッファーポインター **/ ++static unsigned char *sbp = snd_buf; + + #if defined(EAGAIN) + # if defined(EWOULDBLOCK) +@@ -130,11 +129,10 @@ static int rbc = -1; + static void connect_timeout (); + static int _get_server_name (); static int writen (); ++static int rcv_flush(); static char *get_unixdomain_of_serv_defs (), *get_service_of_serv_defs (); static int get_port_num_of_serv_defs (); -#if DEBUG @@ -16,35 +29,132 @@ diff -d -u -I\$FreeBSD$ -w -r1.1.1.1 -r1.2 /********* V4 *****************/ /*** -@@ -248,145 +246,107 @@ - register int timeout; +@@ -192,471 +190,506 @@ daemon_dead () + (cdというのはコミュニケーションデバイスの名残) + **/ + static int +-cd_open_un (lang) +- register char *lang; ++cd_open_un(const char *lang) { - int sd; --#ifdef INET6 +-#ifdef AF_UNIX +- int sd; +- struct sockaddr_un saddr; /** ソケット **/ +- char *sock_name = NULL; +- saddr.sun_family = AF_UNIX; +- +- /* find socket name from table by lang */ +- if (lang && *lang) +- { +- if ((sock_name = get_unixdomain_of_serv_defs (lang)) == NULL) +- { +- sock_name = sockname; +- } +- } +- else +- { +- sock_name = sockname; /* Jserver */ +- } +- strcpy (saddr.sun_path, sock_name); ++#if !defined(AF_UNIX) ++ return -1; ++#else ++ int sd; ++ struct sockaddr_un saddr; ++ char *sock_name = NULL; ++ saddr.sun_family = AF_UNIX; + - struct addrinfo hints, *res, *res0; -+ struct sockaddr sa; -+ char sbuf[NI_MAXSERV]; ++ /* find socket name from table by lang */ ++ if (lang && *lang) { ++ if ((sock_name = get_unixdomain_of_serv_defs(lang)) == NULL) ++ sock_name = sockname; ++ } else ++ sock_name = sockname; /* Jserver */ ++ strcpy (saddr.sun_path, sock_name); + +- if ((sd = socket (AF_UNIX, SOCK_STREAM, 0)) == ERROR) +- { ++ if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) == ERROR) { + #if DEBUG +- xerror ("jslib:Can't create unix domain socket.\n"); +-#endif +- return -1; +- } ++ xerror ("jslib:Can't create unix domain socket.\n"); ++#endif /* DEBUG */ ++ return -1; ++ } + + #if !defined(SUN_LEN) + # define SUN_LEN(su) (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) +-#endif +- if (connect (sd, (struct sockaddr *) &saddr, SUN_LEN (&saddr)) == ERROR) +- { +- ++#endif /* !defined(SUN_LEN) */ ++ if (connect(sd, (struct sockaddr *)&saddr, SUN_LEN(&saddr)) == ERROR) { + #if DEBUG +- xerror ("jslib:Can't connect unix domain socket.\n"); +-#endif +- close (sd); +- return -1; +- } +- return sd; +-#else +- return -1; ++ xerror ("jslib:Can't connect unix domain socket.\n"); ++#endif /* DEBUG */ ++ close (sd); ++ return -1; ++ } + - int error; ++ return sd; + #endif + } + + static int +-cd_open_in (server, lang, timeout) +- register char *server; +- register char *lang; +- register int timeout; +-{ +- int sd; +-#ifdef INET6 +- struct addrinfo hints, *res, *res0; +- int error; - char sport[6]; -#else - struct sockaddr_in saddr_in; /** ソケット **/ - register struct hostent *hp; -#endif -+ - struct servent *sp = NULL; - int serverNO, port_num; - int ret; +- struct servent *sp = NULL; +- int serverNO, port_num; +- int ret; - char pserver[64]; - char sserver[64]; +- char *serv_name = NULL; +- +- serverNO = _get_server_name (server, pserver); ++cd_open_in(const char *server, ++ const char *lang, ++ const int timeout) ++{ ++ int sd; ++ ++ struct addrinfo hints, *res, *res0; ++ struct sockaddr sa; ++ char sbuf[NI_MAXSERV]; ++ ++ int error; ++ ++ struct servent *sp = NULL; ++ int serverNO, port_num; ++ int ret; + char pserver[NI_MAXHOST]; + char sserver[NI_MAXHOST]; - char *serv_name = NULL; ++ char *serv_name = NULL; - serverNO = _get_server_name (server, pserver); - - /* find service name from table by lang */ +- /* find service name from table by lang */ - if (lang && *lang) - { - if ((serv_name = get_service_of_serv_defs (lang)) == NULL) @@ -62,61 +172,41 @@ diff -d -u -I\$FreeBSD$ -w -r1.1.1.1 -r1.2 - serv_name = SERVERNAME; -*/ - strcpy (sserver, SERVERNAME); -+ if (lang && *lang) { -+ if ((serv_name = get_service_of_serv_defs (lang)) == NULL) { -+ strncpy (sserver, SERVERNAME, sizeof(sserver) - 1); -+ sserver[sizeof(sserver) - 1] = '\0'; -+ } else { -+ strncpy (sserver, serv_name, sizeof(sserver) - 1); -+ sserver[sizeof(sserver) - 1] = '\0'; - } +- } -/* - if ((sp = getservbyname(serv_name,"tcp")) != NULL) { -*/ - if ((sp = getservbyname (sserver, "tcp")) != NULL) - { - serverNO += ntohs (sp->s_port); -+ } else { -+ strncpy (sserver, SERVERNAME, sizeof(sserver) - 1); -+ sserver[sizeof(sserver) - 1] = '\0'; - } +- } - else - { -+ -+ memset(&sa, 0, sizeof(struct sockaddr)); -+ error = getnameinfo(&sa, sa.sa_len, NULL, 0, sbuf, sizeof(sbuf), NI_NUMERICSERV); -+ if (!error) { -+ serverNO += atoi(sbuf); -+ } else { - if ((port_num = get_port_num_of_serv_defs (lang)) == -1) +- if ((port_num = get_port_num_of_serv_defs (lang)) == -1) - { - serverNO += WNN_PORT_IN; +- serverNO += WNN_PORT_IN; - } - else +- else - { - serverNO += port_num; - } +- serverNO += port_num; +- } - } -#ifdef INET6 -+ - memset(&hints, 0, sizeof(hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; +- memset(&hints, 0, sizeof(hints)); +- hints.ai_family = PF_UNSPEC; +- hints.ai_socktype = SOCK_STREAM; - sprintf(sport, "%d", serverNO); - error = getaddrinfo(pserver, sport, &hints, &res0); - if (error) - { --#if DEBUG -+ sprintf(sbuf, "%d", serverNO); -+ -+ error = getaddrinfo(pserver, sbuf, &hints, &res0); -+ if (error) { - xerror (gai_strerror(error)); --#endif - return -1; - } -+ - for (res = res0; res ; res = res->ai_next) { + #if DEBUG +- xerror (gai_strerror(error)); ++ fprintf(stderr, "cd_open_in: Enter: server=%s, lang=%s\n", ++ server, lang); + #endif +- return -1; +- } +- for (res = res0; res ; res = res->ai_next) { - if (res->ai_family == AF_INET || res->ai_family == AF_INET6){ - if ((sd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) != ERROR){ -#else @@ -130,110 +220,684 @@ diff -d -u -I\$FreeBSD$ -w -r1.1.1.1 -r1.2 - saddr_in.sin_port = htons (serverNO); - if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == ERROR) - { --#if DEBUG ++ serverNO = _get_server_name(server, pserver); + #if DEBUG - xerror ("jslib:Can't create inet socket.\n"); --#endif ++ fprintf(stderr, "cd_open_in: serverNO=%d\n", serverNO); + #endif - return -1; - } -+ switch (res->ai_family) { -+ case AF_INET: -+#ifdef INET6 -+ case AF_INET6: ++ /* find service name from table by lang */ ++ if (lang && *lang) { ++ if ((serv_name = get_service_of_serv_defs (lang)) == NULL) { ++ strncpy (sserver, SERVERNAME, sizeof(sserver) - 1); ++ sserver[sizeof(sserver) - 1] = '\0'; ++ } else { ++ strncpy (sserver, serv_name, sizeof(sserver) - 1); ++ sserver[sizeof(sserver) - 1] = '\0'; ++ } ++ } else { ++ strncpy (sserver, SERVERNAME, sizeof(sserver) - 1); ++ sserver[sizeof(sserver) - 1] = '\0'; ++ } ++ ++ memset(&sa, 0, sizeof(struct sockaddr)); ++ error = getnameinfo(&sa, sa.sa_len, ++ NULL, 0, sbuf, sizeof(sbuf), NI_NUMERICSERV); ++ if (!error) { ++ serverNO += atoi(sbuf); ++ } else { ++ if ((port_num = get_port_num_of_serv_defs (lang)) == -1) ++ serverNO += WNN_PORT_IN; ++ else ++ serverNO += port_num; ++ } ++#if DEBUG ++ fprintf(stderr, "cd_open_in: fixed serverNO=%d\n", serverNO); #endif - - if (timeout != 0 && timeout > 0) - { -+ if ((sd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) != ERROR){ -+ if (timeout != 0 && timeout > 0) { - signal (SIGALRM, connect_timeout); - alarm (timeout); - } --#ifdef INET6 +- signal (SIGALRM, connect_timeout); +- alarm (timeout); +- } ++ memset(&hints, 0, sizeof(hints)); ++ hints.ai_family = PF_UNSPEC; ++ hints.ai_socktype = SOCK_STREAM; ++ sprintf(sbuf, "%d", serverNO); + - ret = connect (sd, res->ai_addr, res->ai_addrlen); ++ error = getaddrinfo(pserver, sbuf, &hints, &res0); ++ if (error) { ++ xerror(gai_strerror(error)); ++ return -1; ++ } ++ ++ for (res = res0; res ; res = res->ai_next) { ++ switch (res->ai_family) { ++ case AF_INET: + #ifdef INET6 +- ret = connect (sd, res->ai_addr, res->ai_addrlen); -#else - ret = connect (sd, (struct sockaddr *) &saddr_in, sizeof (saddr_in)); --#endif ++ case AF_INET6: + #endif - if (timeout != 0 && timeout > 0) - { -+ -+ if (timeout != 0 && timeout > 0) { - alarm (0); - signal (SIGALRM, SIG_IGN); - } +- alarm (0); +- signal (SIGALRM, SIG_IGN); +- } - if (ret == ERROR) - { -#if DEBUG --#ifdef INET6 ++ sd = socket(res->ai_family, ++ res->ai_socktype, ++ res->ai_protocol); + -+ if (ret == ERROR) { - if (res->ai_family == AF_INET) - xerror ("jslib:Can't connect inet socket.\n"); -+#ifdef INET6 - else if (res->ai_family == AF_INET6) - xerror ("jslib:Can't connect inet6 socket.\n"); ++ if (sd == ERROR) { ++ switch (res->ai_family) { ++ case AF_INET: ++ xerror ("jslib:Can't create inet socket.\n"); + #ifdef INET6 +- if (res->ai_family == AF_INET) +- xerror ("jslib:Can't connect inet socket.\n"); +- else if (res->ai_family == AF_INET6) +- xerror ("jslib:Can't connect inet6 socket.\n"); -#else - xerror ("jslib:Can't connect inet socket.\n"); -#endif ++ case AF_INET6: ++ xerror ("jslib:Can't create inet6 socket.\n"); #endif ++ default: ++ xerror("jslib:Cannot create socket. Unknown socket type.\n"); ++ } ++ ++ break; ++ } ++ if (timeout) { ++ signal(SIGALRM, connect_timeout); ++ alarm(timeout); ++ } ++ ret = connect(sd, ++ res->ai_addr, ++ res->ai_addrlen); ++ if (timeout) { ++ alarm(0); ++ signal(SIGALRM, SIG_IGN); ++ } ++ if (ret == ERROR) { ++ switch (res->ai_family) { ++ case AF_INET: ++ fprintf(stderr, "jslib:Can't connect inet socket. (sd=%d)\n", sd); ++ break; ++#ifdef INET6 ++ case AF_INET6: ++ fprintf(stderr, "jslib:Can't connect inet6 socket. (sd=%d)\n", sd); ++ break; ++#endif ++ default: ++ xerror("jslib:Cannot connect. Unknown socket type.\n"); ++ break; ++ } #ifdef HAVE_CLOSESOCKET - closesocket (sd); +- closesocket (sd); ++ closesocket(sd); #else - close (sd); +- close (sd); ++ close(sd); #endif -#ifdef INET6 - sd = ERROR; - } else - break; -+ freeaddrinfo(res0); -+ return(-1); -+ } - } else { --#if DEBUG - if (res->ai_family == AF_INET) - xerror ("jslib:Can't create inet socket.\n"); -+#ifdef INET6 - else if (res->ai_family == AF_INET6) - xerror ("jslib:Can't create inet6 socket.\n"); - #endif - } -+ break; -+ default: -+ break; - } - } -+ - freeaddrinfo(res0); -- if (sd == ERROR) { +- } else { ++ sd = ERROR; ++ } + #if DEBUG +- if (res->ai_family == AF_INET) +- xerror ("jslib:Can't create inet socket.\n"); +- else if (res->ai_family == AF_INET6) +- xerror ("jslib:Can't create inet6 socket.\n"); -#endif +- } +- } +- } +- freeaddrinfo(res0); +- if (sd == ERROR) { ++ fprintf(stderr, "connect: sd=%d\n", sd); + #endif - return -1; - } - return sd; +- return sd; ++ freeaddrinfo(res0); ++ return sd; ++ } ++ } ++ freeaddrinfo(res0); ++ return sd; + } + + static void +-connect_timeout () ++connect_timeout() + { } -@@ -408,7 +368,7 @@ - if (server[0] == '[') { - p = strchr(server++, ']'); - if (p) { + /* get server name and return serverNo */ + static int +-_get_server_name (server, pserver) +- char *server; +- char *pserver; ++_get_server_name(char *server, ++ char *pserver) + { +- register char *p; ++ char *p; + #ifdef INET6 +- int len; ++ int len; + +- if (server[0] == '[') { +- p = strchr(server++, ']'); +- if (p) { - len = p-server<64-1?p-server:64-1; -+ len = p-server < NI_MAXHOST - 1 ? p-server : NI_MAXHOST - 1; - strncpy(pserver, server, len); - pserver[len] = '\0'; - } else -@@ -416,9 +376,9 @@ - } else { +- strncpy(pserver, server, len); +- pserver[len] = '\0'; +- } else +- pserver[0] = '\0'; +- } else { ++ if (server[0] == '[') { ++ p = strchr(server++, ']'); ++ if (p) { ++ len = p-server < NI_MAXHOST - 1 ? p-server : NI_MAXHOST - 1; ++ strncpy(pserver, server, len); ++ pserver[len] = '\0'; ++ } else ++ pserver[0] = '\0'; ++ } else { #endif /* Workaround for pserver buffer overrun : Nov 11,1999 by T.Aono */ - /* assumes pserver[64]. variable length string is not supported. */ - strncpy(pserver, server, 64-1); - pserver[64-1] = '\0'; +- p = pserver; + /* assumes pserver[NI_MAXHOST]. variable length string is not supported. */ -+ strncpy(pserver, server, NI_MAXHOST - 1); -+ pserver[NI_MAXHOST - 1] = '\0'; - p = pserver; ++ strncpy(pserver, server, NI_MAXHOST - 1); ++ pserver[NI_MAXHOST - 1] = '\0'; ++ p = pserver; #ifdef INET6 - } -@@ -687,7 +647,6 @@ +- } ++ } + #endif +- for (; *p && *p != ':'; p++); +- if (!*p) +- return (0); /* does not have a colon */ +- *p = 0; +- return (atoi (++p)); ++ ++ for (; *p && *p != ':'; p++); ++ if (!*p) /* does not have a colon */ ++ return (0); ++ *p = 0; ++ return (atoi (++p)); + } + + /* Packet SND/RCV subroutines */ + static void put4com (); + +-/** パケットのヘッダーを送る **/ ++/* send packet header */ + static void +-snd_head (cmd) +- int cmd; /** cmd=コマンド **/ ++snd_head(int cmd) + { +- sbp = 0; +- put4com (cmd); +- rbc = -1; ++ sbp = snd_buf; ++ put4com(cmd); ++ rcv_flush(); + } + +-/** パケットのヘッダーを送る **/ ++/* send environment header */ + static int +-snd_env_head (env, cmd) +- register struct wnn_env *env; +- int cmd; /** cmd=コマンド **/ ++snd_env_head (struct wnn_env *env, ++ int cmd) + { +- snd_head (cmd); +- put4com (env->env_id); +- return 0; ++ snd_head(cmd); ++ put4com(env->env_id); ++ return 0; + } + +-/** パケットのヘッダーを送る **/ ++/* send server header */ + static int +-snd_server_head (server, cmd) +- register WNN_JSERVER_ID *server; +- int cmd; /** cmd=コマンド **/ ++snd_server_head(WNN_JSERVER_ID *server, ++ int cmd) + { +- snd_head (cmd); +- return 0; ++ snd_head(cmd); ++ return 0; + } + +-/** 送信バッファをフラッシュする **/ ++/* flush send buffer */ + static int +-snd_flush () ++snd_flush() + { +- if (sbp == 0) +- return (-1); +- writen (sbp); +- sbp = 0; +- return (0); ++ /* empty buffer; no need to flush */ ++ if (sbp == snd_buf) ++ return 0; ++ ++ writen(sbp); ++ return 0; + } + ++/* send data */ + static int +-writen (n) +- int n; ++writen(unsigned char *sp) + { +- int cc, x; +- for (cc = 0; cc < n;) +- { +- errno = 0; ++ unsigned char *bp = snd_buf; ++ int n; ++ size_t total = sp - bp; ++ ++ while (bp < sp && bp <= snd_buf + sizeof(snd_buf)) { ++#if DEBUG_IO ++ fprintf(stderr, ++ "writen: loop: sp - bp = %d\n", sp - bp); ++#endif + #ifdef HAVE_SEND +- x = send (current_sd, &snd_buf[cc], n - cc, 0); ++ n = send(current_sd, bp, sp - bp, 0); + #else +- x = write (current_sd, &snd_buf[cc], n - cc); ++ n = write(current_sd, bp, sp - bp); + #endif +- if (x < 0) +- { +- if (ERRNO_CHECK (errno) || errno == EINTR) +- { +- continue; +- } +- else +- { +- daemon_dead (); +- return -1; +- } +- } +- cc += x; +- } +-#if DEBUG +- fprintf (stderr, "jslib:writen=%d\n", x); +-/* dmp(snd_buf,x); */ ++ if (n < 0) { ++ if (ERRNO_CHECK (errno) || errno == EINTR) { ++ continue; ++ } else { ++#if DEBUG_IO ++ fprintf(stderr, ++ "writen: failed. errno=%d\n", errno); ++#endif ++ daemon_dead(); ++ return -1; ++ } ++ } ++ bp += n; ++ } ++ sbp = snd_buf; ++#if DEBUG_IO ++ fprintf (stderr, "jslib:writen=%d\n", total); + #endif +- return (0); ++ return 0; + } + +-/** サーバへ1バイト送る **/ ++/* send one byte to server */ + static void +-put1com (c) +- int c; ++put1com(int c) + { +- snd_buf[sbp++] = c; +- if (sbp >= S_BUF_SIZ) +- { +- writen (S_BUF_SIZ); +- sbp = 0; +- } ++ unsigned int data = c & 0xff; ++ ++#if DEBUG_IO ++ fprintf(stderr, "put1com: [%02x]\n", data); ++#endif ++ ++ /* flush buffer if full */ ++ if (sbp - snd_buf >= S_BUF_SIZ) { ++ writen(sbp); ++ } ++ *(sbp++) = data; + } + +-/** サーバへ2バイト送る **/ ++/* send two bytes */ + static void +-put2com (c) +- int c; ++put2com(int c) + { +- put1com (c >> (8 * 1)); +- put1com (c); ++ unsigned int data = c & 0xffff; ++#if DEBUG_IO ++ fprintf(stderr, "put2com: [%04x]\n", data); ++#endif ++ put1com(data >> (8 * 1)); ++ put1com(data); + } + +-/** サーバへ4バイト送る **/ ++/* send four bytes */ + static void +-put4com (c) +- int c; ++put4com(int c) + { +- put1com (c >> (8 * 3)); +- put1com (c >> (8 * 2)); +- put1com (c >> (8 * 1)); +- put1com (c); ++ unsigned int data = c & 0xffffffff; ++#if DEBUG_IO ++ fprintf(stderr, "put4com: [%08x]\n", data); ++#endif ++ put1com(data >> (8 * 3)); ++ put1com(data >> (8 * 2)); ++ put1com(data >> (8 * 1)); ++ put1com(data); + } + +-/** サーバへ文字列を送る **/ ++/* send w_char string */ + static void +-putwscom (p) +- register w_char *p; ++putwscom(w_char *p) + { +- if (p == NULL) +- { +- put2com (0); +- return; +- } +- while (*p) +- put2com (*p++); +- put2com (0); ++ if (p == NULL) { ++ put2com(0x0000); ++ return; ++ } ++ ++#if DEBUG_IO ++ fprintf(stderr, "putwscom: [%s]\n", p); ++#endif ++ while(*p) ++ put2com (*p++); ++ put2com(0x0000); + } + +-/** サーバへ文字列を送る **/ ++/* send string */ + static void +-putscom (p) +- register char *p; ++putscom(unsigned char *p) + { +- if (p == NULL) +- { +- put1com (0); +- return; +- } +- while (*p) +- put1com (*p++); +- put1com (0); +-} ++ if (p == NULL) { ++ put1com(0x00); ++ return; ++ } ++#if DEBUG_IO ++ fprintf(stderr, "putscom: [%s]\n", p); ++#endif ++ while (*p) ++ put1com(*p++); ++ put1com(0); ++} ++ ++static unsigned char rcv_buf[R_BUF_SIZ]; ++static unsigned char *rbp = rcv_buf; ++static unsigned char *rp = rcv_buf; + +-/** サーバから1バイト受ける **/ + static int +-get1com () ++rcv_flush() + { +- static int rbp; +- static unsigned char rcv_buf[R_BUF_SIZ]; /** 受信 **/ +- if (rbc <= 0) +- { +- while (1) +- { +- errno = 0; +-#ifdef HAVE_RECV +- rbc = recv (current_sd, rcv_buf, R_BUF_SIZ, 0); +-#else +- rbc = read (current_sd, rcv_buf, R_BUF_SIZ); +-#endif +- if (rbc <= 0) +- { +- if (ERRNO_CHECK (errno)) +- { +- continue; +- } +- else if (rbc == 0) +- { +- daemon_dead (); +- return -1; +- } +- else +- { /* cc == -1 */ +- if (errno != EINTR) +- { +- daemon_dead (); +- return -1; +- } +- continue; +- } +- } +- rbp = 0; +-#if DEBUG +- fprintf (stderr, "jslib:read:rbc=%d\n", rbc); +-/* dmp(rcv_buf,rbc); */ ++#if DEBUG_IO ++ fprintf(stderr, "rcv_flush\n"); + #endif +- break; +- } +- } +- rbc--; +- return rcv_buf[rbp++] & 0xFF; ++ rbp = rp = &rcv_buf[0]; ++ return 0; + } + +-/** サーバから2バイト受ける **/ +-static int +-get2com () ++static unsigned int ++get1com() + { +- register int h; +- h = get1com (); +- return (h << 8) | get1com (); +-} ++ int n; + +-/** サーバから4バイト受ける **/ +-static int +-get4com () +-{ +- register int h1, h2, h3; +- h1 = get1com () << 24; +- h2 = get1com () << 16; +- h3 = get1com () << 8; +- return h1 | h2 | h3 | get1com (); ++#if DEBUG_IO ++ fprintf(stderr, "get1com: Enter\n"); ++#endif ++ if (rp == rbp) { ++ /* rp == rbp case; no data in rcv_buf */ ++ ++ rbp = rp = rcv_buf; ++ ++ while (rbp == rp) { ++ errno = 0; ++#ifdef HAVE_RECV ++ n = recv(current_sd, rcv_buf, sizeof(rcv_buf), 0); ++#else ++ n = read(current_sd, rcv_buf, sizeof(rcv_buf)); ++#endif ++#if DEBUG_IO ++ fprintf(stderr, "recvloop: n=%d\n", n); ++#endif ++ if (n == 0) { ++ if (ERRNO_CHECK(errno)) { ++ continue; ++ } else { ++ daemon_dead(); ++ return -1; ++ } ++ } ++ if (n < 0) { ++ if (ERRNO_CHECK(errno) || errno == EINTR) { ++ continue; ++ } else { ++ daemon_dead(); ++ return -1; ++ } ++ } ++ rp += n; ++ } ++#if DEBUG_IO ++ fprintf (stderr, "jslib:read:rp - rbp =%d\n", rp - rbp); ++#endif ++ } ++ ++#if DEBUG_IO ++ fprintf(stderr, "get1com: data [%02x]\n", *rbp & 0xff); ++ ++ fprintf(stderr, "rcv_buf: "); ++ { ++ int i; ++ for (i=0; i < rp - rbp; i++) { ++ fprintf(stderr, "[%02x]", *(rbp + i)); ++ } ++ fprintf(stderr, "\n"); ++ } ++#endif ++ return (*(rbp++) & 0xff); ++} ++ ++/* get two bytes */ ++static unsigned int ++get2com() ++{ ++ unsigned int h; ++#if DEBUG_IO ++ fprintf(stderr, "get2com: Enter\n"); ++#endif ++ h = get1com() << 8; ++ h |= get1com(); ++ ++#if DEBUG_IO ++ fprintf(stderr, "get2com: [%04x]\n", h); ++#endif ++ return h; ++} ++ ++/* get four bytes */ ++static unsigned int ++get4com() ++{ ++ unsigned int h; ++#if DEBUG_IO ++ fprintf(stderr, "get4com: Enter\n"); ++#endif ++ h = get1com() << 24; ++ h |= get1com() << 16; ++ h |= get1com() << 8; ++ h |= get1com(); ++#if DEBUG_IO ++ fprintf(stderr, "get4com: [%08x]\n", h); ++#endif ++ return h; + } + +-/** サーバへ文字列を送る **/ ++/* get string */ + static void +-getscom (p) +- register char *p; ++getscom(unsigned char *p) + { +- while (*p++ = get1com ()) +- ; ++ unsigned char *bp = p; ++ while (*p++ = get1com()) ++ ; ++#if DEBUG_IO ++ fprintf(stderr, "getscom: [%s]\n", bp); ++#endif + } + +-/** サーバへ文字列を送る **/ ++/* get wstring */ + static void +-getwscom (p) +- w_char register *p; ++getwscom(w_char *p) + { +- while (*p++ = get2com ()) +- ; ++ while (*p++ = get2com ()) ++ ; + } + + #ifdef nodef +@@ -687,7 +720,6 @@ Strcpy (s1, s2) /* Debug Subroutines */ @@ -241,7 +905,7 @@ diff -d -u -I\$FreeBSD$ -w -r1.1.1.1 -r1.2 void xerror (s) char *s; -@@ -716,8 +675,6 @@ +@@ -716,8 +748,6 @@ dmp (p, c) } } @@ -250,3 +914,219 @@ diff -d -u -I\$FreeBSD$ -w -r1.1.1.1 -r1.2 /* get login name form /etc/passwd file */ static char * getlogname () +@@ -741,87 +771,104 @@ getlogname () + + /** jserver と接続する。jserver_id を返す。 **/ + WNN_JSERVER_ID * +-js_open_lang (server, lang, timeout) +- register char *server, *lang; +- register int timeout; +-{ +- char *new_js; +- char host[WNN_HOSTLEN], user[WNN_ENVNAME_LEN]; +- int x; ++js_open_lang (char *server, ++ char *lang, ++ int timeout) ++{ ++ char *new_js; ++ char host[WNN_HOSTLEN]; ++ char user[WNN_ENVNAME_LEN]; ++ int x; ++ ++ if (wnn_msg_cat == NULL) { ++ char nlspath[MAXPATHLEN]; ++ strcpy (nlspath, LIBDIR); ++ strcat (nlspath, "/%L/%N"); ++ wnn_msg_cat = msg_open ("libwnn.msg", nlspath, lang); ++ if (wnn_msg_cat == NULL) { ++ fprintf (stderr, ++ "libwnn: Cannot open message file for libwnn.a\n"); ++ } ++ } ++ ++ if (!(new_js = (char *) malloc (sizeof (WNN_JSERVER_ID)))) { ++ wnn_errorno = WNN_ALLOC_FAIL; ++ return NULL; ++ } ++ ++ current_js = (WNN_JSERVER_ID *) new_js; ++ if (server == NULL) { ++ current_js->js_name[0] = '\0'; ++ } else { ++ strncpy(current_js->js_name, server, sizeof (current_js->js_name) - 1); ++ current_js->js_name[sizeof (current_js->js_name) - 1] = '\0'; ++ } + +- if (wnn_msg_cat == NULL) +- { +- char nlspath[MAXPATHLEN]; +- strcpy (nlspath, LIBDIR); +- strcat (nlspath, "/%L/%N"); +- wnn_msg_cat = msg_open ("libwnn.msg", nlspath, lang); +- if (wnn_msg_cat == NULL) +- { +- fprintf (stderr, "libwnn: Cannot open message file for libwnn.a\n"); +- } +- } +- sbp = 0; /* init sndBufPointer */ +- if (!(new_js = (char *) malloc (sizeof (WNN_JSERVER_ID)))) +- { +- wnn_errorno = WNN_ALLOC_FAIL; +- return NULL; +- } +- current_js = (WNN_JSERVER_ID *) new_js; +- if (server == NULL) +- { +- current_js->js_name[0] = '\0'; +- } +- else +- { +- strncpy (current_js->js_name, server, sizeof (current_js->js_name) - 1); +- current_js->js_name[sizeof (current_js->js_name) - 1] = '\0'; +- } +- current_js->js_dead = 0; +- current_js->js_dead_env_flg = 0; ++ current_js->js_dead = 0; ++ current_js->js_dead_env_flg = 0; + /* + if(user == NULL || 0==strcmp(user,"")) + */ +- strncpy (user, getlogname (), WNN_ENVNAME_LEN); +- user[WNN_ENVNAME_LEN - 1] = '\0'; /* truncate by WNN_ENVNAME_LEN */ +- if (server == NULL || 0 == strcmp (server, "") || 0 == strcmp (server, "unix")) +- { +- strcpy (host, "unix"); +- if ((current_sd = cd_open_un (lang)) == -1) +- { +- wnn_errorno = WNN_SOCK_OPEN_FAIL; +- free ((char *) current_js); +- current_js = NULL; +- return NULL; +- } +- } +- else +- { +- gethostname (host, WNN_HOSTLEN); +- host[WNN_HOSTLEN - 1] = '\0'; /* truncate by WNN_HOSTLEN */ +- if ((current_sd = cd_open_in (server, lang, timeout)) == -1) +- { +- wnn_errorno = WNN_SOCK_OPEN_FAIL; +- free ((char *) current_js); +- current_js = NULL; +- return NULL; +- } +- } +- current_js->sd = current_sd; +- handler_of_jserver_dead (NULL); +- snd_head (JS_OPEN); +- put4com (JLIB_VERSION); /* H.T. */ +- putscom (host); +- putscom (user); +- snd_flush (); +- if (get4com () == -1) +- { +- x = wnn_errorno = get4com (); +- js_close (current_js); /* H.T. */ +- current_js = NULL; +- wnn_errorno = x; +- return NULL; +- } +- return current_js; ++ strncpy(user, getlogname (), WNN_ENVNAME_LEN); ++ user[WNN_ENVNAME_LEN - 1] = '\0'; /* truncate by WNN_ENVNAME_LEN */ ++ ++#if DEBUG ++ fprintf(stderr, "js_open_lang: server: %s\n", server); ++#endif ++ if (server == NULL ++ || 0 == strcmp(server, "") ++ || 0 == strcmp(server, "unix")) { ++ strcpy(host, "unix"); ++ if ((current_sd = cd_open_un(lang)) == -1) { ++ wnn_errorno = WNN_SOCK_OPEN_FAIL; ++ free ((char *) current_js); ++ current_js = NULL; ++ return NULL; ++ } ++ } else { ++ gethostname (host, WNN_HOSTLEN); ++ host[WNN_HOSTLEN - 1] = '\0'; /* truncate by WNN_HOSTLEN */ ++#if DEBUG ++ fprintf(stderr, "js_open_lang: before cd_open_in\n"); ++#endif ++ if ((current_sd = cd_open_in(server, lang, timeout)) == -1) { ++ wnn_errorno = WNN_SOCK_OPEN_FAIL; ++ free((char *)current_js); ++ current_js = NULL; ++#if DEBUG ++ fprintf(stderr, "js_open_lang: cd_open_in failed\n"); ++#endif ++ return NULL; ++ } ++#if DEBUG ++ fprintf(stderr, "js_open_lang: after cd_open_in\n"); ++#endif ++ } ++ ++#if DEBUG ++ fprintf(stderr, "current_sd=%d\n", current_sd); ++#endif ++ current_js->sd = current_sd; ++ handler_of_jserver_dead (NULL); ++ snd_head(JS_OPEN); ++ put4com(JLIB_VERSION); /* H.T. */ ++ putscom(host); ++ putscom(user); ++ snd_flush(); ++ ++#if DEBUG ++ fprintf(stderr, "cd_open_in: before get4com\n"); ++#endif ++ ++ if (get4com() == -1) { ++ x = wnn_errorno = get4com (); ++ js_close(current_js); /* H.T. */ ++ current_js = NULL; ++ wnn_errorno = x; ++ return NULL; ++ } ++ ++ return current_js; + } + + +@@ -2988,29 +3035,25 @@ get_serv_defs (lang, cnt) + } + + char * +-_wnn_get_machine_of_serv_defs (lang) +- char *lang; ++_wnn_get_machine_of_serv_defs(char *lang) + { + return (get_serv_defs (lang, MACHINE_NAME)); + } + + static char * +-get_unixdomain_of_serv_defs (lang) +- char *lang; ++get_unixdomain_of_serv_defs(char *lang) + { + return (get_serv_defs (lang, UNIXDOMAIN_NAME)); + } + + static char * +-get_service_of_serv_defs (lang) +- char *lang; ++get_service_of_serv_defs(char *lang) + { + return (get_serv_defs (lang, SERVICE_NAME)); + } + + static int +-get_port_num_of_serv_defs (lang) +- char *lang; ++get_port_num_of_serv_defs(char *lang) + { + char *port_char; + |