Enable readline support in --card-edit.
authorWerner Koch <wk@gnupg.org>
Wed, 5 Aug 2009 13:48:23 +0000 (13:48 +0000)
committerWerner Koch <wk@gnupg.org>
Wed, 5 Aug 2009 13:48:23 +0000 (13:48 +0000)
better cope with re-inserted cards.

g10/ChangeLog
g10/call-agent.c
g10/card-util.c

index 781ec57..4137f1d 100644 (file)
@@ -1,5 +1,9 @@
 2009-08-05  Werner Koch  <wk@g10code.com>
 
+       * card-util.c: Enable readline support also in GnuPG-2.
+       
+       * call-agent.c (agent_learn): Always select the card first.
+
        * gpg.c: Add --key-edit alias.
 
        * call-agent.c (scd_genkey_cb): Forward progress status lines.
index 8a0b21a..64b5cd8 100644 (file)
@@ -458,6 +458,19 @@ agent_learn (struct agent_card_info_s *info)
   if (rc)
     return rc;
 
+  /* Send the serialno command to initialize the connection.  We don't
+     care about the data returned.  If the card has already been
+     initialized, this is a very fast command.  The main reason we
+     need to do this here is to handle a card removed case so that an
+     "l" command in --card-edit can be used to show ta newly inserted
+     card.  We request the openpgp card because that is what we
+     expect. */
+  rc = assuan_transact (agent_ctx, "SCD SERIALNO openpgp",
+                        NULL, NULL, NULL, NULL, NULL, NULL);
+  if (rc)
+    return rc;
+
+
   memset (info, 0, sizeof *info);
   rc = assuan_transact (agent_ctx, "SCD LEARN --force",
                         dummy_data_cb, NULL, default_inq_cb, NULL,
index 5ba42b8..61fd311 100644 (file)
 #include <string.h>
 #include <errno.h>
 #include <assert.h>
+#ifdef HAVE_LIBREADLINE
+# define GNUPG_LIBREADLINE_H_INCLUDED
+# include <readline/readline.h>
+#endif /*HAVE_LIBREADLINE*/
 
 #if GNUPG_MAJOR_VERSION != 1
 # include "gpg.h"
 #include "options.h"
 #include "main.h"
 #include "keyserver-internal.h"
+
 #if GNUPG_MAJOR_VERSION == 1
-# ifdef HAVE_LIBREADLINE
-# define GNUPG_LIBREADLINE_H_INCLUDED
-# include <stdio.h>
-# include <readline/readline.h>
-# endif /*HAVE_LIBREADLINE*/
 # include "cardglue.h"
 #else /*GNUPG_MAJOR_VERSION!=1*/
 # include "call-agent.h"
@@ -1704,7 +1704,7 @@ static struct
   };
 
 
-#if GNUPG_MAJOR_VERSION == 1 && defined (HAVE_LIBREADLINE)
+#ifdef HAVE_LIBREADLINE
 
 /* These two functions are used by readline for command completion. */
 
@@ -1737,6 +1737,7 @@ command_generator(const char *text,int state)
 static char **
 card_edit_completion(const char *text, int start, int end)
 {
+  (void)end;
   /* If we are at the start of a line, we try and command-complete.
      If not, just do nothing for now. */
 
@@ -1747,7 +1748,7 @@ card_edit_completion(const char *text, int start, int end)
 
   return NULL;
 }
-#endif /* GNUPG_MAJOR_VERSION == 1 && HAVE_LIBREADLINE */
+#endif /*HAVE_LIBREADLINE*/
 
 /* Menu to edit all user changeable values on an OpenPGP card.  Only
    Key creation is not handled here. */
@@ -1815,15 +1816,11 @@ card_edit (strlist_t commands)
 
            if (!have_commands)
               {
-#if GNUPG_MAJOR_VERSION == 1
                tty_enable_completion (card_edit_completion);
-#endif
                answer = cpr_get_no_help("cardedit.prompt", _("Command> "));
                cpr_kill_prompt();
-#if GNUPG_MAJOR_VERSION == 1
                tty_disable_completion ();
-#endif
-           }
+              }
            trim_spaces(answer);
        }
       while ( *answer == '#' );