X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubox.git;a=blobdiff_plain;f=validate%2Fcli.c;h=07d2b2ef9cb28bbf4e53911f7f71cf0d013092ff;hp=ee5c189447123cf823e53a4c6f274cc82a2a139e;hb=31d66f2c3b2afbc9eaae4e2c22103d0f79e9503e;hpb=30deade42ebd7fa112ee2693e9c2cc6532f0e3cf diff --git a/validate/cli.c b/validate/cli.c index ee5c189..07d2b2e 100644 --- a/validate/cli.c +++ b/validate/cli.c @@ -22,14 +22,46 @@ print_usage(char *argv) static const char * bool_to_num(const char *val) { - if (!strcmp(val, "0") || !strcmp(val, "off") || !strcmp(val, "false") || !strcmp(val, "disabled")) + if (!strcmp(val, "0") || !strcmp(val, "off") || !strcmp(val, "false") || !strcmp(val, "no") || !strcmp(val, "disabled")) return "0"; - if (!strcmp(val, "1") || !strcmp(val, "on") || !strcmp(val, "true") || !strcmp(val, "enabled")) + if (!strcmp(val, "1") || !strcmp(val, "on") || !strcmp(val, "true") || !strcmp(val, "yes") || !strcmp(val, "enabled")) return "1"; return ""; } +static bool +parse_tuple(char *tuple, char **option, char **expr, char **def) +{ + char *p; + bool esc; + + for (esc = false, p = *option = tuple, *expr = NULL, *def = NULL; *p; p++) + { + if (!esc && *p == '\\') + { + esc = true; + continue; + } + + if (!esc && *p == ':') + { + *p++ = 0; + + if (!*expr) + *expr = p; + else if (!*def) + *def = p; + else + break; + } + + esc = false; + } + + return (*expr != NULL); +} + static void escape_value(enum dt_type type, const char *val) { @@ -73,12 +105,12 @@ export_value(enum dt_type type, const char *name, const char *val) printf("; "); } -static void +static int validate_value(struct uci_ptr *ptr, const char *expr, const char *def) { int i = 0; bool empty = true, first = true; - enum dt_type type; + enum dt_type type = DT_INVALID; struct uci_element *e; struct uci_option *opt = ptr->o; @@ -96,7 +128,7 @@ validate_value(struct uci_ptr *ptr, const char *expr, const char *def) if (empty) { export_value(DT_STRING, ptr->option, def); - return; + return 0; } uci_foreach_element(&opt->v.list, e) @@ -127,7 +159,7 @@ validate_value(struct uci_ptr *ptr, const char *expr, const char *def) if (!opt->v.string || !*opt->v.string) { export_value(DT_STRING, ptr->option, def); - return; + return 0; } type = dt_parse(expr, opt->v.string); @@ -137,38 +169,34 @@ validate_value(struct uci_ptr *ptr, const char *expr, const char *def) ptr->package, ptr->section, ptr->option, opt->v.string, expr, type ? "true" : "false"); } + return type ? 0 : -1; } -static void +static int validate_option(struct uci_context *ctx, char *package, char *section, char *option) { - char *def, *expr; + char *opt, *expr, *def; struct uci_ptr ptr = { 0 }; - if ((expr = strchr(option, ':')) == NULL) + if (!parse_tuple(option, &opt, &expr, &def)) { fprintf(stderr, "%s is not a valid option\n", option); - return; + return -1; } - *expr++ = 0; - - if ((def = strrchr(expr, ':')) != NULL) - *def++ = 0; - ptr.package = package; ptr.section = section; - ptr.option = option; + ptr.option = opt; if (uci_lookup_ptr(ctx, &ptr, NULL, false) || !(ptr.flags & UCI_LOOKUP_COMPLETE) || (ptr.last->type != UCI_TYPE_OPTION)) { - export_value(DT_STRING, option, def); - return; + export_value(DT_STRING, opt, def); + return 0; } - validate_value(&ptr, expr, def); + return validate_value(&ptr, expr, def); } int @@ -176,9 +204,10 @@ main(int argc, char **argv) { struct uci_context *ctx; struct uci_package *package; + char *opt, *expr, *def; int len = argc - 4; - bool rv; - int i; + enum dt_type rv; + int i, rc; if (argc == 3) { rv = dt_parse(argv[1], argv[2]); @@ -196,18 +225,12 @@ main(int argc, char **argv) printf("json_add_object \"data\"; "); for (i = 0; i < len; i++) { - char *datatype = strstr(argv[4 + i], ":"); - char *def; - - if (!datatype) + if (!parse_tuple(argv[4 + i], &opt, &expr, &def)) continue; - *datatype = '\0'; - datatype++; - def = strstr(datatype, ":"); - if (def) - *def = '\0'; - printf("json_add_string \"%s\" \"%s\"; ", argv[4 + i], datatype); + + printf("json_add_string \"%s\" \"%s\"; ", opt, expr); } + printf("json_close_object; "); printf("json_close_object; "); @@ -221,8 +244,12 @@ main(int argc, char **argv) if (uci_load(ctx, argv[1], &package)) return -1; - for (i = 0; i < len; i++) - validate_option(ctx, argv[1], argv[3], argv[4 + i]); + rc = 0; + for (i = 0; i < len; i++) { + if (validate_option(ctx, argv[1], argv[3], argv[4 + i])) { + rc = -1; + } + } - return 0; + return rc; }