[mew-dist 28609] Re: NTEmacsでmaster passwdが使えない

Kentaro KAWAMOTO kentaro.kawamoto at example.com
2008年 8月 30日 (土) 15:35:36 JST


On Wed, 27 Aug 2008 09:40:56 +0900 ()
Kentaro KAWAMOTO <kentaro.kawamoto at example.com> wrote:

> 最近の GnuPG は、--use-agent をサポートしていないようです。
> コマンドラインで実行したら、
> gpg: NOTE: --use-agent is not available in this version
> と言われてしまいました。
> 
> 上記 URL に書いてあるように、
> パッチを当てた GnuPG を作ってみます。

http://clbianco.altervista.org/gnupg/eng/gnupg.html
http://www.issp.u-tokyo.ac.jp/labs/sor/iida/gnupg/
を参考に、GnuPG 1.4.9 にパッチを当ててビルドしたら
Mew から使えるようになりました。

参考までにパッチを添付します。

---
Kentaro KAWAMOTO
mailto:kentaro.kawamoto at example.com


diff -urNp gnupg-1.4.9.orig/util/ttyio.c gnupg-1.4.9/util/ttyio.c
--- gnupg-1.4.9.orig/util/ttyio.c	Sat Aug 30 14:39:14 2008
+++ gnupg-1.4.9/util/ttyio.c	Sat Aug 30 14:45:21 2008
@@ -67,6 +67,7 @@ static struct {
 
 #else /* yeah, we have a real OS */
 static FILE *ttyfp = NULL;
+static FILE *ttyfpin = NULL;
 #endif
 
 static int initialized;
@@ -129,7 +130,7 @@ init_ttyfp(void)
 	return;
 
 #if defined(_WIN32)
-    {
+    if( isatty(fileno(stdin)) ) {
 	SECURITY_ATTRIBUTES sa;
 
 	memset(&sa, 0, sizeof(sa));
@@ -148,6 +149,9 @@ init_ttyfp(void)
 			       &sa, OPEN_EXISTING, 0, 0 );
 	if (con.in == INVALID_HANDLE_VALUE)
             log_fatal ("open(CONIN$) failed: %s", w32_strerror (0));
+    } else {
+      con.out = GetStdHandle(STD_OUTPUT_HANDLE);
+      con.in = GetStdHandle(STD_INPUT_HANDLE);
     }
     SetConsoleMode(con.in, DEF_INPMODE );
     SetConsoleMode(con.out, DEF_OUTMODE );
@@ -155,7 +159,8 @@ init_ttyfp(void)
 #elif defined(__EMX__)
     ttyfp = stdout; /* Fixme: replace by the real functions: see wklib */
 #else
-    ttyfp = batchmode? stderr : fopen( tty_get_ttyname (), "r+");
+    ttyfp = batchmode? stderr : stdout;
+    ttyfpin = batchmode? stderr : stdin;
     if( !ttyfp ) {
 	log_error("cannot open `%s': %s\n",
                   tty_get_ttyname (), strerror(errno) );
@@ -238,8 +243,8 @@ tty_printf( const char *fmt, ... )
 	n = vasprintf(&buf, fmt, arg_ptr);
 	if( !buf )
 	    log_bug("vasprintf() failed\n");
-        
-	if (!WriteConsoleA (con.out, buf, n, &nwritten, NULL))
+
+	if( !WriteFile( con.out, buf, n, &nwritten, NULL ) )
 	    log_fatal ("WriteConsole failed: %s", w32_strerror (0));
 	if( n != nwritten )
 	    log_fatal ("WriteConsole failed: %d != %d\n", n, (int)nwritten );
@@ -416,7 +421,7 @@ do_get( const char *prompt, int hidden )
     for(;;) {
 	DWORD nread;
 
-	if (!ReadConsoleA (con.in, cbuf, 1, &nread, NULL))
+	if( !ReadFile( con.in, cbuf, 1, &nread, NULL ) )
 	    log_fatal ("ReadConsole failed: %s", w32_strerror (0));
 	if( !nread )
 	    continue;
@@ -485,16 +490,18 @@ do_get( const char *prompt, int hidden )
     } while (c != '\n');
     i = (i>0) ? i-1 : 0;
 #else /* unix version */
+    if( !isatty(fileno(stdin)) ) hidden = 0;
+
     if( hidden ) {
 #ifdef HAVE_TCGETATTR
 	struct termios term;
 
-	if( tcgetattr(fileno(ttyfp), &termsave) )
+	if( tcgetattr(fileno(ttyfpin), &termsave) )
 	    log_fatal("tcgetattr() failed: %s\n", strerror(errno) );
 	restore_termios = 1;
 	term = termsave;
 	term.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
-	if( tcsetattr( fileno(ttyfp), TCSAFLUSH, &term ) )
+	if( tcsetattr( fileno(ttyfpin), TCSAFLUSH, &term ) )
 	    log_fatal("tcsetattr() failed: %s\n", strerror(errno) );
 #endif
     }
@@ -503,7 +510,7 @@ do_get( const char *prompt, int hidden )
 
     /* fixme: How can we avoid that the \n is echoed w/o disabling
      * canonical mode - w/o this kill_prompt can't work */
-    while( read(fileno(ttyfp), cbuf, 1) == 1 && *cbuf != '\n' ) {
+    while( read(fileno(ttyfpin), cbuf, 1) == 1 && *cbuf != '\n' ) {
 	if( !hidden )
 	    last_prompt_len++;
 	c = *cbuf;
@@ -530,7 +537,7 @@ do_get( const char *prompt, int hidden )
 
     if( hidden ) {
 #ifdef HAVE_TCGETATTR
-	if( tcsetattr(fileno(ttyfp), TCSAFLUSH, &termsave) )
+	if( tcsetattr(fileno(ttyfpin), TCSAFLUSH, &termsave) )
 	    log_error("tcsetattr() failed: %s\n", strerror(errno) );
 	restore_termios = 0;
 #endif
@@ -601,7 +608,8 @@ tty_kill_prompt()
     if( !last_prompt_len )
 	return;
 #ifdef _WIN32
-    tty_printf("\r%*s\r", last_prompt_len, "");
+    if( isatty(fileno(stdin)) )
+      tty_printf("\r%*s\r", last_prompt_len, "");
 #else
     {
 	int i;



Mew-dist メーリングリストの案内