mirror of
https://git.FreeBSD.org/ports.git
synced 2025-01-07 06:40:06 +00:00
4b38031b7f
- Fix daemonizing part. It now returns the exit status correctly. - Fix *_{pre,post}cmd handling in the rc.d scripts. Plus, wnntouch is now invoked just before running the server process. - Use ${*_WNNMANDIR} in Makefile to use the common patchset in both FreeWnn-server and -lib. - Integrate libtool22 change and regenerate patch files.
1133 lines
25 KiB
C
1133 lines
25 KiB
C
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.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 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
|
|
void xerror ();
|
|
-#endif
|
|
|
|
/********* V4 *****************/
|
|
/***
|
|
@@ -192,471 +190,506 @@ daemon_dead ()
|
|
(cdというのはコミュニケーションデバイスの名残)
|
|
**/
|
|
static int
|
|
-cd_open_un (lang)
|
|
- register char *lang;
|
|
+cd_open_un(const char *lang)
|
|
{
|
|
-#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;
|
|
+
|
|
+ /* 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;
|
|
+ }
|
|
+
|
|
+ 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;
|
|
- 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;
|
|
|
|
- /* find service name from table by lang */
|
|
- if (lang && *lang)
|
|
- {
|
|
- if ((serv_name = get_service_of_serv_defs (lang)) == NULL)
|
|
- {
|
|
- strcpy (sserver, SERVERNAME);
|
|
- }
|
|
- else
|
|
- {
|
|
- strcpy (sserver, serv_name);
|
|
- }
|
|
- }
|
|
- else
|
|
- {
|
|
-/*
|
|
- serv_name = SERVERNAME;
|
|
-*/
|
|
- strcpy (sserver, SERVERNAME);
|
|
- }
|
|
-/*
|
|
- if ((sp = getservbyname(serv_name,"tcp")) != NULL) {
|
|
-*/
|
|
- if ((sp = getservbyname (sserver, "tcp")) != NULL)
|
|
- {
|
|
- serverNO += ntohs (sp->s_port);
|
|
- }
|
|
- else
|
|
- {
|
|
- if ((port_num = get_port_num_of_serv_defs (lang)) == -1)
|
|
- {
|
|
- serverNO += WNN_PORT_IN;
|
|
- }
|
|
- else
|
|
- {
|
|
- serverNO += port_num;
|
|
- }
|
|
- }
|
|
-#ifdef INET6
|
|
- 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
|
|
- 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
|
|
- if ((hp = gethostbyname (pserver)) == NULL)
|
|
- {
|
|
- return -1;
|
|
- }
|
|
- bzero ((char *) &saddr_in, sizeof (saddr_in));
|
|
- bcopy (hp->h_addr, (char *) &saddr_in.sin_addr, hp->h_length);
|
|
- saddr_in.sin_family = AF_INET;
|
|
- saddr_in.sin_port = htons (serverNO);
|
|
- if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == ERROR)
|
|
- {
|
|
+ serverNO = _get_server_name(server, pserver);
|
|
#if DEBUG
|
|
- xerror ("jslib:Can't create inet socket.\n");
|
|
+ fprintf(stderr, "cd_open_in: serverNO=%d\n", serverNO);
|
|
#endif
|
|
- return -1;
|
|
- }
|
|
+ /* 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)
|
|
- {
|
|
- 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);
|
|
+
|
|
+ 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));
|
|
+ case AF_INET6:
|
|
#endif
|
|
- if (timeout != 0 && timeout > 0)
|
|
- {
|
|
- alarm (0);
|
|
- signal (SIGALRM, SIG_IGN);
|
|
- }
|
|
- if (ret == ERROR)
|
|
- {
|
|
-#if DEBUG
|
|
+ sd = socket(res->ai_family,
|
|
+ res->ai_socktype,
|
|
+ res->ai_protocol);
|
|
+
|
|
+ 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);
|
|
#else
|
|
- close (sd);
|
|
+ close(sd);
|
|
#endif
|
|
-#ifdef INET6
|
|
- sd = ERROR;
|
|
- } else
|
|
- break;
|
|
- } 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;
|
|
+ freeaddrinfo(res0);
|
|
+ return sd;
|
|
+ }
|
|
+ }
|
|
+ freeaddrinfo(res0);
|
|
+ return sd;
|
|
}
|
|
|
|
static void
|
|
-connect_timeout ()
|
|
+connect_timeout()
|
|
{
|
|
}
|
|
|
|
/* 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;
|
|
- 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;
|
|
#ifdef INET6
|
|
- }
|
|
+ }
|
|
#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 */
|
|
-#if DEBUG
|
|
void
|
|
xerror (s)
|
|
char *s;
|
|
@@ -716,8 +748,6 @@ dmp (p, c)
|
|
}
|
|
}
|
|
|
|
-#endif
|
|
-
|
|
/* 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;
|
|
|