X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=cli.c;h=305d9fed4b3a83a3118c573b47da51f6bf144313;hp=b48567faf90bce689491514b54315897c708c9a3;hb=43124956bc9c1083e476f6cadaedf27b7788d004;hpb=672d68a8765c242dd939a31b520acbe1c9c1d7c2 diff --git a/cli.c b/cli.c index b48567f..305d9fe 100644 --- a/cli.c +++ b/cli.c @@ -155,67 +155,67 @@ static void uci_show_changes(struct uci_package *p) uci_foreach_element(&p->saved_history, e) { struct uci_history *h = uci_to_history(e); + char *prefix = ""; + char *op = "="; - if (h->cmd == UCI_CMD_REMOVE) - printf("-"); - printf("%s.%s", p->e.name, h->section); + switch(h->cmd) { + case UCI_CMD_REMOVE: + prefix = "-"; + break; + case UCI_CMD_LIST_ADD: + op = "+="; + break; + default: + break; + } + printf("%s%s.%s", prefix, p->e.name, h->section); if (e->name) printf(".%s", e->name); if (h->cmd != UCI_CMD_REMOVE) - printf("=%s", h->value); + printf("%s%s", op, h->value); printf("\n"); } } static int package_cmd(int cmd, char *tuple) { - struct uci_package *p; - struct uci_section *s; struct uci_element *e = NULL; + struct uci_ptr ptr; - if (uci_lookup_ext(ctx, &e, tuple) != UCI_OK) { + if (uci_lookup_ptr(ctx, &ptr, tuple, true) != UCI_OK) { cli_perror(); return 1; } - switch(e->type) { - case UCI_TYPE_PACKAGE: - p = uci_to_package(e); - break; - case UCI_TYPE_SECTION: - s = uci_to_section(e); - p = s->package; - break; - case UCI_TYPE_OPTION: - s = uci_to_option(e)->section; - p = s->package; - break; - default: - return 0; - } + e = ptr.last; switch(cmd) { case CMD_CHANGES: - uci_show_changes(p); + uci_show_changes(ptr.p); break; case CMD_COMMIT: if (flags & CLI_FLAG_NOCOMMIT) return 0; - if (uci_commit(ctx, &p, false) != UCI_OK) + if (uci_commit(ctx, &ptr.p, false) != UCI_OK) cli_perror(); break; case CMD_EXPORT: - uci_export(ctx, stdout, p, true); + uci_export(ctx, stdout, ptr.p, true); break; case CMD_SHOW: + if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) { + ctx->err = UCI_ERR_NOTFOUND; + cli_perror(); + return 1; + } switch(e->type) { case UCI_TYPE_PACKAGE: - uci_show_package(p); + uci_show_package(ptr.p); break; case UCI_TYPE_SECTION: - uci_show_section(uci_to_section(e)); + uci_show_section(ptr.s); break; case UCI_TYPE_OPTION: - uci_show_option(uci_to_option(e)); + uci_show_option(ptr.o); break; default: /* should not happen */ @@ -224,7 +224,7 @@ static int package_cmd(int cmd, char *tuple) break; } - uci_unload(ctx, p); + uci_unload(ctx, ptr.p); return 0; } @@ -325,75 +325,35 @@ done: static int uci_do_section_cmd(int cmd, int argc, char **argv) { - struct uci_package *p = NULL; - struct uci_section *s = NULL; - struct uci_element *e = NULL; - struct uci_option *o = NULL; - char *package = NULL; - char *section = NULL; - char *option = NULL; - char *value = NULL; + struct uci_element *e; + struct uci_ptr ptr; int ret = UCI_OK; - char *str; if (argc != 2) return 255; - value = strchr(argv[1], '='); - if (value) { - *value = 0; - value++; - if (!uci_validate_text(value)) - return 1; - } - - str = strdup(argv[1]); - if (!str) - return 1; - - if (value && (cmd != CMD_SET) && (cmd != CMD_ADD_LIST) && (cmd != CMD_RENAME)) - return 1; - - if (uci_parse_tuple(ctx, str, &package, §ion, &option, NULL) != UCI_OK) { + if (uci_lookup_ptr(ctx, &ptr, argv[1], true) != UCI_OK) { cli_perror(); return 1; } - sprintf(argv[1], "%s.%s", package, section); - free(str); - if (uci_lookup_ext(ctx, &e, argv[1]) != UCI_OK) { - cli_perror(); + if (ptr.value && (cmd != CMD_SET) && (cmd != CMD_ADD_LIST) && (cmd != CMD_RENAME)) return 1; - } - - switch(e->type) { - case UCI_TYPE_PACKAGE: - p = uci_to_package(e); - break; - case UCI_TYPE_SECTION: - s = uci_to_section(e); - break; - case UCI_TYPE_OPTION: - option = e->name; - s = uci_to_option(e)->section; - break; - default: - return 1; - } - if (s) { - section = s->e.name; - p = s->package; - } + e = ptr.last; switch(cmd) { case CMD_GET: + if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) { + ctx->err = UCI_ERR_NOTFOUND; + cli_perror(); + return 1; + } switch(e->type) { case UCI_TYPE_SECTION: - printf("%s\n", s->type); + printf("%s\n", ptr.s->type); break; case UCI_TYPE_OPTION: - o = uci_to_option(e); - uci_show_value(o); + uci_show_value(ptr.o); break; default: break; @@ -401,19 +361,19 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv) /* throw the value to stdout */ break; case CMD_RENAME: - ret = uci_rename(ctx, p, section, option, value); + ret = uci_rename(ctx, &ptr); break; case CMD_REVERT: - ret = uci_revert(ctx, &p, section, option); + ret = uci_revert(ctx, &ptr); break; case CMD_SET: - ret = uci_set(ctx, p, section, option, value, NULL); + ret = uci_set(ctx, &ptr); break; case CMD_ADD_LIST: - ret = uci_add_list(ctx, p, section, option, value, NULL); + ret = uci_add_list(ctx, &ptr); break; case CMD_DEL: - ret = uci_delete(ctx, p, section, option); + ret = uci_delete(ctx, &ptr); break; } @@ -423,7 +383,7 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv) /* save changes, but don't commit them yet */ if (ret == UCI_OK) - ret = uci_save(ctx, p); + ret = uci_save(ctx, ptr.p); if (ret != UCI_OK) { cli_perror(); @@ -520,7 +480,8 @@ static int uci_cmd(int argc, char **argv) cmd = CMD_RENAME; else if (!strcasecmp(argv[0], "revert")) cmd = CMD_REVERT; - else if (!strcasecmp(argv[0], "del")) + else if (!strcasecmp(argv[0], "del") || + !strcasecmp(argv[0], "delete")) cmd = CMD_DEL; else if (!strcasecmp(argv[0], "import")) cmd = CMD_IMPORT;