tests: use uci instead of uci-static
[project/uci.git] / cli.c
diff --git a/cli.c b/cli.c
index 144cdde..6fbbfe9 100644 (file)
--- a/cli.c
+++ b/cli.c
@@ -27,7 +27,6 @@ static enum {
        CLI_FLAG_NOCOMMIT = (1 << 2),
        CLI_FLAG_BATCH =    (1 << 3),
        CLI_FLAG_SHOW_EXT = (1 << 4),
-       CLI_FLAG_NOPLUGINS= (1 << 5),
 } flags;
 
 static FILE *input;
@@ -38,6 +37,7 @@ enum {
        CMD_GET,
        CMD_SET,
        CMD_ADD_LIST,
+       CMD_DEL_LIST,
        CMD_DEL,
        CMD_RENAME,
        CMD_REVERT,
@@ -133,10 +133,11 @@ static void uci_usage(void)
                "\tcommit     [<config>]\n"
                "\tadd        <config> <section-type>\n"
                "\tadd_list   <config>.<section>.<option>=<string>\n"
+               "\tdel_list   <config>.<section>.<option>=<string>\n"
                "\tshow       [<config>[.<section>[.<option>]]]\n"
                "\tget        <config>.<section>[.<option>]\n"
                "\tset        <config>.<section>[.<option>]=<value>\n"
-               "\tdelete     <config>[.<section[.<option>]]\n"
+               "\tdelete     <config>[.<section>[[.<option>][=<id>]]]\n"
                "\trename     <config>.<section>[.<option>]=<name>\n"
                "\trevert     <config>[.<section>[.<option>]]\n"
                "\treorder    <config>.<section>=<position>\n"
@@ -145,7 +146,6 @@ static void uci_usage(void)
                "\t-c <path>  set the search path for config files (default: /etc/config)\n"
                "\t-d <str>   set the delimiter for list values in uci show\n"
                "\t-f <file>  use <file> as input instead of stdin\n"
-               "\t-L         do not load any plugins\n"
                "\t-m         when importing, merge data into an existing package\n"
                "\t-n         name unnamed sections on export (default)\n"
                "\t-N         don't name unnamed sections\n"
@@ -242,6 +242,9 @@ static void uci_show_changes(struct uci_package *p)
                case UCI_CMD_LIST_ADD:
                        op = "+=";
                        break;
+               case UCI_CMD_LIST_DEL:
+                       op = "-=";
+                       break;
                default:
                        break;
                }
@@ -409,6 +412,7 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
        struct uci_element *e;
        struct uci_ptr ptr;
        int ret = UCI_OK;
+       int dummy;
 
        if (argc != 2)
                return 255;
@@ -418,7 +422,9 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
                return 1;
        }
 
-       if (ptr.value && (cmd != CMD_SET) && (cmd != CMD_ADD_LIST) && (cmd != CMD_RENAME) && (cmd != CMD_REORDER))
+       if (ptr.value && (cmd != CMD_SET) && (cmd != CMD_DEL) &&
+           (cmd != CMD_ADD_LIST) && (cmd != CMD_DEL_LIST) &&
+           (cmd != CMD_RENAME) && (cmd != CMD_REORDER))
                return 1;
 
        e = ptr.last;
@@ -453,6 +459,9 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
        case CMD_ADD_LIST:
                ret = uci_add_list(ctx, &ptr);
                break;
+       case CMD_DEL_LIST:
+               ret = uci_del_list(ctx, &ptr);
+               break;
        case CMD_REORDER:
                if (!ptr.s || !ptr.value) {
                        ctx->err = UCI_ERR_NOTFOUND;
@@ -462,6 +471,8 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
                ret = uci_reorder_section(ctx, ptr.s, strtoul(ptr.value, NULL, 10));
                break;
        case CMD_DEL:
+               if (ptr.value && !sscanf(ptr.value, "%d", &dummy))
+                       return 1;
                ret = uci_delete(ctx, &ptr);
                break;
        }
@@ -518,8 +529,7 @@ static int uci_batch_cmd(void)
                return 0;
 
        for (j = 0; j < i; j++) {
-               if (argv[j])
-                       free(argv[j]);
+               free(argv[j]);
        }
 
        return ret;
@@ -585,11 +595,14 @@ static int uci_cmd(int argc, char **argv)
                cmd = CMD_ADD;
        else if (!strcasecmp(argv[0], "add_list"))
                cmd = CMD_ADD_LIST;
+       else if (!strcasecmp(argv[0], "del_list"))
+               cmd = CMD_DEL_LIST;
        else
                cmd = -1;
 
        switch(cmd) {
                case CMD_ADD_LIST:
+               case CMD_DEL_LIST:
                case CMD_GET:
                case CMD_SET:
                case CMD_DEL:
@@ -648,9 +661,6 @@ int main(int argc, char **argv)
                                        return 1;
                                }
                                break;
-                       case 'L':
-                               flags |= CLI_FLAG_NOPLUGINS;
-                               break;
                        case 'm':
                                flags |= CLI_FLAG_MERGE;
                                break;
@@ -696,9 +706,6 @@ int main(int argc, char **argv)
                return 0;
        }
 
-       if (!(flags & CLI_FLAG_NOPLUGINS))
-               uci_load_plugins(ctx, NULL);
-
        ret = uci_cmd(argc - 1, argv + 1);
        if (input != stdin)
                fclose(input);