shared/shell: Disable argument count check if optarg are detected 22/205022/1
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 29 May 2018 08:26:58 +0000 (11:26 +0300)
committerAmit Purwar <amit.purwar@samsung.com>
Mon, 29 Apr 2019 04:13:10 +0000 (09:43 +0530)
Command which start with optional arguments might be using optargs
format in which case checking argument count check does not work so
this disables it which shall make things btmgmt work:

[mgmt]# add-adv --help
Usage: add-adv [options] <instance_id>
Options:
 -u, --uuid <uuid>         Service UUID
 -d, --adv-data <data>     Advertising Data bytes
 -s, --scan-rsp <data>     Scan Response Data bytes
 -t, --timeout <timeout>   Timeout in seconds
 -D, --duration <duration> Duration in seconds
 -c, --connectable         "connectable" flag
 -g, --general-discov      "general-discoverable" flag
 -l, --limited-discov      "limited-discoverable" flag
 -n, --scan-rsp-local-name "local-name" flag
 -a, --scan-rsp-appearance "appearance" flag
 -m, --managed-flags       "managed-flags" flag
 -p, --tx-power            "tx-power" flag
e.g.:
add-adv -u 180d -u 180f -d 080954657374204C45 1
[mgmt]# add-adv -u 180d -u 180f -d 080954657374204C45 1
Instance added: 1

Change-Id: I6588e8a904d669843c2da9a5c43365d16752afd7
Signed-off-by: Amit Purwar <amit.purwar@samsung.com>
src/shared/shell.c

index e7f17e0..97d9157 100644 (file)
@@ -295,6 +295,7 @@ static int cmd_exec(const struct bt_shell_menu_entry *entry,
        size_t len;
        char *man, *opt;
        int flags = WRDE_NOCMD;
+       bool optargs = false;
 
        if (!entry->arg || entry->arg[0] == '\0') {
                if (argc > 1) {
@@ -323,6 +324,7 @@ static int cmd_exec(const struct bt_shell_menu_entry *entry,
                        goto optional;
                }
                man = strndup(opt, man - opt + 1);
+               optargs = true;
        }
 
        if (parse_args(man, &w, "<>", flags) < 0) {
@@ -355,7 +357,7 @@ optional:
        free(opt);
 
        /* Check if there are too many arguments */
-       if ((unsigned) argc - 1 > w.we_wordc && !w.we_offs) {
+       if (!optargs && ((unsigned int) argc - 1 > w.we_wordc && !w.we_offs)) {
                print_text(COLOR_HIGHLIGHT, "Too many arguments: %d > %zu",
                                        argc - 1, w.we_wordc);
                goto fail;