Add option --no-ask for GET_PASSPHRASE.
[gnupg.git] / agent / command.c
index f578762..b2903f6 100644 (file)
@@ -836,7 +836,7 @@ send_back_passphrase (assuan_context_t ctx, int via_data, const char *pw)
 }
 
 
-/* GET_PASSPHRASE [--data] [--check] <cache_id>
+/* GET_PASSPHRASE [--data] [--check] [--no-ask] <cache_id>
                   [<error_message> <prompt> <description>]
 
    This function is usually used to ask for a passphrase to be used
@@ -853,6 +853,10 @@ send_back_passphrase (assuan_context_t ctx, int via_data, const char *pw)
    If the option "--check" is used the passphrase constraints checks as
    implemented by gpg-agent are applied.  A check is not done if the
    passphrase has been found in the cache.
+
+   If the option "--no-ask" is used and the passphrase is not in the
+   cache the user will not be asked to enter a passphrase but the error
+   code GPG_ERR_NO_DATA is returned.  
 */
 
 static int
@@ -865,10 +869,11 @@ cmd_get_passphrase (assuan_context_t ctx, char *line)
   char *cacheid = NULL, *desc = NULL, *prompt = NULL, *errtext = NULL;
   char *p;
   void *cache_marker;
-  int opt_data, opt_check;
+  int opt_data, opt_check, opt_no_ask;
 
   opt_data = has_option (line, "--data");
   opt_check = has_option (line, "--check");
+  opt_no_ask = has_option (line, "--no-ask");
   line = skip_options (line);
 
   cacheid = line;
@@ -920,6 +925,8 @@ cmd_get_passphrase (assuan_context_t ctx, char *line)
       rc = send_back_passphrase (ctx, opt_data, pw);
       agent_unlock_cache_entry (&cache_marker);
     }
+  else if (opt_no_ask)
+    rc = gpg_error (GPG_ERR_NO_DATA);
   else
     {
       /* Note, that we only need to replace the + characters and
@@ -1093,7 +1100,7 @@ cmd_passwd (assuan_context_t ctx, char *line)
   return rc;
 }
 
-/* PRESET_PASSPHRASE <hexstring_with_keygrip> <timeout> <hexstring>
+/* PRESET_PASSPHRASE <string_or_keygrip> <timeout> <hexstring>
   
    Set the cached passphrase/PIN for the key identified by the keygrip
    to passwd for the given time, where -1 means infinite and 0 means
@@ -1104,7 +1111,6 @@ static int
 cmd_preset_passphrase (assuan_context_t ctx, char *line)
 {
   int rc;
-  unsigned char grip[20];
   char *grip_clear = NULL;
   char *passphrase = NULL;
   int ttl;
@@ -1113,11 +1119,6 @@ cmd_preset_passphrase (assuan_context_t ctx, char *line)
   if (!opt.allow_preset_passphrase)
     return set_error (GPG_ERR_NOT_SUPPORTED, "no --allow-preset-passphrase");
 
-  rc = parse_keygrip (ctx, line, grip);
-  if (rc)
-    return rc;
-
-  /* FIXME: parse_keygrip should return a tail pointer.  */
   grip_clear = line;
   while (*line && (*line != ' ' && *line != '\t'))
     line++;
@@ -1159,7 +1160,7 @@ cmd_preset_passphrase (assuan_context_t ctx, char *line)
     rc = agent_put_cache (grip_clear, CACHE_MODE_ANY, passphrase, ttl);
 
   if (rc)
-    log_error ("command preset_passwd failed: %s\n", gpg_strerror (rc));
+    log_error ("command preset_passphrase failed: %s\n", gpg_strerror (rc));
 
   return rc;
 }
@@ -1362,8 +1363,11 @@ static int
 cmd_killagent (assuan_context_t ctx, char *line)
 {
   ctrl_t ctrl = assuan_get_pointer (ctx);
+
+  (void)line;
+
   ctrl->server_local->stopme = 1;
-  return 0;
+  return gpg_error (GPG_ERR_EOF);
 }
 
 /* RELOADAGENT
@@ -1373,6 +1377,9 @@ cmd_killagent (assuan_context_t ctx, char *line)
 static int
 cmd_reloadagent (assuan_context_t ctx, char *line)
 {
+  (void)ctx;
+  (void)line;
+
   agent_sighup_action ();
   return 0;
 }
@@ -1666,7 +1673,7 @@ start_command_handler (ctrl_t ctrl, gnupg_fd_t listen_fd, gnupg_fd_t fd)
   for (;;)
     {
       rc = assuan_accept (ctx);
-      if (rc == -1)
+      if (gpg_err_code (rc) == GPG_ERR_EOF || rc == -1)
         {
           break;
         }