1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-05-27 21:41:23 +02:00

card: New flag --reread for LIST.

* tools/gpg-card.c (cmd_list): Add flag --reread.
* tools/card-call-scd.c (scd_learn): New arg reread.

* tools/card-call-scd.c (release_card_info): Fix releasing of the new
label var.

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2021-04-01 10:34:06 +02:00
parent ff87f4e578
commit c727951a24
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
3 changed files with 16 additions and 11 deletions

View File

@ -157,7 +157,7 @@ release_card_info (card_info_t info)
while (info->kinfo) while (info->kinfo)
{ {
key_info_t kinfo = info->kinfo->next; key_info_t kinfo = info->kinfo->next;
xfree (kinfo->label); xfree (info->kinfo->label);
xfree (info->kinfo); xfree (info->kinfo);
info->kinfo = kinfo; info->kinfo = kinfo;
} }
@ -1151,7 +1151,7 @@ learn_status_cb (void *opaque, const char *line)
/* Call the scdaemon to learn about a smartcard. This fills INFO /* Call the scdaemon to learn about a smartcard. This fills INFO
* with data from the card. */ * with data from the card. */
gpg_error_t gpg_error_t
scd_learn (card_info_t info) scd_learn (card_info_t info, int reread)
{ {
gpg_error_t err; gpg_error_t err;
struct default_inq_parm_s parm; struct default_inq_parm_s parm;
@ -1168,7 +1168,9 @@ scd_learn (card_info_t info)
return err; return err;
parm.ctx = agent_ctx; parm.ctx = agent_ctx;
err = assuan_transact (agent_ctx, "SCD LEARN --force", err = assuan_transact (agent_ctx,
reread? "SCD LEARN --force --reread"
/* */: "SCD LEARN --force",
dummy_data_cb, NULL, default_inq_cb, &parm, dummy_data_cb, NULL, default_inq_cb, &parm,
learn_status_cb, info); learn_status_cb, info);
/* Also try to get some other key attributes. */ /* Also try to get some other key attributes. */

View File

@ -1129,7 +1129,7 @@ static gpg_error_t
cmd_list (card_info_t info, char *argstr) cmd_list (card_info_t info, char *argstr)
{ {
gpg_error_t err; gpg_error_t err;
int opt_cards, opt_apps, opt_info, opt_no_key_lookup; int opt_cards, opt_apps, opt_info, opt_reread, opt_no_key_lookup;
strlist_t cards = NULL; strlist_t cards = NULL;
strlist_t sl; strlist_t sl;
estream_t fp = opt.interactive? NULL : es_stdout; estream_t fp = opt.interactive? NULL : es_stdout;
@ -1140,7 +1140,8 @@ cmd_list (card_info_t info, char *argstr)
if (!info) if (!info)
return print_help return print_help
("LIST [--cards] [--apps] [--info] [--no-key-lookup] [N] [APP]\n\n" ("LIST [--cards] [--apps] [--info] [--reread]"
" [--no-key-lookup] [N] [APP]\n\n"
"Show the content of the current card.\n" "Show the content of the current card.\n"
"With N given select and list the N-th card;\n" "With N given select and list the N-th card;\n"
"with APP also given select that application.\n" "with APP also given select that application.\n"
@ -1149,12 +1150,14 @@ cmd_list (card_info_t info, char *argstr)
" --cards lists available cards\n" " --cards lists available cards\n"
" --apps lists additional card applications\n" " --apps lists additional card applications\n"
" --info selects a card and prints its s/n\n" " --info selects a card and prints its s/n\n"
" --reread read infos from PCKS#15 cards again\n"
" --no-key-lookup does not list matching OpenPGP or X.509 keys\n" " --no-key-lookup does not list matching OpenPGP or X.509 keys\n"
, 0); , 0);
opt_cards = has_leading_option (argstr, "--cards"); opt_cards = has_leading_option (argstr, "--cards");
opt_apps = has_leading_option (argstr, "--apps"); opt_apps = has_leading_option (argstr, "--apps");
opt_info = has_leading_option (argstr, "--info"); opt_info = has_leading_option (argstr, "--info");
opt_reread = has_leading_option (argstr, "--reread");
opt_no_key_lookup = has_leading_option (argstr, "--no-key-lookup"); opt_no_key_lookup = has_leading_option (argstr, "--no-key-lookup");
argstr = skip_options (argstr); argstr = skip_options (argstr);
@ -1284,7 +1287,7 @@ cmd_list (card_info_t info, char *argstr)
} }
if (need_learn) if (need_learn)
err = scd_learn (info); err = scd_learn (info, opt_reread);
else else
err = 0; err = 0;
@ -2669,7 +2672,7 @@ cmd_generate (card_info_t info, char *argstr)
if (!err) if (!err)
{ {
err = scd_learn (info); err = scd_learn (info, 0);
if (err) if (err)
log_error ("Error re-reading card: %s\n", gpg_strerror (err)); log_error ("Error re-reading card: %s\n", gpg_strerror (err));
} }
@ -3026,7 +3029,7 @@ cmd_factoryreset (card_info_t info)
* specific resset command. * specific resset command.
*/ */
err = scd_learn (info); err = scd_learn (info, 0);
if (gpg_err_code (err) == GPG_ERR_OBJ_TERM_STATE if (gpg_err_code (err) == GPG_ERR_OBJ_TERM_STATE
&& gpg_err_source (err) == GPG_ERR_SOURCE_SCD) && gpg_err_source (err) == GPG_ERR_SOURCE_SCD)
termstate = 1; termstate = 1;
@ -3482,7 +3485,7 @@ cmd_yubikey (card_info_t info, char *argstr)
/* Note that we always do a learn to get a chance to the card back /* Note that we always do a learn to get a chance to the card back
* into a usable state. */ * into a usable state. */
err = yubikey_commands (info, fp, nwords, words); err = yubikey_commands (info, fp, nwords, words);
err2 = scd_learn (info); err2 = scd_learn (info, 0);
if (err2) if (err2)
log_error ("Error re-reading card: %s\n", gpg_strerror (err)); log_error ("Error re-reading card: %s\n", gpg_strerror (err));
@ -3718,7 +3721,7 @@ dispatch_command (card_info_t info, const char *orig_command)
|| cmd == cmdINVCMD) || cmd == cmdINVCMD)
&& !info->initialized) && !info->initialized)
{ {
err = scd_learn (info); err = scd_learn (info, 0);
if (err) if (err)
{ {
err = fixup_scd_errors (err); err = fixup_scd_errors (err);

View File

@ -227,7 +227,7 @@ gpg_error_t scd_apdu (const char *hexapdu, const char *options,
gpg_error_t scd_switchcard (const char *serialno); gpg_error_t scd_switchcard (const char *serialno);
gpg_error_t scd_switchapp (const char *appname); gpg_error_t scd_switchapp (const char *appname);
gpg_error_t scd_learn (card_info_t info); gpg_error_t scd_learn (card_info_t info, int reread);
gpg_error_t scd_getattr (const char *name, struct card_info_s *info); gpg_error_t scd_getattr (const char *name, struct card_info_s *info);
gpg_error_t scd_setattr (const char *name, gpg_error_t scd_setattr (const char *name,
const unsigned char *value, size_t valuelen); const unsigned char *value, size_t valuelen);