diff options
author | NIIBE Yutaka <[email protected]> | 2017-01-31 03:56:11 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2017-01-31 04:04:22 +0000 |
commit | f08d37af049bf1718b301644020658dd2bb07638 (patch) | |
tree | 79861753e40e28f899f4b4c07f2fcf1c57891c0f /scd/app.c | |
parent | gpgscm: Use a compact vector representation. (diff) | |
download | gnupg-f08d37af049bf1718b301644020658dd2bb07638.tar.gz gnupg-f08d37af049bf1718b301644020658dd2bb07638.zip |
scd: Fix SERIALNO for multiple devices.
* scd/app.c (select_application): Fix the logic if periodical check is
needed. If it is needed for newly found device(s), kick the loop.
(scd_update_reader_status_file): Return value if select(2) should be
called with timeout.
* scd/ccid-driver.c (ccid_require_get_status): Don't return 0 for
token with no interrupt transfer for now.
* scd/command.c (open_card_with_request): Fix scan by SERIALNO.
* scd/scdaemon.c (update_usb): Remove.
(handle_connections): Evaluate need_tick after handle_tick.
Signed-off-by: NIIBE Yutaka <[email protected]>
Diffstat (limited to '')
-rw-r--r-- | scd/app.c | 24 |
1 files changed, 13 insertions, 11 deletions
@@ -333,6 +333,7 @@ select_application (ctrl_t ctrl, const char *name, app_t *r_app, struct dev_list *l; int periodical_check_needed = 0; + /* Scan the devices to find new device(s). */ err = apdu_dev_list_start (opt.reader_port, &l); if (err) return err; @@ -340,14 +341,14 @@ select_application (ctrl_t ctrl, const char *name, app_t *r_app, while (1) { int slot; - int periodical_check_needed; + int periodical_check_needed_this; slot = apdu_open_reader (l); if (slot < 0) break; - periodical_check_needed = apdu_connect (slot); - if (periodical_check_needed < 0) + periodical_check_needed_this = apdu_connect (slot); + if (periodical_check_needed_this < 0) { /* We close a reader with no card. */ err = gpg_error (GPG_ERR_ENODEV); @@ -355,8 +356,8 @@ select_application (ctrl_t ctrl, const char *name, app_t *r_app, else { err = app_new_register (slot, ctrl, name, - periodical_check_needed); - if (periodical_check_needed) + periodical_check_needed_this); + if (periodical_check_needed_this) periodical_check_needed = 1; } @@ -365,7 +366,11 @@ select_application (ctrl_t ctrl, const char *name, app_t *r_app, } apdu_dev_list_finish (l); - update_usb (periodical_check_needed); + + /* If periodical check is needed for new device(s), kick the + scdaemon loop. */ + if (periodical_check_needed) + scd_kick_the_loop (); } npth_mutex_lock (&app_list_lock); @@ -1011,12 +1016,11 @@ report_change (int slot, int old_status, int cur_status) xfree (homestr); } -void +int scd_update_reader_status_file (void) { app_t a, app_next; int periodical_check_needed = 0; - int removal_detected = 0; npth_mutex_lock (&app_list_lock); for (a = app_top; a; a = app_next) @@ -1050,7 +1054,6 @@ scd_update_reader_status_file (void) log_debug ("Removal of a card: %d\n", a->slot); apdu_close_reader (a->slot); deallocate_app (a); - removal_detected = 1; } else { @@ -1067,8 +1070,7 @@ scd_update_reader_status_file (void) } npth_mutex_unlock (&app_list_lock); - if (removal_detected) - update_usb (periodical_check_needed); + return periodical_check_needed; } /* This function must be called once to initialize this module. This |