2 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
32 int (*set_fn)(usbg_gadget *, int, const char *);
34 { "product", usbg_set_gadget_product },
35 { "manufacturer", usbg_set_gadget_manufacturer },
36 { "serialnumber", usbg_set_gadget_serial_number },
39 struct gt_gadget_create_data {
41 struct gt_setting *attrs;
45 static void gt_gadget_create_destructor(void *data)
47 struct gt_gadget_create_data *dt;
51 dt = (struct gt_gadget_create_data *)data;
52 gt_setting_list_cleanup(dt->attrs);
56 static char *attr_type_get(usbg_gadget_attr a)
60 case B_DEVICE_SUB_CLASS:
61 case B_DEVICE_PROTOCOL:
62 case B_MAX_PACKET_SIZE_0:
76 static int attr_val_in_range(usbg_gadget_attr a, unsigned long int val)
78 char *type = attr_type_get(a);
84 return val <= UINT8_MAX;
85 else if (type[0] == 'q')
86 return val <= UINT16_MAX;
92 static int gt_gadget_create_func(void *data)
94 struct gt_gadget_create_data *dt;
95 struct gt_setting *setting;
96 int attr_val[USBG_GADGET_ATTR_MAX];
97 char *str_val[G_N_ELEMENTS(strs)];
102 for (i = 0; i < G_N_ELEMENTS(attr_val); i++)
104 memset(str_val, 0, sizeof(str_val));
106 dt = (struct gt_gadget_create_data *)data;
108 for (setting = dt->attrs; setting->variable; setting++) {
113 attr_id = usbg_lookup_gadget_attr(setting->variable);
115 unsigned long int val;
119 val = strtoul(setting->value, &endptr, 0);
121 || *setting->value == 0
122 || (endptr && *endptr != 0)
123 || attr_val_in_range(attr_id, val) == 0) {
125 fprintf(stderr, "Invalid value '%s' for attribute '%s'\n",
126 setting->value, setting->variable);
130 attr_val[attr_id] = val;
133 for (i = 0; iter && i < G_N_ELEMENTS(strs); i++) {
134 if (streq(setting->variable, strs[i].name)) {
135 str_val[i] = setting->value;
142 fprintf(stderr, "Unknown attribute passed: %s\n", setting->variable);
147 if (backend_ctx.backend == GT_BACKEND_GADGETD) {
155 b = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
156 for (i = USBG_GADGET_ATTR_MIN; i < USBG_GADGET_ATTR_MAX; i++) {
157 if (attr_val[i] == -1)
160 g_variant_builder_add(b, "{sv}",
161 usbg_get_gadget_attr_str(i),
162 g_variant_new(attr_type_get(i), attr_val[i]));
164 gattrs = g_variant_builder_end(b);
166 b = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
167 for (i = 0; i < G_N_ELEMENTS(strs); i++) {
168 if (str_val[i] == NULL)
171 g_variant_builder_add(b, "{sv}",
173 g_variant_new("s", str_val[i]));
175 gstrs = g_variant_builder_end(b);
177 v = g_dbus_connection_call_sync(backend_ctx.gadgetd_conn,
180 "org.usb.device.GadgetManager",
182 g_variant_new("(s@a{sv}@a{sv})",
187 G_DBUS_CALL_FLAGS_NONE,
193 fprintf(stderr, "Unable to create gadget: %s\n", err->message);
200 } else if (backend_ctx.backend == GT_BACKEND_LIBUSBG) {
203 r = usbg_create_gadget(backend_ctx.libusbg_state,
208 if (r != USBG_SUCCESS) {
209 fprintf(stderr, "Unable to create gadget %s: %s\n",
210 dt->name, usbg_strerror(r));
214 for (i = USBG_GADGET_ATTR_MIN; i < USBG_GADGET_ATTR_MAX; i++) {
215 if (attr_val[i] == -1)
218 r = usbg_set_gadget_attr(g, i, attr_val[i]);
219 if (r != USBG_SUCCESS) {
220 fprintf(stderr, "Unable to set attribute %s: %s\n",
221 usbg_get_gadget_attr_str(i),
227 for (i = 0; i < G_N_ELEMENTS(str_val); i++) {
228 if (str_val[i] == NULL)
231 r = strs[i].set_fn(g, LANG_US_ENG, str_val[i]);
232 if (r != USBG_SUCCESS) {
233 fprintf(stderr, "Unable to set string %s: %s\n",
243 usbg_rm_gadget(g, USBG_RM_RECURSE);
250 static int gt_gadget_create_help(void *data)
254 printf("usage: %s create NAME [attr=value]...\n"
255 "Create new gadget of specified name, attributes and language strings.\n"
260 for (i = USBG_GADGET_ATTR_MIN; i < USBG_GADGET_ATTR_MAX; i++)
261 printf(" %s\n", usbg_get_gadget_attr_str(i));
263 printf("Device strings (en_US locale):\n");
265 for (i = 0; i < G_N_ELEMENTS(strs); i++)
266 printf(" %s\n", strs[i].name);
271 static void gt_parse_gadget_create(const Command *cmd, int argc, char **argv,
272 ExecutableCommand *exec, void *data)
274 struct gt_gadget_create_data *dt;
277 int avaible_opts = GT_FORCE;
279 dt = zalloc(sizeof(*dt));
283 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
290 dt->name = argv[ind++];
292 c = gt_parse_setting_list(&dt->attrs, argc - ind, argv + ind);
296 executable_command_set(exec, gt_gadget_create_func,
297 (void *)dt, gt_gadget_create_destructor);
300 gt_gadget_create_destructor((void *)dt);
301 executable_command_set(exec, cmd->printHelp, data, NULL);
304 struct gt_gadget_rm_data {
309 static int gt_gadget_rm_help(void *data)
311 printf("Gadget rm help.\n");
315 static int gt_gadget_rm_func(void *data)
317 struct gt_gadget_rm_data *dt;
319 dt = (struct gt_gadget_rm_data *)data;
320 printf("Gadget rm called successfully. Not implemented.\n");
321 printf("name = %s, force = %d, recursive = %d\n",
322 dt->name, !!(dt->opts & GT_FORCE), !!(dt->opts & GT_RECURSIVE));
326 static void gt_parse_gadget_rm(const Command *cmd, int argc, char **argv,
327 ExecutableCommand *exec, void *data)
329 struct gt_gadget_rm_data *dt;
331 int avaible_opts = GT_FORCE | GT_RECURSIVE;
333 dt = zalloc(sizeof(*dt));
337 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
343 dt->name = argv[ind];
344 executable_command_set(exec, gt_gadget_rm_func, (void *)dt,
349 executable_command_set(exec, cmd->printHelp, data, NULL);
352 struct gt_gadget_get_data {
357 static void gt_gadget_get_destructor(void *data)
359 struct gt_gadget_get_data *dt;
363 dt = (struct gt_gadget_get_data *)data;
369 static int gt_gadget_get_func(void *data)
371 struct gt_gadget_get_data *dt;
374 dt = (struct gt_gadget_get_data *)data;
375 printf("Gadget get called successfully. Not implemented yet.\n");
376 printf("name = %s, attrs = ", dt->name);
380 printf("%s, ", *ptr);
388 static int gt_gadget_get_help(void *data)
390 printf("Gadget get help.\n");
394 static void gt_parse_gadget_get(const Command *cmd, int argc, char **argv,
395 ExecutableCommand *exec, void * data)
397 struct gt_gadget_get_data *dt = NULL;
403 dt = zalloc(sizeof(*dt));
408 dt->attrs = calloc(argc, sizeof(char *));
409 if (dt->attrs == NULL)
413 for (i = 0; i < argc; i++) {
414 dt->attrs[i] = argv[i];
417 executable_command_set(exec, gt_gadget_get_func, (void *)dt,
418 gt_gadget_get_destructor);
422 gt_gadget_get_destructor((void *)dt);
423 executable_command_set(exec, cmd->printHelp, data, NULL);
426 struct gt_gadget_set_data {
428 struct gt_setting *attrs;
431 static void gt_gadget_set_destructor(void *data)
433 struct gt_gadget_set_data *dt;
437 dt = (struct gt_gadget_set_data *)data;
438 gt_setting_list_cleanup(dt->attrs);
442 static int gt_gadget_set_func(void *data)
444 struct gt_gadget_set_data *dt;
445 struct gt_setting *ptr;
447 dt = (struct gt_gadget_set_data *)data;
448 printf("Gadget set called successfully. Not implemented.\n");
449 printf("name = %s", dt->name);
451 while (ptr->variable) {
452 printf(", %s = %s", ptr->variable, ptr->value);
459 static int gt_gadget_set_help(void *data)
461 printf("Gadget set help.\n");
465 static void gt_parse_gadget_set(const Command *cmd, int argc, char **argv,
466 ExecutableCommand *exec, void * data)
468 struct gt_gadget_set_data *dt = NULL;
474 dt = zalloc(sizeof(*dt));
479 tmp = gt_parse_setting_list(&dt->attrs, argc-1, argv+1);
483 executable_command_set(exec, gt_gadget_set_func, (void *)dt,
484 gt_gadget_set_destructor);
487 gt_gadget_set_destructor((void *)dt);
488 executable_command_set(exec, cmd->printHelp, data, NULL);
491 struct gt_gadget_enable_data {
496 static int gt_gadget_enable_func(void *data)
498 struct gt_gadget_enable_data *dt;
500 dt = (struct gt_gadget_enable_data *)data;
502 if (backend_ctx.backend == GT_BACKEND_GADGETD) {
503 /* TODO add support for enabling well known UDC */
505 GError *error = NULL;
506 GDBusObjectManager *manager;
509 const gchar *obj_path = NULL;
510 _cleanup_g_free_ gchar *g_path = NULL;
511 const gchar *msg = NULL;
512 gboolean out_gadget_enabled = 0;
514 gret = g_dbus_connection_call_sync(backend_ctx.gadgetd_conn,
517 "org.usb.device.GadgetManager",
522 G_DBUS_CALL_FLAGS_NONE,
528 fprintf(stderr, "Failed to get gadget, %s\n", error->message);
532 g_variant_get(gret, "(o)", &g_path);
533 g_variant_unref(gret);
535 manager = g_dbus_object_manager_client_new_sync(backend_ctx.gadgetd_conn,
536 G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
546 fprintf(stderr, "Failed to get dbus object manager, %s\n", error->message);
550 /* get first "free" udc and enable gadget */
551 objects = g_dbus_object_manager_get_objects(manager);
552 for (l = objects; l != NULL; l = l->next)
554 GDBusObject *object = G_DBUS_OBJECT(l->data);
555 obj_path = g_dbus_object_get_object_path(G_DBUS_OBJECT(object));
557 if (g_str_has_prefix(obj_path, "/org/usb/Gadget/UDC")) {
558 obj_path = g_dbus_object_get_object_path(G_DBUS_OBJECT(object));
560 gret = g_dbus_connection_call_sync(backend_ctx.gadgetd_conn,
563 "org.usb.device.UDC",
568 G_DBUS_CALL_FLAGS_NONE,
573 msg = error->message;
576 g_variant_get(gret, "(b)", &out_gadget_enabled);
577 if (out_gadget_enabled) {
578 g_variant_unref(gret);
584 g_list_foreach(objects, (GFunc)g_object_unref, NULL);
585 g_list_free(objects);
586 g_object_unref(manager);
589 fprintf(stderr, "Failed to enable gadget, %s\n", msg);
593 } else if (backend_ctx.backend == GT_BACKEND_LIBUSBG) {
595 usbg_udc *udc = NULL;
598 if (dt->udc != NULL) {
599 udc = usbg_get_udc(backend_ctx.libusbg_state, dt->udc);
601 fprintf(stderr, "Failed to get udc\n");
606 g = usbg_get_gadget(backend_ctx.libusbg_state, dt->gadget);
608 fprintf(stderr, "Failed to get gadget\n");
612 usbg_ret = usbg_enable_gadget(g, udc);
613 if (usbg_ret != USBG_SUCCESS) {
614 fprintf(stderr, "Failed to get gadget %s\n", usbg_strerror(usbg_ret));
622 static int gt_gadget_enable_help(void *data)
624 printf("Gadget enable help.\n");
628 static void gt_parse_gadget_enable(const Command *cmd, int argc,
629 char **argv, ExecutableCommand *exec, void * data)
631 struct gt_gadget_enable_data *dt;
633 dt = zalloc(sizeof(*dt));
639 dt->gadget = argv[0];
642 dt->gadget = argv[0];
649 executable_command_set(exec, gt_gadget_enable_func,
654 executable_command_set(exec, cmd->printHelp, data, NULL);
657 struct gt_gadget_disable_data {
662 static int gt_gadget_disable_func(void *data)
664 struct gt_gadget_disable_data *dt;
666 dt = (struct gt_gadget_disable_data *)data;
667 printf("Gadget disable called successfully. Not implemented.\n");
669 printf("gadget = %s, ", dt->gadget);
671 printf("udc = %s", dt->udc);
676 static int gt_gadget_disable_help(void *data)
678 printf("Gadget disable help.\n");
682 static void gt_parse_gadget_disable(const Command *cmd, int argc,
683 char **argv, ExecutableCommand *exec, void * data)
685 struct gt_gadget_disable_data *dt;
687 struct option opts[] = {
688 {"udc", required_argument, 0, 'u'},
692 dt = zalloc(sizeof(*dt));
699 c = getopt_long(argc, argv, "u:", opts, &opt_index);
711 if (optind < argc - 1 || (dt->udc && optind < argc)) {
712 printf("Too many arguments\n");
716 dt->gadget = argv[optind];
717 executable_command_set(exec, gt_gadget_disable_func, (void *)dt, free);
721 executable_command_set(exec, cmd->printHelp, data, NULL);
724 struct gt_gadget_gadget_data {
729 static int gt_gadget_gadget_func(void *data)
731 struct gt_gadget_gadget_data *dt;
733 dt = (struct gt_gadget_gadget_data *)data;
734 printf("Gadget gadget called successfully. Not implemented.\n");
736 printf("name = %s, ", dt->name);
737 printf("recursive = %d, verbose = %d\n",
738 !!(dt->opts & GT_RECURSIVE), !!(dt->opts & GT_VERBOSE));
742 static int gt_gadget_gadget_help(void *data)
744 printf("Gadget gadget help.\n");
748 static void gt_parse_gadget_gadget(const Command *cmd, int argc,
749 char **argv, ExecutableCommand *exec, void * data)
751 struct gt_gadget_gadget_data *dt;
753 int avaible_opts = GT_RECURSIVE | GT_VERBOSE;
755 dt = zalloc(sizeof(*dt));
759 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
763 switch (argc - ind) {
767 dt->name = argv[ind];
773 executable_command_set(exec, gt_gadget_gadget_func, (void *)dt,
778 executable_command_set(exec, cmd->printHelp, data, NULL);
781 struct gt_gadget_load_data {
783 const char *gadget_name;
789 static int gt_gadget_load_func(void *data)
791 struct gt_gadget_load_data *dt;
793 dt = (struct gt_gadget_load_data *)data;
794 printf("Gadget load called successfully. Not implemented.\n");
796 printf("name = %s, ", dt->name);
798 printf("gadget = %s, ", dt->gadget_name);
800 printf("file %s, ", dt->file);
802 printf("path = %s, ", dt->path);
804 printf("off = %d, stdin = %d\n",
805 !!(dt->opts & GT_OFF), !!(dt->opts & GT_STDIN));
810 static int gt_gadget_load_help(void *data)
812 printf("Gadget load help\n");
816 static void gt_parse_gadget_load(const Command *cmd, int argc,
817 char **argv, ExecutableCommand *exec, void * data)
820 struct gt_gadget_load_data *dt;
821 struct option opts[] = {
822 {"off", no_argument, 0, 'o'},
823 {"file", required_argument, 0, 1},
824 {"stdin", no_argument, 0, 2},
825 {"path", required_argument, 0, 3},
829 dt = zalloc(sizeof(*dt));
836 c = getopt_long(argc, argv, "o", opts, &opt_index);
844 if (dt->path || dt->opts & GT_STDIN)
849 if (dt->path || dt->file)
851 dt->opts |= GT_STDIN;
854 if (dt->file || dt->opts & GT_STDIN)
863 if (optind == argc || optind < argc - 2)
866 dt->name = argv[optind++];
867 if (dt->opts & GT_STDIN || dt->file) {
868 dt->gadget_name = dt->name;
875 dt->gadget_name = argv[optind++];
877 executable_command_set(exec, gt_gadget_load_func, (void *)dt, free);
881 executable_command_set(exec, cmd->printHelp, data, NULL);
884 struct gt_gadget_save_data {
889 struct gt_setting *attrs;
893 static void gt_gadget_save_destructor(void *data)
895 struct gt_gadget_save_data *dt;
899 dt = (struct gt_gadget_save_data *)data;
900 gt_setting_list_cleanup(dt->attrs);
904 static int gt_gadget_save_func(void *data)
906 struct gt_gadget_save_data *dt;
907 struct gt_setting *ptr;
909 dt = (struct gt_gadget_save_data *)data;
910 printf("Gadget save called successfully. Not implemented\n");
912 printf("gadget = %s, ", dt->gadget);
914 printf("name = %s, ", dt->name);
916 printf("file = %s, ", dt->file);
918 printf("path = %s, ", dt->path);
919 printf("force = %d, stdout = %d",
920 !!(dt->opts & GT_FORCE), !!(dt->opts & GT_STDOUT));
923 while (ptr->variable) {
924 printf(", %s = %s", ptr->variable, ptr->value);
932 static int gt_gadget_save_help(void *data)
934 printf("Gadget save help.\n");
938 static void gt_parse_gadget_save(const Command *cmd, int argc,
939 char **argv, ExecutableCommand *exec, void * data)
942 struct gt_gadget_save_data *dt;
943 struct option opts[] = {
944 {"force", no_argument, 0, 'f'},
945 {"file", required_argument, 0, 1},
946 {"stdout", no_argument, 0, 2},
947 {"path", required_argument, 0, 3},
951 dt = zalloc(sizeof(*dt));
958 c = getopt_long(argc, argv, "f", opts, &opt_index);
963 dt->opts |= GT_FORCE;
966 if (dt->path || dt->opts & GT_STDOUT)
971 if (dt->file || dt->path)
973 dt->opts |= GT_STDOUT;
976 if (dt->file || dt->opts & GT_STDOUT)
988 dt->gadget = argv[optind++];
992 && !(dt->opts & GT_STDOUT)
993 && strchr(argv[optind], '=') == NULL)
994 dt->name = argv[optind++];
996 c = gt_parse_setting_list(&dt->attrs, argc - optind,
1001 executable_command_set(exec, gt_gadget_save_func, (void *)dt,
1002 gt_gadget_save_destructor);
1006 gt_gadget_save_destructor((void *)dt);
1007 executable_command_set(exec, cmd->printHelp, data, NULL);
1010 struct gt_gadget_template_data {
1015 static int gt_gadget_template_func(void *data)
1017 struct gt_gadget_template_data *dt;
1019 dt = (struct gt_gadget_template_data *)data;
1020 printf("Gadget template called successfully. Not implemented.\n");
1022 printf("name = %s, ", dt->name);
1023 printf("verbose = %d, recursive = %d\n",
1024 !!(dt->opts & GT_VERBOSE), !!(dt->opts & GT_RECURSIVE));
1028 static int gt_gadget_template_help(void *data)
1030 printf("Gadget template help.\n");
1034 static void gt_parse_gadget_template(const Command *cmd, int argc,
1035 char **argv, ExecutableCommand *exec, void * data)
1038 struct gt_gadget_template_data *dt;
1039 int avaible_opts = GT_VERBOSE | GT_RECURSIVE;
1041 dt = zalloc(sizeof(*dt));
1044 ind = gt_get_options(&dt->opts, avaible_opts, argc, argv);
1052 dt->name = argv[ind];
1054 executable_command_set(exec, gt_gadget_template_func, (void *)dt,
1060 executable_command_set(exec, cmd->printHelp, data, NULL);
1063 static int gt_gadget_template_rm_func(void *data)
1068 printf("Gadget template rm called successfully. Not implemented.\n");
1069 printf("name = %s\n", dt);
1073 static int gt_gadget_template_rm_help(void *data)
1075 printf("Gadget template rm help.\n");
1079 static void gt_parse_gadget_template_rm(const Command *cmd, int argc,
1080 char **argv, ExecutableCommand *exec, void * data)
1082 const char *dt = NULL;
1088 executable_command_set(exec, gt_gadget_template_rm_func, (void *)dt,
1093 executable_command_set(exec, cmd->printHelp, data, NULL);
1096 struct gt_gadget_template_set_data {
1098 struct gt_setting *attr;
1101 static void gt_gadget_template_set_destructor(void *data)
1103 struct gt_gadget_template_set_data *dt;
1107 dt = (struct gt_gadget_template_set_data *)data;
1108 gt_setting_list_cleanup(dt->attr);
1112 static int gt_gadget_template_set_func(void *data)
1114 struct gt_gadget_template_set_data *dt;
1115 struct gt_setting *ptr;
1117 dt = (struct gt_gadget_template_set_data *)data;
1118 printf("Gadget template set called successfully. Not implemened.\n");
1119 printf("name = %s", dt->name);
1121 while (ptr->variable) {
1122 printf(", %s = %s", ptr->variable, ptr->value);
1130 static int gt_gadget_template_set_help(void *data)
1132 printf("Gadget template set help.\n");
1136 static void gt_parse_gadget_template_set(const Command *cmd, int argc,
1137 char **argv, ExecutableCommand *exec, void * data)
1140 struct gt_gadget_template_set_data *dt;
1142 dt = zalloc(sizeof(*dt));
1150 tmp = gt_parse_setting_list(&dt->attr, argc-1, argv+1);
1154 executable_command_set(exec, gt_gadget_template_set_func, (void *)dt,
1155 gt_gadget_template_set_destructor);
1159 gt_gadget_template_set_destructor((void *)dt);
1160 executable_command_set(exec, cmd->printHelp, data, NULL);
1163 struct gt_gadget_template_get_data {
1168 static void gt_gadget_template_get_destructor(void *data)
1170 struct gt_gadget_template_get_data *dt;
1174 dt = (struct gt_gadget_template_get_data *)data;
1179 static int gt_gadget_template_get_func(void *data)
1181 struct gt_gadget_template_get_data *dt;
1184 dt = (struct gt_gadget_template_get_data *)data;
1185 printf("Gadget template get called successfully. Not implemented.\n");
1186 printf("name = %s, attr = ", dt->name);
1189 printf("%s, ", *ptr);
1197 static int gt_gadget_template_get_help(void *data)
1199 printf("Gadget template get help.\n");
1203 static void gt_parse_gadget_template_get(const Command *cmd, int argc,
1204 char **argv, ExecutableCommand *exec, void * data)
1207 struct gt_gadget_template_get_data *dt;
1209 dt = zalloc(sizeof(*dt));
1217 dt->attr = calloc(argc, sizeof(char *));
1218 if (dt->attr == NULL)
1223 for (i = 0; i < argc; i++)
1224 dt->attr[i] = argv[i];
1226 executable_command_set(exec, gt_gadget_template_get_func, (void *)dt,
1227 gt_gadget_template_get_destructor);
1231 gt_gadget_template_get_destructor((void *)dt);
1232 executable_command_set(exec, cmd->printHelp, data, NULL);
1235 const Command *get_gadget_template_children(const Command *cmd)
1237 static Command commands[] = {
1238 {"get", NEXT, gt_parse_gadget_template_get, NULL,
1239 gt_gadget_template_get_help},
1240 {"set", NEXT, gt_parse_gadget_template_set, NULL,
1241 gt_gadget_template_set_help},
1242 {"rm", NEXT, gt_parse_gadget_template_rm, NULL,
1243 gt_gadget_template_rm_help},
1244 {NULL, AGAIN, gt_parse_gadget_template, NULL,
1245 gt_gadget_template_help},
1252 const Command *get_gadget_children(const Command *cmd)
1254 static Command commands[] = {
1255 {"create", NEXT, gt_parse_gadget_create, NULL,
1256 gt_gadget_create_help},
1257 {"rm", NEXT, gt_parse_gadget_rm, NULL, gt_gadget_rm_help},
1258 {"get", NEXT, gt_parse_gadget_get, NULL, gt_gadget_get_help},
1259 {"set", NEXT, gt_parse_gadget_set, NULL, gt_gadget_set_help},
1260 {"enable", NEXT, gt_parse_gadget_enable, NULL,
1261 gt_gadget_enable_help},
1262 {"disable", NEXT, gt_parse_gadget_disable, NULL,
1263 gt_gadget_disable_help},
1264 {"gadget", NEXT, gt_parse_gadget_gadget, NULL,
1265 gt_gadget_gadget_help},
1266 {"template", NEXT, command_parse, get_gadget_template_children,
1267 gt_gadget_template_help},
1268 {"load", NEXT, gt_parse_gadget_load, NULL,
1269 gt_gadget_load_help},
1270 {"save", NEXT, gt_parse_gadget_save, NULL,
1271 gt_gadget_save_help},
1278 int gt_gadget_help(void *data)
1280 printf("Gadget help function\n");