[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Solaris + XEmacs
の問題解決方法
- From: Hideyuki SHIRAI (
白井秀行
) <shirai@xxxxxxxxxxxxxxxxxxx>
- Date: Tue, 06 Nov 2001 19:18:54 +0900 (JST)
- X-ml-name: emacs-w3m
- X-mail-count: 02077
白井です。
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