diff --git a/doc/tools/cardos-tool.1.xml b/doc/tools/cardos-tool.1.xml
index d3ed342b..4846fb3b 100644
--- a/doc/tools/cardos-tool.1.xml
+++ b/doc/tools/cardos-tool.1.xml
@@ -33,19 +33,6 @@ smart cards and similar security tokens based on Siemens Card/OS M4.
Options
-
-
- name,
- name
-
-
- Use the given card driver.
- The default is to auto-detect the correct card driver.
- The literal value ? lists
- all available card drivers and terminates
- cardos-tool.
-
-
,
diff --git a/src/tools/cardos-tool.c b/src/tools/cardos-tool.c
index d748846d..fcf275d9 100644
--- a/src/tools/cardos-tool.c
+++ b/src/tools/cardos-tool.c
@@ -39,6 +39,7 @@
#endif
#include "libopensc/opensc.h"
+#include "libopensc/cards.h"
#include "util.h"
static const char *app_name = "cardos-tool";
@@ -54,7 +55,6 @@ static const struct option options[] = {
{"startkey", 1, NULL, 's'},
{"change-startkey", 1, NULL, 'S'},
{"reader", 1, NULL, 'r'},
- {"card-driver", 1, NULL, 'c'},
{"wait", 0, NULL, 'w'},
{"verbose", 0, NULL, 'v'},
{NULL, 0, NULL, 0}
@@ -67,7 +67,6 @@ static const char *option_help[] = {
"Specify startkey for format",
"Change Startkey with given APDU command",
"Uses reader number [0]",
- "Forces the use of driver [auto-detect; '?' for list]",
"Wait for a card to be inserted",
"Verbose operation. Use several times to enable debug output.",
};
@@ -1034,22 +1033,16 @@ static int cardos_change_startkey(const char *change_startkey_apdu) {
int main(int argc, char *argv[])
{
- int err = 0, r, c, long_optind = 0;
+ int err = 0, r, c;
int do_info = 0;
int do_format = 0;
int do_change_startkey = 0;
- int do_list_card_drivers = 0;
int action_count = 0;
- const char *opt_driver = NULL;
const char *opt_startkey = NULL;
const char *opt_change_startkey = NULL;
sc_context_param_t ctx_param;
- while (1) {
- c = getopt_long(argc, argv, "hifs:r:vdc:wS:", options,
- &long_optind);
- if (c == -1)
- break;
+ while ((c = getopt_long(argc, argv, "hifs:r:vdwS:", options, (int *) 0)) != -1) {
switch (c) {
case 'h':
printf("NB! This tool is only for Siemens CardOS based cards!\n\n");
@@ -1076,19 +1069,11 @@ int main(int argc, char *argv[])
case 'v':
verbose++;
break;
- case 'c':
- opt_driver = optarg;
-
- /* special card driver value "?" means: list available drivers */
- if (opt_driver != NULL && strncmp("?", opt_driver, sizeof("?")) == 0) {
- opt_driver = NULL;
- do_list_card_drivers = 1;
- action_count++;
- }
- break;
case 'w':
opt_wait = 1;
break;
+ default:
+ util_print_usage_and_die(app_name, options, option_help, NULL);
}
}
@@ -1103,25 +1088,25 @@ int main(int argc, char *argv[])
return 1;
}
- if (do_list_card_drivers) {
- err = util_list_card_drivers(ctx);
+ /* force CardOS card driver */
+ err = sc_set_card_driver(ctx, "cardos");
+ if (err) {
+ fprintf(stderr, "CardOS card driver not found!\n");
+ err = 1;
goto end;
}
- if (opt_driver != NULL) {
- err = sc_set_card_driver(ctx, opt_driver);
- if (err) {
- fprintf(stderr, "Driver '%s' not found!\n",
- opt_driver);
- err = 1;
- goto end;
- }
- }
-
err = util_connect_card(ctx, &card, opt_reader, opt_wait, verbose);
if (err)
goto end;
+ /* fail if card is not a CardOS card */
+ if (card->type < SC_CARD_TYPE_CARDOS_BASE || card->type >= SC_CARD_TYPE_CARDOS_BASE+1000) {
+ fprintf(stderr, "Card type %X: not a CardOS card\n", card->type);
+ err = 1;
+ goto end;
+ }
+
if (do_info) {
if ((err = cardos_info())) {
goto end;