aboutsummaryrefslogtreecommitdiffstats
path: root/scd/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'scd/command.c')
-rw-r--r--scd/command.c90
1 files changed, 85 insertions, 5 deletions
diff --git a/scd/command.c b/scd/command.c
index 46c879e6b..60904429c 100644
--- a/scd/command.c
+++ b/scd/command.c
@@ -287,8 +287,7 @@ static const char hlp_serialno[] =
"If APPTYPE is given, an application of that type is selected and an\n"
"error is returned if the application is not supported or available.\n"
"The default is to auto-select the application using a hardwired\n"
- "preference system. Note, that a future extension to this function\n"
- "may enable specifying a list and order of applications to try.\n"
+ "preference system.\n"
"\n"
"This function is special in that it can be used to reset the card.\n"
"Most other functions will return an error when a card change has\n"
@@ -354,6 +353,70 @@ cmd_serialno (assuan_context_t ctx, char *line)
}
+
+static const char hlp_switchcard[] =
+ "SWITCHCARD [<serialno>]\n"
+ "\n"
+ "Make the card with SERIALNO the current card.\n"
+ "The command \"getinfo card_list\" can be used to list\n"
+ "the serial numbers of inserted and known cards. Note\n"
+ "that the command \"SERIALNO\" can be used to refresh\n"
+ "the list of known cards. A simple SERIALNO status\n"
+ "is printed on success.";
+static gpg_error_t
+cmd_switchcard (assuan_context_t ctx, char *line)
+{
+ ctrl_t ctrl = assuan_get_pointer (ctx);
+ gpg_error_t err = 0;
+ unsigned char *sn_bin = NULL;
+ size_t sn_bin_len = 0;
+
+ if ((err = open_card (ctrl)))
+ return err;
+
+ line = skip_options (line);
+
+ if (*line)
+ {
+ sn_bin = hex_to_buffer (line, &sn_bin_len);
+ if (!sn_bin)
+ {
+ err = gpg_error_from_syserror ();
+ goto leave;
+ }
+ }
+
+ /* Note that an SN_BIN of NULL will only print the status. */
+ err = app_switch_current_card (ctrl, sn_bin, sn_bin_len);
+
+ leave:
+ xfree (sn_bin);
+ return err;
+}
+
+
+static const char hlp_switchapp[] =
+ "SWITCHAPP [<appname>]\n"
+ "\n"
+ "Make APPNAME the active application for the current card.\n"
+ "Only some cards support switching between application; the\n"
+ "command \"getinfo active_app\" can be used to get a list of\n"
+ "applications which can be switched to. A SERIALNO status\n"
+ "including the active appname is printed on success.";
+static gpg_error_t
+cmd_switchapp (assuan_context_t ctx, char *line)
+{
+ ctrl_t ctrl = assuan_get_pointer (ctx);
+ gpg_error_t err = 0;
+
+ if ((err = open_card (ctrl)))
+ return err;
+
+ line = skip_options (line);
+ return app_switch_active_app (ctrl->card_ctx, ctrl, line);
+}
+
+
static const char hlp_learn[] =
"LEARN [--force] [--keypairinfo] [--multi]\n"
"\n"
@@ -1641,10 +1704,12 @@ static const char hlp_getinfo[] =
" app_list - Return a list of supported applications. One\n"
" application per line, fields delimited by colons,\n"
" first field is the name.\n"
- " card_list - Return a list of serial numbers of active cards,\n"
- " using a status response.\n"
+ " card_list - Return a list of serial numbers of all inserted cards.\n"
+ " active_apps - Return a list of active apps on the current card.\n"
+ " all_active_apps\n"
+ " - Return a list of active apps on all inserted cards.\n"
" cmd_has_option CMD OPT\n"
- " - Returns OK if command CMD has option OPT.\n";
+ " - Returns OK if command CMD has option OPT.\n";
static gpg_error_t
cmd_getinfo (assuan_context_t ctx, char *line)
{
@@ -1753,6 +1818,19 @@ cmd_getinfo (assuan_context_t ctx, char *line)
rc = app_send_card_list (ctrl);
}
+ else if (!strcmp (line, "active_apps"))
+ {
+ ctrl_t ctrl = assuan_get_pointer (ctx);
+ if (!ctrl->card_ctx)
+ rc = 0; /* No current card - no active apps. */
+ else
+ rc = app_send_active_apps (ctrl->card_ctx, ctrl);
+ }
+ else if (!strcmp (line, "all_active_apps"))
+ {
+ ctrl_t ctrl = assuan_get_pointer (ctx);
+ rc = app_send_active_apps (NULL, ctrl);
+ }
else
rc = set_error (GPG_ERR_ASS_PARAMETER, "unknown value for WHAT");
return rc;
@@ -2069,6 +2147,8 @@ register_commands (assuan_context_t ctx)
const char * const help;
} table[] = {
{ "SERIALNO", cmd_serialno, hlp_serialno },
+ { "SWITCHCARD", cmd_switchcard,hlp_switchcard },
+ { "SWITCHAPP", cmd_switchapp,hlp_switchapp },
{ "LEARN", cmd_learn, hlp_learn },
{ "READCERT", cmd_readcert, hlp_readcert },
{ "READKEY", cmd_readkey, hlp_readkey },