X-Git-Url: http://git.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=cli.c;h=6ba97ea0742494831edf468f6b16ddd33ea2f479;hp=e42555468d9f8c44a071a5d2997954bd0ae3629b;hb=HEAD;hpb=a6a884b368409c0c0af1c1c53f6ad4a1b55648b2 diff --git a/cli.c b/cli.c index e425554..f169e42 100644 --- a/cli.c +++ b/cli.c @@ -87,9 +87,10 @@ static char * uci_lookup_section_ref(struct uci_section *s) { struct uci_type_list *ti = type_list; + char *ret; int maxlen; - if (!s->anonymous || !(flags & CLI_FLAG_SHOW_EXT)) + if (!(flags & CLI_FLAG_SHOW_EXT)) return s->e.name; /* look up in section type list */ @@ -99,28 +100,41 @@ uci_lookup_section_ref(struct uci_section *s) ti = ti->next; } if (!ti) { - ti = malloc(sizeof(struct uci_type_list)); + ti = calloc(1, sizeof(struct uci_type_list)); if (!ti) return NULL; - memset(ti, 0, sizeof(struct uci_type_list)); ti->next = type_list; type_list = ti; ti->name = s->type; } - maxlen = strlen(s->type) + 1 + 2 + 10; - if (!typestr) { - typestr = malloc(maxlen); + if (s->anonymous) { + maxlen = strlen(s->type) + 1 + 2 + 10; + if (!typestr) { + typestr = malloc(maxlen); + if (!typestr) + return NULL; + } else { + void *p = realloc(typestr, maxlen); + if (!p) { + free(typestr); + return NULL; + } + + typestr = p; + } + + if (typestr) + sprintf(typestr, "@%s[%d]", ti->name, ti->idx); + + ret = typestr; } else { - typestr = realloc(typestr, maxlen); + ret = s->e.name; } - if (typestr) - sprintf(typestr, "@%s[%d]", ti->name, ti->idx); - ti->idx++; - return typestr; + return ret; } static void uci_usage(void) @@ -153,6 +167,7 @@ static void uci_usage(void) "\t-N don't name unnamed sections\n" "\t-p add a search path for config change files\n" "\t-P add a search path for config change files and use as default\n" + "\t-t set save path for config change files\n" "\t-q quiet mode (don't print error messages)\n" "\t-s force strict mode (stop on parser errors, default)\n" "\t-S disable strict mode\n" @@ -170,6 +185,7 @@ static void cli_perror(void) uci_perror(ctx, appname); } +__attribute__((format(printf, 1, 2))) static void cli_error(const char *fmt, ...) { va_list ap; @@ -298,7 +314,6 @@ static void uci_show_changes(struct uci_package *p) static int package_cmd(int cmd, char *tuple) { - struct uci_element *e = NULL; struct uci_ptr ptr; int ret = 1; @@ -307,7 +322,6 @@ static int package_cmd(int cmd, char *tuple) return 1; } - e = ptr.last; switch(cmd) { case CMD_CHANGES: uci_show_changes(ptr.p); @@ -333,20 +347,14 @@ static int package_cmd(int cmd, char *tuple) cli_perror(); goto out; } - switch(e->type) { - case UCI_TYPE_PACKAGE: - uci_show_package(ptr.p); - break; - case UCI_TYPE_SECTION: - uci_show_section(ptr.s); - break; - case UCI_TYPE_OPTION: - uci_show_option(ptr.o, true); - break; - default: - /* should not happen */ - goto out; - } + if (ptr.o) + uci_show_option(ptr.o, true); + else if (ptr.s) + uci_show_section(ptr.s); + else if (ptr.p) + uci_show_package(ptr.p); + else + goto out; /* should not happen */ break; } @@ -459,7 +467,6 @@ done: 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; @@ -477,7 +484,6 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv) (cmd != CMD_RENAME) && (cmd != CMD_REORDER)) return 1; - e = ptr.last; switch(cmd) { case CMD_GET: if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) { @@ -485,17 +491,10 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv) cli_perror(); return 1; } - switch(e->type) { - case UCI_TYPE_SECTION: - printf("%s\n", ptr.s->type); - break; - case UCI_TYPE_OPTION: + if (ptr.o) uci_show_value(ptr.o, false); - break; - default: - break; - } - /* throw the value to stdout */ + else if (ptr.s) + printf("%s\n", ptr.s->type); break; case CMD_RENAME: ret = uci_rename(ctx, &ptr); @@ -556,7 +555,7 @@ static int uci_batch_cmd(void) return 1; } argv[i] = NULL; - if ((ret = uci_parse_argument(ctx, input, &str, &argv[i])) != UCI_OK) { + if (uci_parse_argument(ctx, input, &str, &argv[i]) != UCI_OK) { cli_perror(); i = 0; break; @@ -691,7 +690,7 @@ int main(int argc, char **argv) return 1; } - while((c = getopt(argc, argv, "c:d:f:LmnNp:P:sSqX")) != -1) { + while((c = getopt(argc, argv, "c:d:f:LmnNp:P:qsSt:X")) != -1) { switch(c) { case 'c': uci_set_confdir(ctx, optarg); @@ -732,13 +731,15 @@ int main(int argc, char **argv) uci_add_delta_path(ctx, optarg); break; case 'P': - uci_add_delta_path(ctx, ctx->savedir); uci_set_savedir(ctx, optarg); flags |= CLI_FLAG_NOCOMMIT; break; case 'q': flags |= CLI_FLAG_QUIET; break; + case 't': + uci_set_savedir(ctx, optarg); + break; case 'X': flags &= ~CLI_FLAG_SHOW_EXT; break;