X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhwdriver.c;h=24a52db3450864eb10ef7b4f6d10f4f48117fb43;hb=adfba7368ac297bba20b0afbc7d7322309508b30;hp=c7dc616ca9f959e2f21ce6a27771c19c2f749a0f;hpb=6fad08e6abfa4e5ee708f584e530c6b611a65cdb;p=libsigrok.git diff --git a/src/hwdriver.c b/src/hwdriver.c index c7dc616c..24a52db3 100644 --- a/src/hwdriver.c +++ b/src/hwdriver.c @@ -277,6 +277,50 @@ SR_API int sr_driver_init(struct sr_context *ctx, struct sr_dev_driver *driver) return ret; } +static int check_options(struct sr_dev_driver *driver, GSList *options, + uint32_t optlist_key, struct sr_dev_inst *sdi, + struct sr_channel_group *cg) +{ + struct sr_config *src; + const struct sr_config_info *srci; + GVariant *gvar_opts; + GSList *l; + const uint32_t *opts; + gsize num_opts, i; + int ret; + + if (sr_config_list(driver, sdi, cg, optlist_key, &gvar_opts) != SR_OK) { + /* Driver publishes no options for this optlist. */ + return SR_ERR; + } + + ret = SR_OK; + opts = g_variant_get_fixed_array(gvar_opts, &num_opts, sizeof(uint32_t)); + for (l = options; l; l = l->next) { + src = l->data; + for (i = 0; i < num_opts; i++) { + if (opts[i] == src->key) + break; + } + if (i == num_opts) { + if (!(srci = sr_config_info_get(src->key))) + /* Shouldn't happen. */ + sr_err("Invalid option %d.", src->key); + else + sr_err("Invalid option '%s'.", srci->id); + ret = SR_ERR_ARG; + break; + } + if (sr_variant_type_check(src->key, src->data) != SR_OK) { + ret = SR_ERR_ARG; + break; + } + } + g_variant_unref(gvar_opts); + + return ret; +} + /** * Tell a hardware driver to scan for devices. * @@ -305,7 +349,6 @@ SR_API int sr_driver_init(struct sr_context *ctx, struct sr_dev_driver *driver) SR_API GSList *sr_driver_scan(struct sr_dev_driver *driver, GSList *options) { GSList *l; - struct sr_config *src; if (!driver) { sr_err("Invalid driver, can't scan for devices."); @@ -317,9 +360,8 @@ SR_API GSList *sr_driver_scan(struct sr_dev_driver *driver, GSList *options) return NULL; } - for (l = options; l; l = l->next) { - src = l->data; - if (sr_variant_type_check(src->key, src->data) != SR_OK) + if (options) { + if (check_options(driver, options, SR_CONF_SCAN_OPTIONS, NULL, NULL) != SR_OK) return NULL; }