X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=cli.c;h=144cddefa285f0fbdfaa4d88514404a6686b6258;hp=8ab38504c3614c9f238a2a4a009024b1e046968e;hb=2e90d2637abcbea12f5f4070be7a158fb4637604;hpb=7e840cf19ac6c867b9708257efd93e4a7efaa97e diff --git a/cli.c b/cli.c index 8ab3850..144cdde 100644 --- a/cli.c +++ b/cli.c @@ -1,4 +1,5 @@ /* + * cli - Command Line Interface for the Unified Configuration Interface * Copyright (C) 2008 Felix Fietkau * * This program is free software; you can redistribute it and/or modify @@ -11,231 +12,700 @@ * GNU General Public License for more details. */ #include +#include #include +#include #include "uci.h" +#define MAX_ARGS 4 /* max command line arguments for batch mode */ + +static const char *delimiter = " "; +static const char *appname; +static enum { + CLI_FLAG_MERGE = (1 << 0), + CLI_FLAG_QUIET = (1 << 1), + 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; + static struct uci_context *ctx; +enum { + /* section cmds */ + CMD_GET, + CMD_SET, + CMD_ADD_LIST, + CMD_DEL, + CMD_RENAME, + CMD_REVERT, + CMD_REORDER, + /* package cmds */ + CMD_SHOW, + CMD_CHANGES, + CMD_EXPORT, + CMD_COMMIT, + /* other cmds */ + CMD_ADD, + CMD_IMPORT, + CMD_HELP, +}; + +struct uci_type_list { + unsigned int idx; + const char *name; + struct uci_type_list *next; +}; + +static struct uci_type_list *type_list = NULL; +static char *typestr = NULL; +static const char *cur_section_ref = NULL; + +static int uci_cmd(int argc, char **argv); + +static void +uci_reset_typelist(void) +{ + struct uci_type_list *type; + while (type_list != NULL) { + type = type_list; + type_list = type_list->next; + free(type); + } + if (typestr) { + free(typestr); + typestr = NULL; + } + cur_section_ref = NULL; +} + +static char * +uci_lookup_section_ref(struct uci_section *s) +{ + struct uci_type_list *ti = type_list; + int maxlen; + + if (!s->anonymous || !(flags & CLI_FLAG_SHOW_EXT)) + return s->e.name; + + /* look up in section type list */ + while (ti) { + if (strcmp(ti->name, s->type) == 0) + break; + ti = ti->next; + } + if (!ti) { + ti = malloc(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); + } else { + typestr = realloc(typestr, maxlen); + } + + if (typestr) + sprintf(typestr, "@%s[%d]", ti->name, ti->idx); + + ti->idx++; + + return typestr; +} -static void uci_usage(int argc, char **argv) +static void uci_usage(void) { fprintf(stderr, "Usage: %s [] []\n\n" "Commands:\n" - "\texport []\n" - "\tshow [[.
[.