diff options
author | Jo-Philipp Wich <jo@mein.io> | 2016-07-16 14:52:36 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2016-07-26 12:16:05 +0200 |
commit | ac481cdd999ee84d3f115c33a56397237e95ec64 (patch) | |
tree | fd1a880fac81fa13baffd60b436afc18a79d97a7 /validate | |
parent | aead2c0cbffdda9b46d74a998a4c6aeef423b21a (diff) | |
download | ubox-ac481cdd999ee84d3f115c33a56397237e95ec64.tar.gz |
validate: fix datatype handling of default values
Properly handle the datatype of default values when the corresponding uci
value is unset. Also consolidate the three default value code branches into
a single one.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'validate')
-rw-r--r-- | validate/cli.c | 63 |
1 files changed, 28 insertions, 35 deletions
diff --git a/validate/cli.c b/validate/cli.c index 07d2b2e..f03c8a1 100644 --- a/validate/cli.c +++ b/validate/cli.c @@ -109,39 +109,28 @@ static int validate_value(struct uci_ptr *ptr, const char *expr, const char *def) { int i = 0; - bool empty = true, first = true; + bool empty = true; enum dt_type type = DT_INVALID; struct uci_element *e; - struct uci_option *opt = ptr->o; + struct uci_option *opt = NULL; - if (opt->type == UCI_TYPE_LIST) - { - uci_foreach_element(&opt->v.list, e) - { - if (!e->name || !*e->name) - continue; - - empty = false; - break; - } - - if (empty) - { - export_value(DT_STRING, ptr->option, def); - return 0; - } + if ((ptr->flags & UCI_LOOKUP_COMPLETE) && + (ptr->last->type == UCI_TYPE_OPTION)) + opt = ptr->o; + if (opt && opt->type == UCI_TYPE_LIST) + { uci_foreach_element(&opt->v.list, e) { if (!e->name || !*e->name) continue; - if (first) + if (empty) printf("%s=", ptr->option); else printf("\\ "); - first = false; + empty = false; type = dt_parse(expr, e->name); if (type != DT_INVALID) @@ -152,16 +141,12 @@ validate_value(struct uci_ptr *ptr, const char *expr, const char *def) expr, type ? "true" : "false"); } - printf("; "); + if (!empty) + printf("; "); } - else + else if (opt && opt->v.string && *opt->v.string) { - if (!opt->v.string || !*opt->v.string) - { - export_value(DT_STRING, ptr->option, def); - return 0; - } - + empty = false; type = dt_parse(expr, opt->v.string); export_value(type, ptr->option, opt->v.string); @@ -169,6 +154,20 @@ 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"); } + + if (empty) + { + type = dt_parse(expr, def); + + if (type == DT_INVALID) + type = DT_STRING; + + export_value(type, ptr->option, def); + + fprintf(stderr, "%s.%s.%s is unset and defaults to %s %s\n", + ptr->package, ptr->section, ptr->option, expr, def); + } + return type ? 0 : -1; } @@ -188,13 +187,7 @@ validate_option(struct uci_context *ctx, char *package, char *section, char *opt ptr.section = section; 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, opt, def); - return 0; - } + uci_lookup_ptr(ctx, &ptr, NULL, false); return validate_value(&ptr, expr, def); } |