diff --git a/hw/usb/ccid-card-passthru.c b/hw/usb/ccid-card-passthru.c index 16d51c92954a05858e36eee972881476369b40a3..01c7e6f20dedd79b4d2ec01ec49b64869bc0a045 100644 --- a/hw/usb/ccid-card-passthru.c +++ b/hw/usb/ccid-card-passthru.c @@ -350,6 +350,8 @@ static int passthru_initfn(CCIDCardState *base) error_report("missing chardev"); return -1; } + card->debug = parse_debug_env("QEMU_CCID_PASSTHRU_DEBUG", D_VERBOSE, + card->debug); assert(sizeof(DEFAULT_ATR) <= MAX_ATR_SIZE); memcpy(card->atr, DEFAULT_ATR, sizeof(DEFAULT_ATR)); card->atr_length = sizeof(DEFAULT_ATR); diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.c index 98f3be1f0f065754ab2797d82b50638576543f13..35f234e6ad5bf79940f3ba59bd85528938d645a9 100644 --- a/hw/usb/dev-smartcard-reader.c +++ b/hw/usb/dev-smartcard-reader.c @@ -1260,6 +1260,7 @@ static int ccid_initfn(USBDevice *dev) s->bulk_out_pos = 0; ccid_reset_parameters(s); ccid_reset(s); + s->debug = parse_debug_env("QEMU_CCID_DEBUG", D_VERBOSE, s->debug); return 0; } diff --git a/include/qemu-common.h b/include/qemu-common.h index 3b1873e4ef5f4b7efea2ca862ef44c69f4107e14..a39cdba27f6744da9e15bcf80856fbd259cddcc7 100644 --- a/include/qemu-common.h +++ b/include/qemu-common.h @@ -482,4 +482,9 @@ can_use_buffer_find_nonzero_offset(const void *buf, size_t len) } size_t buffer_find_nonzero_offset(const void *buf, size_t len); +/* + * helper to parse debug environment variables + */ +int parse_debug_env(const char *name, int max, int initial); + #endif diff --git a/util/cutils.c b/util/cutils.c index 5024253405ac99b26e84a4566c5b14982c4b4046..a1658197cf66711944ddf36ac237e27e67739400 100644 --- a/util/cutils.c +++ b/util/cutils.c @@ -482,3 +482,26 @@ int uleb128_decode_small(const uint8_t *in, uint32_t *n) return 2; } } + +/* + * helper to parse debug environment variables + */ +int parse_debug_env(const char *name, int max, int initial) +{ + char *debug_env = getenv(name); + char *inv = NULL; + int debug; + + if (!debug_env) { + return initial; + } + debug = strtol(debug_env, &inv, 10); + if (inv == debug_env) { + return initial; + } + if (debug < 0 || debug > max) { + fprintf(stderr, "warning: %s not in [0, %d]", name, max); + return initial; + } + return debug; +}