Patchwork [14/20] ccid-card-emulated: use PROP_TYPE_ENUM for backend

login
register
mail settings
Submitter Alon Levy
Date Feb. 2, 2011, 8:28 p.m.
Message ID <1296678500-19497-15-git-send-email-alevy@redhat.com>
Download mbox | patch
Permalink /patch/81534/
State New
Headers show

Comments

Alon Levy - Feb. 2, 2011, 8:28 p.m.
Signed-off-by: Alon Levy <alevy@redhat.com>
---
 hw/ccid-card-emulated.c |   33 ++++++++++++++++++++++-----------
 1 files changed, 22 insertions(+), 11 deletions(-)

Patch

diff --git a/hw/ccid-card-emulated.c b/hw/ccid-card-emulated.c
index 5531ce1..3c5bf6c 100644
--- a/hw/ccid-card-emulated.c
+++ b/hw/ccid-card-emulated.c
@@ -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),