From 1114bf591d99cff46c704ad95ad1b72ab4067c75 Mon Sep 17 00:00:00 2001 From: Pawel Szewczyk Date: Thu, 25 Jun 2015 14:54:27 +0200 Subject: [PATCH] gadget: Separate parsing from implementation When passing attributes to 'gadget create' subcommand we need to translate string list to actual configfs attributes. It should be done in parsing function. Change-Id: If7f927a6f8b9000d6b7bd0479ac24acba86ee32c Signed-off-by: Pawel Szewczyk --- source/gadget/src/gadget.c | 121 +++++++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 59 deletions(-) diff --git a/source/gadget/src/gadget.c b/source/gadget/src/gadget.c index 0d6fb47..12be57b 100644 --- a/source/gadget/src/gadget.c +++ b/source/gadget/src/gadget.c @@ -38,7 +38,8 @@ static const struct { struct gt_gadget_create_data { const char *name; - struct gt_setting *attrs; + int attr_val[USBG_GADGET_ATTR_MAX]; + char *str_val[ARRAY_SIZE(strs)]; int opts; }; @@ -49,7 +50,6 @@ static void gt_gadget_create_destructor(void *data) if (data == NULL) return; dt = (struct gt_gadget_create_data *)data; - gt_setting_list_cleanup(dt->attrs); free(dt); } @@ -92,58 +92,11 @@ static int attr_val_in_range(usbg_gadget_attr a, unsigned long int val) static int gt_gadget_create_func(void *data) { struct gt_gadget_create_data *dt; - struct gt_setting *setting; - int attr_val[USBG_GADGET_ATTR_MAX]; - char *str_val[G_N_ELEMENTS(strs)]; - _Bool iter; int i; int r; - for (i = 0; i < G_N_ELEMENTS(attr_val); i++) - attr_val[i] = -1; - memset(str_val, 0, sizeof(str_val)); - dt = (struct gt_gadget_create_data *)data; - for (setting = dt->attrs; setting->variable; setting++) { - int attr_id; - - iter = TRUE; - - attr_id = usbg_lookup_gadget_attr(setting->variable); - if (attr_id >= 0) { - unsigned long int val; - char *endptr = NULL; - - errno = 0; - val = strtoul(setting->value, &endptr, 0); - if (errno - || *setting->value == 0 - || (endptr && *endptr != 0) - || attr_val_in_range(attr_id, val) == 0) { - - fprintf(stderr, "Invalid value '%s' for attribute '%s'\n", - setting->value, setting->variable); - return -1; - } - - attr_val[attr_id] = val; - iter = FALSE; - } - for (i = 0; iter && i < G_N_ELEMENTS(strs); i++) { - if (streq(setting->variable, strs[i].name)) { - str_val[i] = setting->value; - iter = FALSE; - break; - } - } - - if (iter) { - fprintf(stderr, "Unknown attribute passed: %s\n", setting->variable); - return -1; - } - } - if (backend_ctx.backend_type == GT_BACKEND_GADGETD) { GVariantBuilder *b; @@ -154,23 +107,23 @@ static int gt_gadget_create_func(void *data) b = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); for (i = USBG_GADGET_ATTR_MIN; i < USBG_GADGET_ATTR_MAX; i++) { - if (attr_val[i] == -1) + if (dt->attr_val[i] == -1) continue; g_variant_builder_add(b, "{sv}", usbg_get_gadget_attr_str(i), - g_variant_new(attr_type_get(i), attr_val[i])); + g_variant_new(attr_type_get(i), dt->attr_val[i])); } gattrs = g_variant_builder_end(b); b = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); for (i = 0; i < G_N_ELEMENTS(strs); i++) { - if (str_val[i] == NULL) + if (dt->str_val[i] == NULL) continue; g_variant_builder_add(b, "{sv}", strs[i].name, - g_variant_new("s", str_val[i])); + g_variant_new("s", dt->str_val[i])); } gstrs = g_variant_builder_end(b); @@ -212,10 +165,10 @@ static int gt_gadget_create_func(void *data) } for (i = USBG_GADGET_ATTR_MIN; i < USBG_GADGET_ATTR_MAX; i++) { - if (attr_val[i] == -1) + if (dt->attr_val[i] == -1) continue; - r = usbg_set_gadget_attr(g, i, attr_val[i]); + r = usbg_set_gadget_attr(g, i, dt->attr_val[i]); if (r != USBG_SUCCESS) { fprintf(stderr, "Unable to set attribute %s: %s\n", usbg_get_gadget_attr_str(i), @@ -224,11 +177,11 @@ static int gt_gadget_create_func(void *data) } } - for (i = 0; i < G_N_ELEMENTS(str_val); i++) { - if (str_val[i] == NULL) + for (i = 0; i < G_N_ELEMENTS(dt->str_val); i++) { + if (dt->str_val[i] == NULL) continue; - r = strs[i].set_fn(g, LANG_US_ENG, str_val[i]); + r = strs[i].set_fn(g, LANG_US_ENG, dt->str_val[i]); if (r != USBG_SUCCESS) { fprintf(stderr, "Unable to set string %s: %s\n", strs[i].name, @@ -275,6 +228,9 @@ static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv, int ind; int c; int avaible_opts = GT_FORCE; + struct gt_setting *setting, *attrs; + _Bool iter; + int i; dt = zalloc(sizeof(*dt)); if (dt == NULL) @@ -289,14 +245,61 @@ static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv, dt->name = argv[ind++]; - c = gt_parse_setting_list(&dt->attrs, argc - ind, argv + ind); + c = gt_parse_setting_list(&attrs, argc - ind, argv + ind); if (c < 0) goto out; + for (i = 0; i < G_N_ELEMENTS(dt->attr_val); i++) + dt->attr_val[i] = -1; + memset(dt->str_val, 0, sizeof(dt->str_val)); + + for (setting = attrs; setting->variable; setting++) { + int attr_id; + + iter = TRUE; + + attr_id = usbg_lookup_gadget_attr(setting->variable); + if (attr_id >= 0) { + unsigned long int val; + char *endptr = NULL; + + errno = 0; + val = strtoul(setting->value, &endptr, 0); + if (errno + || *setting->value == 0 + || (endptr && *endptr != 0) + || attr_val_in_range(attr_id, val) == 0) { + + fprintf(stderr, "Invalid value '%s' for attribute '%s'\n", + setting->value, setting->variable); + goto out; + } + + dt->attr_val[attr_id] = val; + iter = FALSE; + } + + for (i = 0; iter && i < G_N_ELEMENTS(strs); i++) { + if (streq(setting->variable, strs[i].name)) { + dt->str_val[i] = setting->value; + iter = FALSE; + break; + } + } + + if (iter) { + fprintf(stderr, "Unknown attribute passed: %s\n", setting->variable); + goto out; + } + } + executable_command_set(exec, gt_gadget_create_func, (void *)dt, gt_gadget_create_destructor); + + gt_setting_list_cleanup(attrs); return; out: + gt_setting_list_cleanup(attrs); gt_gadget_create_destructor((void *)dt); executable_command_set(exec, cmd->printHelp, data, NULL); } -- 2.7.4