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

Solaris + XEmacs の問題解決方法



白井です。

Solaris + XEmacs で process-connection-type が t だと w3m の終了
が検知できないし、process-connection-type が nil だと passwd の
検出/入力が出来ないし、という問題の話です。

XEmacs のソースみても案の定全然わからないので、スーパスペシャル
アドホックな解決方法を試してみました。

パッチが二種類ありまして、

1) w3m-0.2.1-inu-1.5 に "-use-pipe" という option を増やす w3m
 へのパッチ。(いかにも Emacs からみた option 名ですが)

2) process-connection-type => nil だったら、"-use-pipe" 付きで
 w3m を動かす w3m.el へのパッチ

## 内容は process-connection-type => nil だったら getpass 使わな
## いだけなんですが ^^;;;

これで、とりあえず、Solaris + XEmacs だろうが、他の Emacs で
w3m-process-connection-type が nil だろうが、user と passwd のや
り取りが出来るようになります。


で、私が思うに最大の問題点は

『こんなふざけたパッチが w3m 側で取り入れて貰えるのだろうか?』

ということなのですが、どんなものでしょうか?

# ほとんど坂本さん宛ての質問です。申し訳ないです (_ _)


P.S. 状況説明
Emacs における process-connection-type は非同期サブプロセスを作
るときに

nil => pipe を使う
non-nil => 疑似端末 PTY を利用できる場合にはそれをもちいる

という制御をします。通常、サブプロセスで getpass などを使うとき
は non-nil にして PTY を使わないといけないのですが、(結構昔から
ある) Solaris + XEmacs のバグ(?)のために、この組合わせでは
non-nil にできないのです。

## という問題に、世界中で最低 5人ほど苦しんでいます。^^;;;

-- 
白井秀行 (mailto:shirai@rdmg.mgcs.mei.co.jp)
--- ../w3m-0.2.1-inu-1.5.orig/file.c	Wed Oct 31 20:41:11 2001
+++ file.c	Tue Nov  6 18:34:59 2001
@@ -861,7 +861,19 @@
 	    fflush(stdout);
 	    uname = Strfgets(stdin);
 	    Strchop(uname);
+	    if (w3m_use_pipe) {
+		printf(proxy ? "Proxy Password: " : "Password: ");
+		fflush(stdout);
+		pwd  = Strfgets(stdin);
+		Strchop(pwd);
+	    }
+	    else {
+#ifdef HAVE_GETPASSPHRASE
+            pwd = Strnew_charp((char *) getpassphrase(proxy ? "Proxy Password: " : "Password: "));
+#else
             pwd = Strnew_charp((char *) getpass(proxy ? "Proxy Password: " : "Password: "));
+#endif
+	    }
 	}
 	Strcat_char(uname, ':');
 	Strcat(uname, pwd);
--- ../w3m-0.2.1-inu-1.5.orig/fm.h	Wed Oct 31 20:41:11 2001
+++ fm.h	Tue Nov  6 18:33:35 2001
@@ -682,7 +682,8 @@
 global int w3m_dump init(0);
 #define w3m_halfdump (w3m_dump & DUMP_HALFDUMP)
 global int w3m_halfload init(FALSE);
+global int w3m_use_pipe init(FALSE);
 global Str header_string init(NULL);
 global int override_content_type init(FALSE);
 
--- ../w3m-0.2.1-inu-1.5.orig/main.c	Wed Oct 31 20:42:04 2001
+++ main.c	Tue Nov  6 18:35:16 2001
@@ -135,6 +135,7 @@
     fprintf(f, "    -X               don't use termcap init/deinit\n");
     fprintf(f, "    -o opt=value     assign value to config option\n");
     fprintf(f, "    -config file     specify config file\n");
+    fprintf(f, "    -use-pipe        use pipe to read passwd\n");
     fprintf(f, "    -debug           DO NOT USE\n");
 #ifdef SHOW_PARAMS
     if (show_params_p)
@@ -463,6 +464,9 @@
 		w3m_dump = 0;
 		w3m_halfload = TRUE;
 		DefaultType = default_type = "text/html";
+	    }
+	    else if (!strcmp("-use-pipe", argv[i])) {
+	        w3m_use_pipe = TRUE;
 	    }
 	    else if (!strcmp("-backend", argv[i])) {
 		w3m_backend = TRUE;
--- ../w3m-0.2.1-inu-1.5.orig/configure	Fri Sep 28 22:17:38 2001
+++ configure	Tue Nov  6 14:14:01 2001
@@ -1316,6 +1316,23 @@
   srandom_flg="#undef HAVE_SRANDOM"
 fi
 
+####### getpassphrase
+cat > _zmachdep.c << EOF
+#include <unistd.h>
+main()
+{
+  getpassphrase("");
+}
+EOF
+if $cc $cflags -o _zmachdep _zmachdep.c > /dev/null 2>&1
+then
+  echo "You have getpassphrase()."
+  getpassphrase_flg="#define HAVE_GETPASSPHRASE"
+else
+  echo "You don't have getpassphrase()."
+  getpassphrase_flg="#undef HAVE_GETPASSPHRASE"
+fi
+
 ####### fclose
 cat > _zmachdep.c << EOF
 #include <stdio.h>
@@ -1840,7 +1857,7 @@
 $putenv_flg
 $srand48_flg
 $srandom_flg
-$readlink_flg
+$getpassphrase_flg
 $fclose_dcl
 $pclose_dcl
 $setjmp_def
Index: w3m.el
===================================================================
RCS file: /cvsroot/w3m-shirai/emacs-w3m/w3m.el,v
retrieving revision 1.323
diff -c -u -r1.323 w3m.el
--- w3m.el	2001/11/04 23:59:32	1.323
+++ w3m.el	2001/11/06 09:57:27
@@ -2216,12 +2216,14 @@
 	    w3m-process-exit-status nil)
       (if w3m-async-exec
 	  ;; start-process
-	  (let ((w3m-process-user)
-		(w3m-process-passwd)
-		(w3m-process-realm)
-		(w3m-process-user-counter 2)
-		(proc (apply 'start-process w3m-command (current-buffer)
-			     w3m-command args)))
+	  (let* ((w3m-process-user)
+		 (w3m-process-passwd)
+		 (w3m-process-realm)
+		 (w3m-process-user-counter 2)
+		 (args (if w3m-process-connection-type
+			   args (cons "-use-pipe" args)))
+		 (proc (apply 'start-process w3m-command (current-buffer)
+			      w3m-command args)))
 	    (set-process-filter proc 'w3m-exec-filter)
 	    (set-process-sentinel proc 'ignore)
 	    (process-kill-without-query proc)
@@ -2354,7 +2356,7 @@
 	    (goto-char (point-min))
 	    (cond
 	     ((and (looking-at
-		    "\\(\nWrong username or password\n\\)?Proxy Username for \\(.*\\): Proxy Password: ")
+		    "\\(\n?Wrong username or password\n\\)?Proxy Username for \\(.*\\): Proxy Password: ")
 		   (= (match-end 0) (point-max)))
 	      (unless w3m-proxy-passwd
 		(setq w3m-proxy-passwd
@@ -2366,7 +2368,7 @@
 		    (delete-region (point-min) (point-max)))
 		(error nil)))
 	     ((and (looking-at
-		    "\\(\nWrong username or password\n\\)?Proxy Username for \\(.*\\): ")
+		    "\\(\n?Wrong username or password\n\\)?Proxy Username for \\(.*\\): ")
 		   (= (match-end 0) (point-max)))
 	      (unless w3m-proxy-user
 		(setq w3m-proxy-user
@@ -2378,7 +2380,7 @@
 				       (concat w3m-proxy-user "\n"))
 		(error nil)))
 	     ((and (looking-at
-		    "\\(\nWrong username or password\n\\)?Username for \\(.*\\)\n?: Password: ")
+		    "\\(\n?Wrong username or password\n\\)?Username for \\(.*\\)\n?: Password: ")
 		   (= (match-end 0) (point-max)))
 	      (setq w3m-process-realm (match-string 2))
 	      (setq w3m-process-passwd
@@ -2393,7 +2395,7 @@
 		    (delete-region (point-min) (point-max)))
 		(error nil)))
 	     ((and (looking-at
-		    "\\(\nWrong username or password\n\\)?Username for \\(.*\\)\n?: ")
+		    "\\(\n?Wrong username or password\n\\)?Username for \\(.*\\)\n?: ")
 		   (= (match-end 0) (point-max)))
 	      (setq w3m-process-realm (match-string 2))
 	      (setq w3m-process-user