aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2017-03-27 05:02:01 +0000
committerNIIBE Yutaka <[email protected]>2017-03-27 05:02:01 +0000
commitc1e6302b347caf852a056b9c721469ccb51f44da (patch)
tree920546cd3c6c252c64e1d5c0c8981e1054a13d1c
parentscd: Change the order of applications when accessed. (diff)
downloadgnupg-c1e6302b347caf852a056b9c721469ccb51f44da.tar.gz
gnupg-c1e6302b347caf852a056b9c721469ccb51f44da.zip
g10: Support specifying SERIALNO for --card-status.
* g10/gpg.c (main): Allow an argument for --card-status. * g10/card-util.c (current_card_status): Rename from card_status. (card_status): New, which supports multiple cards. (get_one_name): Use current_card_status. Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--g10/card-util.c74
-rw-r--r--g10/gpg.c9
-rw-r--r--g10/main.h2
3 files changed, 76 insertions, 9 deletions
diff --git a/g10/card-util.c b/g10/card-util.c
index d643724d4..b88a9ed70 100644
--- a/g10/card-util.c
+++ b/g10/card-util.c
@@ -361,8 +361,8 @@ fpr_is_ff (const char *fpr)
/* Print all available information about the current card. */
-void
-card_status (estream_t fp, char *serialno, size_t serialnobuflen)
+static void
+current_card_status (estream_t fp, char *serialno, size_t serialnobuflen)
{
struct agent_card_info_s info;
PKT_public_key *pk = xcalloc (1, sizeof *pk);
@@ -625,6 +625,70 @@ card_status (estream_t fp, char *serialno, size_t serialnobuflen)
}
+/* Print all available information for specific card with SERIALNO.
+ Print all available information for current card when SERIALNO is NULL.
+ Or print llfor all cards when SERIALNO is "all". */
+void
+card_status (estream_t fp, const char *serialno)
+{
+ int err;
+ strlist_t card_list, sl;
+ char *serialno0;
+ int all_cards = 0;
+
+ if (serialno == NULL)
+ {
+ current_card_status (fp, NULL, 0);
+ return;
+ }
+
+ if (!strcmp (serialno, "all"))
+ all_cards = 1;
+
+ err = agent_scd_serialno (&serialno0, NULL);
+ if (err)
+ {
+ if (gpg_err_code (err) != GPG_ERR_ENODEV && opt.verbose)
+ log_info (_("error getting serial number of card: %s\n"),
+ gpg_strerror (err));
+ /* Nothing available. */
+ return;
+ }
+
+ err = agent_scd_cardlist (&card_list);
+
+ for (sl = card_list; sl; sl = sl->next)
+ {
+ char *serialno1;
+
+ if (!all_cards && strcmp (serialno, sl->d))
+ continue;
+
+ err = agent_scd_serialno (&serialno1, sl->d);
+ if (err)
+ {
+ if (opt.verbose)
+ log_info (_("error getting serial number of card: %s\n"),
+ gpg_strerror (err));
+ continue;
+ }
+
+ current_card_status (fp, NULL, 0);
+ xfree (serialno1);
+
+ if (!all_cards)
+ goto leave;
+ }
+
+ /* Select the original card again. */
+ err = agent_scd_serialno (&serialno0, serialno0);
+
+ leave:
+ xfree (serialno0);
+ free_strlist (card_list);
+}
+
+
static char *
get_one_name (const char *prompt1, const char *prompt2)
{
@@ -1919,16 +1983,16 @@ card_edit (ctrl_t ctrl, strlist_t commands)
int cmd_admin_only;
tty_printf("\n");
- if (redisplay )
+ if (redisplay)
{
if (opt.with_colons)
{
- card_status (es_stdout, serialnobuf, DIM (serialnobuf));
+ current_card_status (es_stdout, serialnobuf, DIM (serialnobuf));
fflush (stdout);
}
else
{
- card_status (NULL, serialnobuf, DIM (serialnobuf));
+ current_card_status (NULL, serialnobuf, DIM (serialnobuf));
tty_printf("\n");
}
redisplay = 0;
diff --git a/g10/gpg.c b/g10/gpg.c
index b3d606bc5..507422c73 100644
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -4791,9 +4791,12 @@ main (int argc, char **argv)
#ifdef ENABLE_CARD_SUPPORT
case aCardStatus:
- if (argc)
- wrong_args ("--card-status");
- card_status (es_stdout, NULL, 0);
+ if (argc == 0)
+ card_status (es_stdout, NULL);
+ else if (argc == 1)
+ card_status (es_stdout, *argv);
+ else
+ wrong_args ("--card-status [serialno]");
break;
case aCardEdit:
diff --git a/g10/main.h b/g10/main.h
index 32d323b6b..96e55620f 100644
--- a/g10/main.h
+++ b/g10/main.h
@@ -485,7 +485,7 @@ gpg_error_t gpg_proxy_pinentry_notify (ctrl_t ctrl,
#ifdef ENABLE_CARD_SUPPORT
/*-- card-util.c --*/
void change_pin (int no, int allow_admin);
-void card_status (estream_t fp, char *serialno, size_t serialnobuflen);
+void card_status (estream_t fp, const char *serialno);
void card_edit (ctrl_t ctrl, strlist_t commands);
gpg_error_t card_generate_subkey (KBNODE pub_keyblock);
int card_store_subkey (KBNODE node, int use);