[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 メーリングリストの案内