diff options
author | Werner Koch <[email protected]> | 2009-07-16 15:54:59 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2009-07-16 15:54:59 +0000 |
commit | e49d808e1f02d8f01c60753022bc20664b215062 (patch) | |
tree | dd65f9e2f0eb20d949e56852c22ee3cb0aba31a9 /scd/command.c | |
parent | [g10] (diff) | |
download | gnupg-e49d808e1f02d8f01c60753022bc20664b215062.tar.gz gnupg-e49d808e1f02d8f01c60753022bc20664b215062.zip |
Add code to better handle unplugging of a reader.
Diffstat (limited to '')
-rw-r--r-- | scd/command.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/scd/command.c b/scd/command.c index ae1f4981b..1fdcf7d51 100644 --- a/scd/command.c +++ b/scd/command.c @@ -54,12 +54,14 @@ #define set_error(e,t) assuan_set_error (ctx, gpg_error (e), (t)) -/* Macro to flag a removed card. */ +/* Macro to flag a removed card. ENODEV is also tested to catch teh + case of a removed reader. */ #define TEST_CARD_REMOVAL(c,r) \ do { \ int _r = (r); \ if (gpg_err_code (_r) == GPG_ERR_CARD_NOT_PRESENT \ - || gpg_err_code (_r) == GPG_ERR_CARD_REMOVED) \ + || gpg_err_code (_r) == GPG_ERR_CARD_REMOVED \ + || gpg_err_code (_r) == GPG_ERR_ENODEV ) \ update_card_removed ((c)->reader_slot, 1); \ } while (0) @@ -2159,7 +2161,13 @@ update_reader_status_file (int set_card_removed_flag) continue; /* Not valid or reader not yet open. */ sw_apdu = apdu_get_status (ss->slot, 0, &status, &changed); - if (sw_apdu) + if (sw_apdu == SW_HOST_NO_READER) + { + /* Most likely the _reader_ has been unplugged. */ + status = 0; + changed = ss->changed; + } + else if (sw_apdu) { /* Get status failed. Ignore that. */ continue; |