From e4885b83f6e239cf9e1e9bd8a4ef461a40a4f794 Mon Sep 17 00:00:00 2001
From: Pawel Szewczyk
Date: Thu, 9 Jul 2015 10:24:41 +0200
Subject: [PATCH] gadget: Add gadget set command at libusbg backend
Change-Id: I37026a7e0e5064f9fdfa11fd6e0747bef815f8c4
Signed-off-by: Pawel Szewczyk
---
source/gadget/include/gadget.h | 3 +-
source/gadget/src/gadget.c | 87 +++++++++++++++++-------------
source/gadget/src/gadget_libusbg.c | 46 +++++++++++++++-
source/gadget/src/gadget_not_implemented.c | 20 +++++--
4 files changed, 113 insertions(+), 43 deletions(-)
diff --git a/source/gadget/include/gadget.h b/source/gadget/include/gadget.h
index a0fbb6b..9403312 100644
--- a/source/gadget/include/gadget.h
+++ b/source/gadget/include/gadget.h
@@ -110,7 +110,8 @@ struct gt_gadget_get_data {
struct gt_gadget_set_data {
const char *name;
- struct gt_setting *attrs;
+ int attr_val[USBG_GADGET_ATTR_MAX];
+ char *str_val[GT_GADGET_STRS_COUNT];
int opts;
};
diff --git a/source/gadget/src/gadget.c b/source/gadget/src/gadget.c
index ac536bd..2b2c5c8 100644
--- a/source/gadget/src/gadget.c
+++ b/source/gadget/src/gadget.c
@@ -108,41 +108,14 @@ static int gt_gadget_create_help(void *data)
return 0;
}
-static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv,
- ExecutableCommand *exec, void *data)
+static int gt_parse_gadget_attrs(struct gt_setting *attrs, int *attr_val, char **str_val)
{
- struct gt_gadget_create_data *dt;
- int ind;
- int c;
- int avaible_opts = GT_FORCE | GT_HELP;
- struct gt_setting *setting, *attrs = NULL;
+ struct gt_setting *setting;
+ int attr_id;
_Bool iter;
int i;
- dt = zalloc(sizeof(*dt));
- if (dt == NULL)
- goto out;
-
- ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
- if (ind < 0 || dt->opts & GT_HELP)
- goto out;
-
- if (ind == argc)
- goto out;
-
- dt->name = argv[ind++];
-
- c = gt_parse_setting_list(&attrs, argc - ind, argv + ind);
- if (c < 0)
- goto out;
-
- for (i = 0; i < USBG_GADGET_ATTR_MAX; 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);
@@ -159,16 +132,16 @@ static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv,
fprintf(stderr, "Invalid value '%s' for attribute '%s'\n",
setting->value, setting->variable);
- goto out;
+ return -1;
}
- dt->attr_val[attr_id] = val;
+ attr_val[attr_id] = val;
iter = FALSE;
}
for (i = 0; iter && i < GT_GADGET_STRS_COUNT; i++) {
if (streq(setting->variable, gadget_strs[i].name)) {
- dt->str_val[i] = setting->value;
+ str_val[i] = setting->value;
iter = FALSE;
break;
}
@@ -176,10 +149,46 @@ static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv,
if (iter) {
fprintf(stderr, "Unknown attribute passed: %s\n", setting->variable);
- goto out;
+ return -1;
}
}
+ return 0;
+}
+
+static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv,
+ ExecutableCommand *exec, void *data)
+{
+ struct gt_gadget_create_data *dt;
+ int ind;
+ int c;
+ int avaible_opts = GT_FORCE | GT_HELP;
+ struct gt_setting *attrs = NULL;
+ int i;
+
+ dt = zalloc(sizeof(*dt));
+ if (dt == NULL)
+ goto out;
+
+ ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
+ if (ind < 0 || dt->opts & GT_HELP)
+ goto out;
+
+ if (ind == argc)
+ goto out;
+
+ dt->name = argv[ind++];
+
+ c = gt_parse_setting_list(&attrs, argc - ind, argv + ind);
+ if (c < 0)
+ goto out;
+
+ for (i = 0; i < USBG_GADGET_ATTR_MAX; i++)
+ dt->attr_val[i] = -1;
+ memset(dt->str_val, 0, sizeof(dt->str_val));
+
+ gt_parse_gadget_attrs(attrs, dt->attr_val, dt->str_val);
+
executable_command_set(exec, GET_EXECUTABLE(create),
(void *)dt, gt_gadget_create_destructor);
@@ -313,7 +322,6 @@ static void gt_gadget_set_destructor(void *data)
if (data == NULL)
return;
dt = (struct gt_gadget_set_data *)data;
- gt_setting_list_cleanup(dt->attrs);
free(dt);
}
@@ -330,6 +338,8 @@ static void gt_parse_gadget_set(const Command *cmd, int argc, char **argv,
int tmp;
int ind;
int avaible_opts = GT_HELP;
+ struct gt_setting *attrs;
+ int i;
dt = zalloc(sizeof(*dt));
if (dt == NULL)
@@ -343,10 +353,15 @@ static void gt_parse_gadget_set(const Command *cmd, int argc, char **argv,
goto out;
dt->name = argv[ind++];
- tmp = gt_parse_setting_list(&dt->attrs, argc - ind, argv + ind);
+ tmp = gt_parse_setting_list(&attrs, argc - ind, argv + ind);
if (tmp < 0)
goto out;
+ for (i = 0; i < USBG_GADGET_ATTR_MAX; i++)
+ dt->attr_val[i] = -1;
+ memset(dt->str_val, 0, sizeof(dt->str_val));
+
+ gt_parse_gadget_attrs(attrs, dt->attr_val, dt->str_val);
executable_command_set(exec, GET_EXECUTABLE(set), (void *)dt,
gt_gadget_set_destructor);
return;
diff --git a/source/gadget/src/gadget_libusbg.c b/source/gadget/src/gadget_libusbg.c
index 4094d0e..c40b101 100644
--- a/source/gadget/src/gadget_libusbg.c
+++ b/source/gadget/src/gadget_libusbg.c
@@ -516,11 +516,55 @@ out:
return ret;
}
+static int set_func(void *data)
+{
+ struct gt_gadget_set_data *dt;
+ int i;
+ usbg_gadget *g;
+ int ret;
+
+ dt = (struct gt_gadget_set_data *)data;
+
+ g = usbg_get_gadget(backend_ctx.libusbg_state, dt->name);
+ if (!g) {
+ fprintf(stderr, "Error on get gadget\n");
+ return -1;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(dt->attr_val); ++i) {
+ if (dt->attr_val[i] < 0)
+ continue;
+
+ ret = usbg_set_gadget_attr(g, i, dt->attr_val[i]);
+ if (ret != USBG_SUCCESS) {
+ fprintf(stderr, "Unable to set attribute %s: %s\n",
+ usbg_get_gadget_attr_str(i),
+ usbg_strerror(ret));
+ return -1;
+ }
+ }
+
+ for (i = 0; i < G_N_ELEMENTS(dt->str_val); i++) {
+ if (dt->str_val[i] == NULL)
+ continue;
+
+ ret = gadget_strs[i].set_fn(g, LANG_US_ENG, dt->str_val[i]);
+ if (ret != USBG_SUCCESS) {
+ fprintf(stderr, "Unable to set string %s: %s\n",
+ gadget_strs[i].name,
+ usbg_strerror(ret));
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
struct gt_gadget_backend gt_gadget_backend_libusbg = {
.create = create_func,
.rm = rm_func,
.get = get_func,
- .set = NULL,
+ .set = set_func,
.enable = enable_func,
.disable = disable_func,
.gadget = gadget_func,
diff --git a/source/gadget/src/gadget_not_implemented.c b/source/gadget/src/gadget_not_implemented.c
index b5edd8a..a173c09 100644
--- a/source/gadget/src/gadget_not_implemented.c
+++ b/source/gadget/src/gadget_not_implemented.c
@@ -65,16 +65,26 @@ static int get_func(void *data)
static int set_func(void *data)
{
struct gt_gadget_set_data *dt;
- struct gt_setting *ptr;
+ int i;
dt = (struct gt_gadget_set_data *)data;
printf("Gadget set called successfully. Not implemented.\n");
printf("name = %s", dt->name);
- ptr = dt->attrs;
- while (ptr->variable) {
- printf(", %s = %s", ptr->variable, ptr->value);
- ptr++;
+
+ for (i = 0; i < ARRAY_SIZE(dt->attr_val); ++i) {
+ if (dt->attr_val[i] >= 0) {
+ printf(", %s = %d", usbg_get_gadget_attr_str(i),
+ dt->attr_val[i]);
+ }
}
+
+ for (i = 0; i < ARRAY_SIZE(dt->str_val); ++i) {
+ if (dt->str_val[i] != NULL) {
+ printf(", %s = %s", gadget_strs[i].name,
+ dt->str_val[i]);
+ }
+ }
+
putchar('\n');
return 0;
}
--
2.7.4