summaryrefslogtreecommitdiff
path: root/japanese/FreeWnn-lib/files/patch-Wnn-jlib-js.c
diff options
context:
space:
mode:
Diffstat (limited to 'japanese/FreeWnn-lib/files/patch-Wnn-jlib-js.c')
-rw-r--r--japanese/FreeWnn-lib/files/patch-Wnn-jlib-js.c1126
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;
+