@@ -35,8 +35,15 @@ do { if (lvl <= card->debug) { printf("ccid-card-emul: %s: " fmt , __func__, ##
#define EMULATED_DEV_NAME "ccid-card-emulated"
-#define BACKEND_NSS_EMULATED "nss-emulated" /* the default */
-#define BACKEND_CERTIFICATES "certificates"
+#define BACKEND_NSS_EMULATED_NAME "nss-emulated"
+#define BACKEND_CERTIFICATES_NAME "certificates"
+
+enum {
+ BACKEND_NSS_EMULATED=1,
+ BACKEND_CERTIFICATES
+};
+
+#define DEFAULT_BACKEND BACKEND_NSS_EMULATED
typedef struct EmulatedState EmulatedState;
@@ -88,7 +95,7 @@ typedef struct EmulEvent {
struct EmulatedState {
CCIDCardState base;
uint8_t debug;
- char* backend;
+ uint32_t backend;
char* cert1;
char* cert2;
char* cert3;
@@ -449,22 +456,20 @@ static int emulated_initfn(CCIDCardState *base)
if (init_pipe_signaling(card) < 0) {
return -1;
}
- if (!card->backend) {
- card->backend = strdup((char*)BACKEND_NSS_EMULATED);
- }
+ ASSERT(card->backend); /* 0 is not a value in the enumeration */
/* TODO: a passthru backened that works on local machine. third card type? */
- if (strcmp(BACKEND_CERTIFICATES, card->backend) == 0
+ if (card->backend == BACKEND_CERTIFICATES
&& card->cert1 != NULL && card->cert2 != NULL && card->cert3 != NULL) {
ret = emulated_initialize_vcard_from_certificates(card);
} else {
- if (strcmp(BACKEND_CERTIFICATES, card->backend) == 0) {
+ if (card->backend != BACKEND_CERTIFICATES) {
printf("%s: you must provide all three certs for certificates backend\n",
EMULATED_DEV_NAME);
return -1;
}
- if (card->backend && strcmp(BACKEND_NSS_EMULATED, card->backend) != 0) {
+ if (card->backend != BACKEND_NSS_EMULATED) {
printf("%s: bad backend specified. The options are:\n%s (default), %s.\n",
- EMULATED_DEV_NAME, BACKEND_NSS_EMULATED, BACKEND_CERTIFICATES);
+ EMULATED_DEV_NAME, BACKEND_NSS_EMULATED_NAME, BACKEND_CERTIFICATES_NAME);
return -1;
}
/* default to mirroring the local hardware readers */
@@ -507,6 +512,12 @@ static int emulated_exitfn(CCIDCardState *base)
return 0;
}
+EnumTable backend_enum_table[] = {
+ {BACKEND_NSS_EMULATED_NAME, BACKEND_NSS_EMULATED},
+ {BACKEND_CERTIFICATES_NAME, BACKEND_CERTIFICATES},
+ {NULL, 0},
+};
+
static CCIDCardInfo emulated_card_info = {
.qdev.name = EMULATED_DEV_NAME,
.qdev.size = sizeof(EmulatedState),
@@ -516,7 +527,7 @@ static CCIDCardInfo emulated_card_info = {
.apdu_from_guest = emulated_apdu_from_guest,
.qdev.unplug = qdev_simple_unplug_cb,
.qdev.props = (Property[]) {
- DEFINE_PROP_STRING("backend", EmulatedState, backend),
+ DEFINE_PROP_ENUM("backend", EmulatedState, backend, DEFAULT_BACKEND, backend_enum_table),
DEFINE_PROP_STRING("cert1", EmulatedState, cert1),
DEFINE_PROP_STRING("cert2", EmulatedState, cert2),
DEFINE_PROP_STRING("cert3", EmulatedState, cert3),
Signed-off-by: Alon Levy <alevy@redhat.com> --- hw/ccid-card-emulated.c | 33 ++++++++++++++++++++++----------- 1 files changed, 22 insertions(+), 11 deletions(-)