1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-05-28 21:50:02 +02:00

card: Take care of removed and re-inserted cards.

* tools/gpg-card.c (cmd_list): Take care of the need_sn_cmd flag.
(cmd_factoryreset): Clear that flag.
(dispatch_command): Set flag after a reset and after a
CARD_NOT_PRESENT error.
--
This commit is contained in:
Werner Koch 2020-05-27 11:27:32 +02:00
parent c2a47475ba
commit 46a3de4b5a
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
2 changed files with 19 additions and 4 deletions

View File

@ -1141,13 +1141,15 @@ cmd_list (card_info_t info, char *argstr)
goto leave; goto leave;
} }
if (!info->serialno) if (!info->serialno || info->need_sn_cmd)
{ {
/* This is probably the first call. We need to send a SERIALNO /* This is probably the first call or was explictly requested.
* command to scd so that our session knows all cards. */ * We need to send a SERIALNO command to scdaemon so that our
* session knows all cards. */
err = scd_serialno (NULL, NULL); err = scd_serialno (NULL, NULL);
if (err) if (err)
goto leave; goto leave;
info->need_sn_cmd = 0;
need_learn = 1; need_learn = 1;
} }
@ -2807,6 +2809,8 @@ cmd_factoryreset (card_info_t info)
/* Then, connect the card again. */ /* Then, connect the card again. */
err = scd_serialno (NULL, NULL); err = scd_serialno (NULL, NULL);
if (!err)
info->need_sn_cmd = 0;
leave: leave:
if (err && any_apdu && !is_yubikey) if (err && any_apdu && !is_yubikey)
@ -3272,6 +3276,8 @@ dispatch_command (card_info_t info, const char *orig_command)
{ {
flush_keyblock_cache (); flush_keyblock_cache ();
err = scd_apdu (NULL, NULL, NULL, NULL); err = scd_apdu (NULL, NULL, NULL, NULL);
if (!err)
info->need_sn_cmd = 1;
} }
break; break;
@ -3318,7 +3324,11 @@ dispatch_command (card_info_t info, const char *orig_command)
err = 0; err = 0;
} }
else else
log_error ("Command '%s' failed: %s\n", command, gpg_strerror (err)); {
log_error ("Command '%s' failed: %s\n", command, gpg_strerror (err));
if (gpg_err_code (err) == GPG_ERR_CARD_NOT_PRESENT)
info->need_sn_cmd = 1;
}
} }
xfree (command); xfree (command);
@ -3485,6 +3495,8 @@ interactive_loop (void)
{ {
flush_keyblock_cache (); flush_keyblock_cache ();
err = scd_apdu (NULL, NULL, NULL, NULL); err = scd_apdu (NULL, NULL, NULL, NULL);
if (!err)
info->need_sn_cmd = 1;
} }
break; break;
@ -3538,6 +3550,8 @@ interactive_loop (void)
break; break;
} }
log_error ("Command '%s' failed: %s\n", s, gpg_strerror (err)); log_error ("Command '%s' failed: %s\n", s, gpg_strerror (err));
if (gpg_err_code (err) == GPG_ERR_CARD_NOT_PRESENT)
info->need_sn_cmd = 1;
} }
} /* End of main menu loop. */ } /* End of main menu loop. */

View File

@ -138,6 +138,7 @@ typedef struct key_info_s *key_info_t;
struct card_info_s struct card_info_s
{ {
int initialized; /* True if a learn command was successful. */ int initialized; /* True if a learn command was successful. */
int need_sn_cmd; /* The SERIALNO command needs to be issued. */
int error; /* private. */ int error; /* private. */
char *reader; /* Reader information. */ char *reader; /* Reader information. */
char *cardtype; /* NULL or type of the card. */ char *cardtype; /* NULL or type of the card. */