[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00732] select listen protocol (Re: cmd_name not set in jserver/de.c)



濱嶋です。

jserverでプロトコルを引数で選べるようにしました。
-u (unix domain socket)
-4 (inet)
-6 (inet6 ただし--enable-inet6のときのみ)
未指定時はすべてです。

jserverとしては問題ないと思うのですが、jutilからjlibにかけての実装が
ひとつでも接続できればOKとなっていないので、実際には動作していても
  wnnkill:サーバが死んでいます。
とか
  wnnkill:サーバと接続できませんでした。
と言われてしまいます。


Tue, 28 Aug 2001 15:05:35 +0900 (JST) に
aono@cc.osaka-kyoiku.ac.jp (Tomoki AONO) さんが書かれた
<200108280605.PAA06377@ikoma.cc.osaka-kyoiku.ac.jp> を引用しています

>>> jserver/de.cの中にある変数 cmd_name (たぶんコマンド名)って、誰も設定して
>>> いないように見えますが、そんなことないですか?
> 
> 小野さんも[freewnn:00633]で案を示されていますが、後回しに
> なっている模様です。

そうだったんですか。
とりあえず、添付のパッチはargv[0]をコピーしていますので適切なものに直し
てください。
それからargv[0]を前提としてcmd_nameの長さはMAXPATHLENに変更してあります。
こちらも適切なものに直してください。
--- FreeWnn/Wnn/jserver/de.c.orig	Tue Aug 28 15:06:56 2001
+++ FreeWnn/Wnn/jserver/de.c	Tue Aug 28 15:17:37 2001
@@ -112,6 +112,14 @@
 #define INET6_ACPT      2
 #endif
 
+#define PROTO_ALL	0x1
+#define PROTO_UN	0x2
+#define PROTO_INET	0x4
+#ifdef INET6
+#define PROTO_INET6	0x8
+#endif
+static listen_proto = PROTO_ALL;
+
 jmp_buf client_dead;
 
 static int port;
@@ -185,7 +193,7 @@
 #endif
 
 
-char cmd_name[80];
+char cmd_name[MAXPATHLEN];
 
 /* No arguments are used. Only options. */
 int
@@ -201,6 +209,7 @@
 
   char nlspath[64];
 
+  strcpy (cmd_name, argv[0]);
   strcpy (lang_dir, LANG_NAME);
   strcpy (nlspath, LIBDIR);
   strcat (nlspath, "/%L/%N");
@@ -528,9 +537,16 @@
   clientp = 0;                  /* V3.0 */
   cur_clp = 0;                  /* V3.0 */
   socket_disc_init ();
-  socket_init_in ();
+#ifdef INET6
+  if (listen_proto&(PROTO_ALL|PROTO_INET|PROTO_INET6))
+      socket_init_in ();
+#else
+  if (listen_proto&(PROTO_ALL|PROTO_INET))
+      socket_init_in ();
+#endif
 #ifdef  AF_UNIX
-  socket_init_un ();
+  if (listen_proto&(PROTO_ALL|PROTO_UN))
+      socket_init_un ();
 #endif /* AF_UNIX */
 }
 
@@ -983,7 +999,12 @@
 #endif
 #ifdef INET6
   memset(&hints, 0, sizeof(hints));
-  hints.ai_family = PF_UNSPEC;
+  if (listen_proto&PROTO_INET && !(listen_proto&PROTO_INET6))
+      hints.ai_family = PF_INET;
+  else if (listen_proto&PROTO_INET6 && !(listen_proto&PROTO_INET))
+      hints.ai_family = PF_INET6;
+  else
+      hints.ai_family = PF_UNSPEC;
   hints.ai_socktype = SOCK_STREAM;
   hints.ai_flags = AI_PASSIVE;
   sprintf(sport, "%d", port);
@@ -1149,7 +1170,11 @@
 
   strcpy (jserverrcfile, LIBDIR);       /* usr/local/lib/wnn */
   strcat (jserverrcfile, SERVER_INIT_FILE);     /* ja_JP/jserverrc */
-  while ((c = getopt (argc, argv, "f:s:h:N:p:v")) != EOF)
+#ifndef INET6
+  while ((c = getopt (argc, argv, "f:s:h:N:p:vu4")) != EOF)
+#else
+  while ((c = getopt (argc, argv, "f:s:h:N:p:vu46")) != EOF)
+#endif
     {
       switch (c)
         {
@@ -1188,6 +1213,20 @@
 # endif /* KOREAN */
 #endif /* CHINESE */
 	  exit (0);
+        case 'u':
+	  listen_proto &= ~PROTO_ALL;
+	  listen_proto |= PROTO_UN;
+          break;
+        case '4':
+	  listen_proto &= ~PROTO_ALL;
+	  listen_proto |= PROTO_INET;
+          break;
+#ifdef INET6
+        case '6':
+	  listen_proto &= ~PROTO_ALL;
+	  listen_proto |= PROTO_INET6;
+          break;
+#endif
         default:
 	  usage();
         }
@@ -1238,7 +1277,11 @@
 usage ()
 {
   fprintf(stderr, 
-	  "usage: %s [-f <init_file> -s <log_file(\"-\" for stderr)> -h <pos_file> -N <serverNO> -p <port_base>]\n",
+#ifdef INET6
+	  "usage: %s [-f <init_file> -s <log_file(\"-\" for stderr)> -h <pos_file> -N <serverNO> -p <port_base> -u -4 -6]\n",
+#else
+	  "usage: %s [-f <init_file> -s <log_file(\"-\" for stderr)> -h <pos_file> -N <serverNO> -p <port_base> -u -4]\n",
+#endif
 	  cmd_name);
   fprintf(stderr,
 	  "       %s -v\n",


http://www.freewnn.org/ FreeWnn Project