/* Reset the card and free the application context. With SEND_RESET
set to true actually send a RESET to the reader; this is the normal
- way of calling the function. */
+ way of calling the function. If KEEP_LOCK is set and the session
+ is locked that lock wil not be released. */
static void
-do_reset (ctrl_t ctrl, int send_reset)
+do_reset (ctrl_t ctrl, int send_reset, int keep_lock)
{
app_t app = ctrl->app_ctx;
app_reset (app, ctrl, IS_LOCKED (ctrl)? 0: send_reset);
/* If we hold a lock, unlock now. */
- if (locked_session && ctrl->server_local == locked_session)
+ if (!keep_lock && locked_session && ctrl->server_local == locked_session)
{
locked_session = NULL;
log_info ("implicitly unlocking due to RESET\n");
{
ctrl_t ctrl = assuan_get_pointer (ctx);
- (void) line;
-
- do_reset (ctrl, 1);
+ do_reset (ctrl, 1, has_option (line, "--keep-lock"));
return 0;
}
else
demand = NULL;
+ line = skip_options (line);
+
/* Clear the remove flag so that the open_card is able to reread it. */
if (ctrl->server_local->card_removed)
ctrl->server_local->card_removed = 0;
" entry system, only the regular CHV will get blocked and not the\n"
" dangerous CHV3. IDSTR is the usual card's serial number in hex\n"
" notation; an optional fingerprint part will get ignored. There\n"
- " is however a special mode if the IDSTR is sffixed with the\n"
+ " is however a special mode if the IDSTR is suffixed with the\n"
" literal string \"[CHV3]\": In this case the Admin PIN is checked\n"
" if and only if the retry counter is still at 3.\n"
"\n"
npth_sleep (1); /* Better implement an event mechanism. However,
for card operations this should be
sufficient. */
- /* FIXME: Need to check that the connection is still alive.
- This can be done by issuing status messages. */
- goto retry;
+ /* Send a progress so that we can detect a connection loss. */
+ rc = send_status_printf (ctrl, "PROGRESS", "scd_locked . 0 0");
+ if (!rc)
+ goto retry;
}
#endif /*USE_NPTH*/
}
/* Cleanup. We don't send an explicit reset to the card. */
- do_reset (ctrl, 0);
+ do_reset (ctrl, 0, 0);
/* Release the server object. */
if (session_list == ctrl->server_local)