aboutsummaryrefslogtreecommitdiffstats
path: root/scd/app.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2017-01-31 03:56:11 +0000
committerNIIBE Yutaka <[email protected]>2017-01-31 04:04:22 +0000
commitf08d37af049bf1718b301644020658dd2bb07638 (patch)
tree79861753e40e28f899f4b4c07f2fcf1c57891c0f /scd/app.c
parentgpgscm: Use a compact vector representation. (diff)
downloadgnupg-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.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/scd/app.c b/scd/app.c
index 2cf7d11ed..5b8da1c38 100644
--- a/scd/app.c
+++ b/scd/app.c
@@ -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