aboutsummaryrefslogtreecommitdiffstats
path: root/agent
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--agent/ChangeLog8
-rw-r--r--agent/agent.h5
-rw-r--r--agent/call-pinentry.c25
-rw-r--r--agent/gpg-agent.c14
4 files changed, 52 insertions, 0 deletions
diff --git a/agent/ChangeLog b/agent/ChangeLog
index 06d7b85bf..cd19f35cf 100644
--- a/agent/ChangeLog
+++ b/agent/ChangeLog
@@ -1,3 +1,11 @@
+2007-02-14 Werner Koch <[email protected]>
+
+ * gpg-agent.c: New option --pinentry-touch-file.
+ (get_agent_socket_name): New.
+ * agent.h (opt): Add pinentry_touch_file.
+ * call-pinentry.c (start_pinentry): Send new option to the
+ pinentry.
+
2007-01-31 Moritz Schulte <[email protected]> (wk)
* command-ssh.c (stream_read_string): Initialize LENGTH to zero.
diff --git a/agent/agent.h b/agent/agent.h
index c86ec1e5f..15830de27 100644
--- a/agent/agent.h
+++ b/agent/agent.h
@@ -72,6 +72,10 @@ struct
int disable_scdaemon; /* Never use the SCdaemon. */
int no_grab; /* Don't let the pinentry grab the keyboard */
+ /* The name of the file pinentry shall tocuh before exiting. If
+ this is not set the filoe name of the standard socket is used. */
+ const char *pinentry_touch_file;
+
/* The default and maximum TTL of cache entries. */
unsigned long def_cache_ttl; /* Default. */
unsigned long def_cache_ttl_ssh; /* for SSH. */
@@ -186,6 +190,7 @@ cache_mode_t;
/*-- gpg-agent.c --*/
void agent_exit (int rc) JNLIB_GCC_A_NR; /* Also implemented in other tools */
+const char *get_agent_socket_name (void);
/*-- command.c --*/
gpg_error_t agent_write_status (ctrl_t ctrl, const char *keyword, ...);
diff --git a/agent/call-pinentry.c b/agent/call-pinentry.c
index bb3b5deb5..8b527b2d5 100644
--- a/agent/call-pinentry.c
+++ b/agent/call-pinentry.c
@@ -181,6 +181,7 @@ start_pinentry (ctrl_t ctrl)
int no_close_list[3];
int i;
pth_event_t evt;
+ const char *tmpstr;
evt = pth_event (PTH_EVENT_TIME, pth_timeout (LOCK_TIMEOUT, 0));
if (!pth_mutex_acquire (&entry_lock, 0, evt))
@@ -297,6 +298,30 @@ start_pinentry (ctrl_t ctrl)
if (rc)
return unlock_pinentry (rc);
}
+
+
+ /* Tell the pinentry the name of a file it shall touch after having
+ messed with the tty. This is optional and only supported by
+ newer pinentries and thus we do no error checking. */
+ tmpstr = opt.pinentry_touch_file;
+ if (tmpstr && !strcmp (tmpstr, "/dev/null"))
+ tmpstr = NULL;
+ else if (!tmpstr)
+ tmpstr = get_agent_socket_name ();
+ if (tmpstr)
+ {
+ char *optstr;
+
+ if (asprintf (&optstr, "OPTION touch-file=%s", tmpstr ) < 0 )
+ ;
+ else
+ {
+ assuan_transact (entry_ctx, optstr, NULL, NULL, NULL, NULL, NULL,
+ NULL);
+ free (optstr);
+ }
+ }
+
return 0;
}
diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c
index 72a4013d6..c88e22cc1 100644
--- a/agent/gpg-agent.c
+++ b/agent/gpg-agent.c
@@ -78,6 +78,7 @@ enum cmd_and_opt_values
oBatch,
oPinentryProgram,
+ oPinentryTouchFile,
oDisplay,
oTTYname,
oTTYtype,
@@ -131,6 +132,7 @@ static ARGPARSE_OPTS opts[] = {
{ oPinentryProgram, "pinentry-program", 2 ,
N_("|PGM|use PGM as the PIN-Entry program") },
+ { oPinentryTouchFile, "pinentry-touch-file", 2 , "@" },
{ oScdaemonProgram, "scdaemon-program", 2 ,
N_("|PGM|use PGM as the SCdaemon program") },
{ oDisableScdaemon, "disable-scdaemon", 0, N_("do not use the SCdaemon") },
@@ -401,6 +403,7 @@ parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread)
opt.debug = 0;
opt.no_grab = 0;
opt.pinentry_program = NULL;
+ opt.pinentry_touch_file = NULL;
opt.scdaemon_program = NULL;
opt.def_cache_ttl = DEFAULT_CACHE_TTL;
opt.def_cache_ttl_ssh = DEFAULT_CACHE_TTL_SSH;
@@ -437,6 +440,7 @@ parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread)
case oNoGrab: opt.no_grab = 1; break;
case oPinentryProgram: opt.pinentry_program = pargs->r.ret_str; break;
+ case oPinentryTouchFile: opt.pinentry_touch_file = pargs->r.ret_str; break;
case oScdaemonProgram: opt.scdaemon_program = pargs->r.ret_str; break;
case oDisableScdaemon: opt.disable_scdaemon = 1; break;
@@ -1186,6 +1190,16 @@ reread_configuration (void)
}
+/* Return the file name of the socket we are using for native
+ requests. */
+const char *
+get_agent_socket_name (void)
+{
+ const char *s = socket_name;
+
+ return (s && *s)? s : NULL;
+}
+
/* Create a name for the socket. With USE_STANDARD_SOCKET given as