X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=cli.c;h=3ade5343b87cb1d1798530ed29aef2c15b022b7d;hp=3d25b7c42c21dc3eeda83987ff1bc56a39ad0250;hb=bdb2bbfbe937312463763bd5ce35a7f857238081;hpb=78f76bde7306cc9dd501b5325b2e40af8b22ad51 diff --git a/cli.c b/cli.c index 3d25b7c..3ade534 100644 --- a/cli.c +++ b/cli.c @@ -19,9 +19,15 @@ static const char *appname = "uci"; static struct uci_context *ctx; enum { + /* section cmds */ CMD_GET, CMD_SET, - CMD_DEL + CMD_DEL, + CMD_RENAME, + /* package cmds */ + CMD_SHOW, + CMD_EXPORT, + CMD_COMMIT, }; static void uci_usage(int argc, char **argv) @@ -56,90 +62,87 @@ static void uci_show_section(struct uci_section *p) } } -static void uci_show_package(struct uci_package *p, char *section) +static void uci_show_package(struct uci_package *p) { struct uci_element *e; uci_foreach_element( &p->sections, e) { - if (!section || !strcmp(e->name, section)) - uci_show_section(uci_to_section(e)); + uci_show_section(uci_to_section(e)); } } -static int uci_show(int argc, char **argv) + +static int package_cmd(int cmd, char *package) { - char *section = (argc > 2 ? argv[2] : NULL); - struct uci_package *package; - char **configs = NULL; - char **p; + struct uci_package *p = NULL; - if ((uci_list_configs(ctx, &configs) != UCI_OK) || !configs) { + if (uci_load(ctx, package, &p) != UCI_OK) { uci_perror(ctx, appname); return 1; } - - if (argc >= 2) { - if (uci_load(ctx, argv[1], &package) != UCI_OK) { + switch(cmd) { + case CMD_COMMIT: + if (uci_commit(ctx, &p) != UCI_OK) uci_perror(ctx, appname); - return 1; - } - uci_show_package(package, section); - uci_unload(ctx, package); - return 0; - } - - for (p = configs; *p; p++) { - if ((argc < 2) || !strcmp(argv[1], *p)) { - if (uci_load(ctx, *p, &package) != UCI_OK) { - uci_perror(ctx, appname); - return 1; - } - uci_show_package(package, section); - uci_unload(ctx, package); - } + break; + case CMD_EXPORT: + uci_export(ctx, stdout, p, true); + break; + case CMD_SHOW: + uci_show_package(p); + break; } + uci_unload(ctx, p); return 0; } -static int uci_do_export(int argc, char **argv) +static int uci_do_package_cmd(int cmd, int argc, char **argv) { char **configs = NULL; char **p; + if (argc > 2) + return 255; + + if (argc == 2) + return package_cmd(cmd, argv[1]); + if ((uci_list_configs(ctx, &configs) != UCI_OK) || !configs) { uci_perror(ctx, appname); return 1; } for (p = configs; *p; p++) { - if ((argc < 2) || !strcmp(argv[1], *p)) { - struct uci_package *package = NULL; - int ret; - - ret = uci_load(ctx, *p, &package); - if (ret) - continue; - uci_export(ctx, stdout, package, true); - uci_unload(ctx, package); - } + package_cmd(cmd, *p); } + return 0; } -static int uci_do_cmd(int cmd, int argc, char **argv) + +static int uci_do_section_cmd(int cmd, int argc, char **argv) { char *package = NULL; char *section = NULL; char *option = NULL; char *value = NULL; + char **ptr = NULL; struct uci_package *p = NULL; struct uci_element *e = NULL; if (argc != 2) return 255; - if (uci_parse_tuple(ctx, argv[1], &package, §ion, &option, (cmd == CMD_SET ? &value : NULL)) != UCI_OK) + switch(cmd) { + case CMD_SET: + case CMD_RENAME: + ptr = &value; + break; + default: + break; + } + if (uci_parse_tuple(ctx, argv[1], &package, §ion, &option, ptr) != UCI_OK) return 1; if (uci_load(ctx, package, &p) != UCI_OK) { @@ -147,11 +150,11 @@ static int uci_do_cmd(int cmd, int argc, char **argv) return 1; } - if (uci_lookup(ctx, &e, p, section, option) != UCI_OK) - return 1; - switch(cmd) { case CMD_GET: + if (uci_lookup(ctx, &e, p, section, option) != UCI_OK) + return 1; + switch(e->type) { case UCI_TYPE_SECTION: value = uci_to_section(e)->type; @@ -166,6 +169,12 @@ static int uci_do_cmd(int cmd, int argc, char **argv) /* throw the value to stdout */ printf("%s\n", value); break; + case CMD_RENAME: + if (uci_rename(ctx, p, section, option, value) != UCI_OK) { + uci_perror(ctx, appname); + return 1; + } + break; case CMD_SET: if (uci_set(ctx, p, section, option, value) != UCI_OK) { uci_perror(ctx, appname); @@ -173,7 +182,7 @@ static int uci_do_cmd(int cmd, int argc, char **argv) } break; case CMD_DEL: - if (uci_del(ctx, p, section, option) != UCI_OK) { + if (uci_delete(ctx, p, section, option) != UCI_OK) { uci_perror(ctx, appname); return 1; } @@ -195,22 +204,39 @@ static int uci_do_cmd(int cmd, int argc, char **argv) static int uci_cmd(int argc, char **argv) { - int cmd; + int cmd = 0; if (!strcasecmp(argv[0], "show")) - return uci_show(argc, argv); - if (!strcasecmp(argv[0], "export")) - return uci_do_export(argc, argv); - - if (!strcasecmp(argv[0], "get")) + cmd = CMD_SHOW; + else if (!strcasecmp(argv[0], "export")) + cmd = CMD_EXPORT; + else if (!strcasecmp(argv[0], "commit")) + cmd = CMD_COMMIT; + else if (!strcasecmp(argv[0], "get")) cmd = CMD_GET; else if (!strcasecmp(argv[0], "set")) cmd = CMD_SET; + else if (!strcasecmp(argv[0], "ren") || + !strcasecmp(argv[0], "rename")) + cmd = CMD_RENAME; else if (!strcasecmp(argv[0], "del")) cmd = CMD_DEL; else - return 255; - return uci_do_cmd(cmd, argc, argv); + cmd = -1; + + switch(cmd) { + case CMD_GET: + case CMD_SET: + case CMD_DEL: + case CMD_RENAME: + return uci_do_section_cmd(cmd, argc, argv); + case CMD_SHOW: + case CMD_EXPORT: + case CMD_COMMIT: + return uci_do_package_cmd(cmd, argc, argv); + default: + return 255; + } } int main(int argc, char **argv)