function: Add func show command at libusbg backend
authorPawel Szewczyk <p.szewczyk@samsung.com>
Tue, 14 Jul 2015 11:03:03 +0000 (13:03 +0200)
committerKrzysztof Opasiak <k.opasiak@samsung.com>
Tue, 28 Jul 2015 16:07:11 +0000 (18:07 +0200)
Change-Id: I1804ef3ff0bc8e1c73d74bf1771c460f0388f044
Signed-off-by: Pawel Szewczyk <p.szewczyk@samsung.com>
source/base/include/parser.h
source/base/src/parser.c
source/function/include/function.h
source/function/src/function.c
source/function/src/function_libusbg.c
source/function/src/function_not_implemented.c

index cc132af..b264ddb 100644 (file)
@@ -85,6 +85,8 @@ enum gt_option_flags {
        GT_STDOUT = 32,
        GT_HELP = 64,
        GT_QUIET = 128,
+       GT_INSTANCE = 256,
+       GT_TYPE = 512,
 };
 
 /**
index 1e65d15..c62b42a 100644 (file)
@@ -189,6 +189,8 @@ int gt_get_options(int *optmask, int allowed_opts, int argc, char **argv)
                {GT_STDIN, {"stdout", no_argument, 0, 2}},
                {GT_HELP, {"help", no_argument, 0, 'h'}},
                {GT_QUIET, {"quiet", no_argument, 0, 'q'}},
+               {GT_INSTANCE, {"instance", no_argument, 0, 3}},
+               {GT_TYPE, {"type", no_argument, 0, 4}},
                {0, {NULL, 0, 0, 0}}
        };
 
@@ -245,6 +247,12 @@ int gt_get_options(int *optmask, int allowed_opts, int argc, char **argv)
                case 'q':
                        *optmask |= GT_QUIET;
                        break;
+               case 3:
+                       *optmask |= GT_INSTANCE;
+                       break;
+               case 4:
+                       *optmask |= GT_TYPE;
+                       break;
                default:
                        return -1;
                }
index 5d6abef..60761db 100644 (file)
@@ -171,6 +171,13 @@ const Command *gt_func_get_children(const Command *cmd);
  */
 int gt_func_help(void *data);
 
+/**
+ * @brief Print function
+ * @param[in] f Function to be printed
+ * @param[in] opts Options of printing
+ */
+int gt_print_function_libusbg(usbg_function *f, int opts);
+
 extern struct gt_function_backend gt_function_backend_libusbg;
 extern struct gt_function_backend gt_function_backend_gadgetd;
 extern struct gt_function_backend gt_function_backend_not_implemented;
index a754135..5d648f9 100644 (file)
@@ -324,12 +324,15 @@ static int gt_func_func_help(void *data)
 
 static int gt_func_show_help(void *data)
 {
-       printf("usage: %s func show <gadget> [<type> <instance>]\n"
-              "Show functions. If no function was specified, show all functions\n\n",
+       printf("usage: %s func show <gadget> [type[ [instance]]\n"
+              "Show functions. If no function was specified, show all functions.\n"
+              "If only function type was specified show only functions of given type\n\n",
                program_name);
 
        printf("Options:\n"
               "  -v, --verbose\tShow also attributes\n"
+              "  --instance\tShow only function instances (cannot be used with --type)\n"
+              "  --type\t\tShow only function types (cannot be used with  --instance)\n"
               "  -h, --help\tPrint this help\n");
 
        return 0;
@@ -340,7 +343,7 @@ static void gt_parse_func_show(const Command *cmd, int argc,
 {
        struct gt_func_show_data *dt = NULL;
        int ind;
-       int avaible_opts = GT_VERBOSE | GT_HELP;
+       int avaible_opts = GT_VERBOSE | GT_HELP | GT_INSTANCE | GT_TYPE;
 
        if (argc < 1)
                goto out;
@@ -353,12 +356,13 @@ static void gt_parse_func_show(const Command *cmd, int argc,
        if (ind < 0 || dt->opts & GT_HELP)
                goto out;
 
+       if (dt->opts & GT_INSTANCE && dt->opts & GT_TYPE)
+               goto out;
 
        dt->gadget = argv[ind++];
+       dt->type = -1;
+       dt->instance = NULL;
        if (argc > ind) {
-               if (argc - ind != 2)
-                       goto out;
-
                dt->type = usbg_lookup_function_type(argv[ind]);
                if (dt->type < 0) {
                        fprintf(stderr, "Unknown function type: %s", argv[ind]);
@@ -366,7 +370,8 @@ static void gt_parse_func_show(const Command *cmd, int argc,
                }
 
                ind++;
-               dt->instance = argv[ind++];
+               if (argc > ind)
+                       dt->instance = argv[ind++];
        }
 
        executable_command_set(exec, GET_EXECUTABLE(show), (void *)dt,
index f408771..acb6d91 100644 (file)
@@ -78,13 +78,151 @@ static int list_types_func(void *data)
        return 0;
 }
 
+int gt_print_function_libusbg(usbg_function *f, int opts)
+{
+       const char *instance;
+       usbg_function_type type;
+       int usbg_ret;
+       usbg_function_attrs f_attrs;
+
+       instance = usbg_get_function_instance(f);
+       if (!instance) {
+               fprintf(stderr, "Unable to get function instance name\n");
+               return -1;
+       }
+
+       type = usbg_get_function_type(f);
+
+       if (opts & GT_INSTANCE)
+               printf("  %s\n", instance);
+       else if (opts & GT_TYPE)
+               printf("  %s\n", usbg_get_function_type_str(type));
+       else
+               fprintf(stdout, "  %s.%s\n",
+                       usbg_get_function_type_str(type), instance);
+
+       usbg_ret = usbg_get_function_attrs(f, &f_attrs);
+       if (usbg_ret != USBG_SUCCESS) {
+               fprintf(stderr, "Error: %s : %s\n", usbg_error_name(usbg_ret),
+                               usbg_strerror(usbg_ret));
+               return -1;
+       }
+
+       if (!(opts & GT_VERBOSE))
+               return 0;
+
+       switch (f_attrs.header.attrs_type) {
+       case USBG_F_ATTRS_SERIAL:
+               fprintf(stdout, "    port_num\t\t%d\n",
+                               f_attrs.attrs.serial.port_num);
+               break;
+
+       case USBG_F_ATTRS_NET:
+       {
+               usbg_f_net_attrs *f_net_attrs = &f_attrs.attrs.net;
+
+               fprintf(stdout, "    dev_addr\t\t%s\n",
+                       ether_ntoa(&f_net_attrs->dev_addr));
+               fprintf(stdout, "    host_addr\t\t%s\n",
+                       ether_ntoa(&f_net_attrs->host_addr));
+               fprintf(stdout, "    ifname\t\t%s\n", f_net_attrs->ifname);
+               fprintf(stdout, "    qmult\t\t%d\n", f_net_attrs->qmult);
+               break;
+       }
+
+       case USBG_F_ATTRS_PHONET:
+               fprintf(stdout, "    ifname\t\t%s\n", f_attrs.attrs.phonet.ifname);
+               break;
+
+       case USBG_F_ATTRS_FFS:
+               fprintf(stdout, "    dev_name\t\t%s\n", f_attrs.attrs.ffs.dev_name);
+               break;
+
+       case USBG_F_ATTRS_MS:
+       {
+               usbg_f_ms_attrs *attrs = &f_attrs.attrs.ms;
+               int i;
+
+               fprintf(stdout, "    stall\t\t%d\n", attrs->stall);
+               fprintf(stdout, "    nluns\t\t%d\n", attrs->nluns);
+               for (i = 0; i < attrs->nluns; ++i) {
+                       fprintf(stdout, "    lun %d:\n", attrs->luns[i]->id);
+                       fprintf(stdout, "      cdrom\t\t%d\n", attrs->luns[i]->cdrom);
+                       fprintf(stdout, "      ro\t\t%d\n", attrs->luns[i]->ro);
+                       fprintf(stdout, "      nofua\t\t%d\n", attrs->luns[i]->nofua);
+                       fprintf(stdout, "      removable\t\t%d\n", attrs->luns[i]->removable);
+                       fprintf(stdout, "      file\t\t%s\n", attrs->luns[i]->filename);
+               }
+               break;
+       }
+
+       case USBG_F_ATTRS_MIDI:
+       {
+               usbg_f_midi_attrs *attrs = &f_attrs.attrs.midi;
+
+               fprintf(stdout, "    index\t\t%d\n", attrs->index);
+               fprintf(stdout, "    id\t\t\t%s\n", attrs->id);
+               fprintf(stdout, "    in_ports\t\t%d\n", attrs->in_ports);
+               fprintf(stdout, "    out_ports\t\t%d\n", attrs->out_ports);
+               fprintf(stdout, "    buflen\t\t%d\n", attrs->buflen);
+               fprintf(stdout, "    qlen\t\t%d\n", attrs->qlen);
+               break;
+       }
+
+       default:
+               fprintf(stdout, "    UNKNOWN\n");
+       }
+
+       usbg_cleanup_function_attrs(&f_attrs);
+       return 0;
+}
+
+static int show_func(void *data)
+{
+       struct gt_func_show_data *dt;
+       usbg_gadget *g;
+       usbg_function *f;
+
+       dt = (struct gt_func_show_data *)data;
+
+       g = usbg_get_gadget(backend_ctx.libusbg_state, dt->gadget);
+       if (g == NULL) {
+               fprintf(stderr, "Unable to find gadget %s\n",
+                       dt->gadget);
+               return -1;
+       }
+
+       if (dt->instance) {
+               f = usbg_get_function(g, dt->type, dt->instance);
+               if (f == NULL) {
+                       fprintf(stderr, "Unable to find function: %s.%s\n",
+                                       usbg_get_function_type_str(dt->type),
+                                       dt->instance);
+                       return -1;
+               }
+
+               gt_print_function_libusbg(f, dt->opts);
+       } else if (dt->type >= 0) {
+               usbg_for_each_function(f, g) {
+                       if (dt->type == usbg_get_function_type(f))
+                               gt_print_function_libusbg(f, dt->opts);
+               }
+       } else {
+               usbg_for_each_function(f, g) {
+                       gt_print_function_libusbg(f, dt->opts);
+               }
+       }
+
+       return 0;
+}
+
 struct gt_function_backend gt_function_backend_libusbg = {
        .create = create_func,
        .rm = NULL,
        .list_types = list_types_func,
        .get = NULL,
        .set = NULL,
-       .show = NULL,
+       .show = show_func,
        .load = NULL,
        .save = NULL,
        .template_default = NULL,
index 2db1bcd..d2c07a2 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include <stdio.h>
+#include <usbg/usbg.h>
 
 #include "function.h"
 #include "common.h"