summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scd/app.c9
-rw-r--r--scd/command.c17
-rw-r--r--scd/scdaemon.h6
3 files changed, 29 insertions, 3 deletions
diff --git a/scd/app.c b/scd/app.c
index d9b762994..61ae5c27a 100644
--- a/scd/app.c
+++ b/scd/app.c
@@ -519,9 +519,13 @@ app_new_register (int slot, ctrl_t ctrl, const char *name,
}
card->periodical_check_needed = periodical_check_needed;
-
card->next = card_top;
card_top = card;
+
+ /* If no current apptype is known for this session, set it now. */
+ if (!ctrl->current_apptype)
+ ctrl->current_apptype = app->apptype;
+
unlock_card (card);
return 0;
}
@@ -684,8 +688,9 @@ deallocate_card (card_t card)
xfree (a);
}
- xfree (card->serialno);
+ scd_clear_current_app (card);
+ xfree (card->serialno);
unlock_card (card);
xfree (card);
}
diff --git a/scd/command.c b/scd/command.c
index 3c63ef5fd..c45737376 100644
--- a/scd/command.c
+++ b/scd/command.c
@@ -2069,6 +2069,21 @@ scd_command_handler (ctrl_t ctrl, int fd)
}
+/* Clear the current application info for CARD from all sessions.
+ * This is used while deallocating a card. */
+void
+scd_clear_current_app (card_t card)
+{
+ struct server_local_s *sl;
+
+ for (sl=session_list; sl; sl = sl->next_session)
+ {
+ if (sl->ctrl_backlink->card_ctx == card)
+ sl->ctrl_backlink->current_apptype = APPTYPE_NONE;
+ }
+}
+
+
/* Send a line with status information via assuan and escape all given
buffers. The variable elements are pairs of (char *, size_t),
terminated with a (NULL, 0). */
@@ -2181,7 +2196,7 @@ popup_prompt (void *opaque, int on)
/* Helper to send the clients a status change notification. Note that
- * this fucntion assumes that APP is already locked. */
+ * this function assumes that APP is already locked. */
void
send_client_notifications (card_t card, int removal)
{
diff --git a/scd/scdaemon.h b/scd/scdaemon.h
index d9c476d52..7ebf6b58d 100644
--- a/scd/scdaemon.h
+++ b/scd/scdaemon.h
@@ -106,6 +106,11 @@ struct server_control_s
application context. */
struct card_ctx_s *card_ctx;
+ /* The currently active application for this context. We need to
+ * knw this for cards which are abale to swicth on the fly between
+ * apps. */
+ apptype_t current_apptype;
+
/* Helper to store the value we are going to sign */
struct
{
@@ -122,6 +127,7 @@ const char *scd_get_socket_name (void);
/*-- command.c --*/
gpg_error_t initialize_module_command (void);
int scd_command_handler (ctrl_t, int);
+void scd_clear_current_app (card_t card);
void send_status_info (ctrl_t ctrl, const char *keyword, ...)
GPGRT_ATTR_SENTINEL(1);
void send_status_direct (ctrl_t ctrl, const char *keyword, const char *args);