Message ID | 1418633213-50491-8-git-send-email-yszhou4tech@gmail.com |
---|---|
State | Superseded |
Headers | show |
On 15 December 2014 at 16:46, Yousong Zhou <yszhou4tech@gmail.com> wrote: > > Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com> > --- > cli.c | 40 ++++++++++++++++++++++++++++++---------- > 1 file changed, 30 insertions(+), 10 deletions(-) > > diff --git a/cli.c b/cli.c > index 6fbbfe9..85a24d8 100644 > --- a/cli.c > +++ b/cli.c > @@ -168,18 +168,36 @@ static void cli_perror(void) > uci_perror(ctx, appname); > } > > -static void uci_show_value(struct uci_option *o) > +static void uci_print_value(FILE *f, const char *v) > +{ > + fprintf(f, "'"); > + while (*v) { > + if (*v != '\'') > + fputc(*v, f); > + else > + fprintf(f, "'\\''"); > + v++; > + } > + fprintf(f, "'"); > +} > + > +static void uci_show_value(struct uci_option *o, bool quote) > { > struct uci_element *e; > bool sep = false; > > switch(o->type) { > case UCI_TYPE_STRING: > - printf("%s\n", o->v.string); > + if (quote) > + uci_print_value(stdout, o->v.string); > + else > + printf("%s", o->v.string); > + printf("\n"); > break; > case UCI_TYPE_LIST: > uci_foreach_element(&o->v.list, e) { > - printf("%s%s", (sep ? delimiter : ""), e->name); > + printf("%s", (sep ? delimiter : "")); > + uci_print_value(stdout, e->name); > sep = true; > } While `config_foreach` works okay with this change. I may note that this will break usages like the following network=$(uci get sockd.instance0.internal_network) status=$(ifstatus "$network") where option `internal_network` is of list type, thus the value will be quoted resulting a call to ifstatus like the following. ifstatus "'vpn'" which is invalid of course. Anyway, I think `config_foreach` should be used in such cases. Regards. yousong > printf("\n"); > @@ -190,13 +208,13 @@ static void uci_show_value(struct uci_option *o) > } > }
On 16 December 2014 at 16:28, Yousong Zhou <yszhou4tech@gmail.com> wrote: > On 15 December 2014 at 16:46, Yousong Zhou <yszhou4tech@gmail.com> wrote: >> >> Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com> >> --- >> +static void uci_show_value(struct uci_option *o, bool quote) >> { >> struct uci_element *e; >> bool sep = false; >> >> switch(o->type) { >> case UCI_TYPE_STRING: >> - printf("%s\n", o->v.string); >> + if (quote) >> + uci_print_value(stdout, o->v.string); >> + else >> + printf("%s", o->v.string); >> + printf("\n"); >> break; >> case UCI_TYPE_LIST: >> uci_foreach_element(&o->v.list, e) { >> - printf("%s%s", (sep ? delimiter : ""), e->name); >> + printf("%s", (sep ? delimiter : "")); >> + uci_print_value(stdout, e->name); >> sep = true; >> } > > While `config_foreach` works okay with this change. I may note that > this will break usages like the following > > network=$(uci get sockd.instance0.internal_network) > status=$(ifstatus "$network") > > where option `internal_network` is of list type, thus the value will > be quoted resulting a call to ifstatus like the following. > > ifstatus "'vpn'" > > which is invalid of course. Anyway, I think `config_foreach` should > be used in such cases. It's `config_list_foreach`, sorry for the typo. yousong > > Regards. > > yousong > > >> printf("\n"); >> @@ -190,13 +208,13 @@ static void uci_show_value(struct uci_option *o) >> } >> }
diff --git a/cli.c b/cli.c index 6fbbfe9..85a24d8 100644 --- a/cli.c +++ b/cli.c @@ -168,18 +168,36 @@ static void cli_perror(void) uci_perror(ctx, appname); } -static void uci_show_value(struct uci_option *o) +static void uci_print_value(FILE *f, const char *v) +{ + fprintf(f, "'"); + while (*v) { + if (*v != '\'') + fputc(*v, f); + else + fprintf(f, "'\\''"); + v++; + } + fprintf(f, "'"); +} + +static void uci_show_value(struct uci_option *o, bool quote) { struct uci_element *e; bool sep = false; switch(o->type) { case UCI_TYPE_STRING: - printf("%s\n", o->v.string); + if (quote) + uci_print_value(stdout, o->v.string); + else + printf("%s", o->v.string); + printf("\n"); break; case UCI_TYPE_LIST: uci_foreach_element(&o->v.list, e) { - printf("%s%s", (sep ? delimiter : ""), e->name); + printf("%s", (sep ? delimiter : "")); + uci_print_value(stdout, e->name); sep = true; } printf("\n"); @@ -190,13 +208,13 @@ static void uci_show_value(struct uci_option *o) } } -static void uci_show_option(struct uci_option *o) +static void uci_show_option(struct uci_option *o, bool quote) { printf("%s.%s.%s=", o->section->package->e.name, (cur_section_ref ? cur_section_ref : o->section->e.name), o->e.name); - uci_show_value(o); + uci_show_value(o, quote); } static void uci_show_section(struct uci_section *s) @@ -209,7 +227,7 @@ static void uci_show_section(struct uci_section *s) sname = (cur_section_ref ? cur_section_ref : s->e.name); printf("%s.%s=%s\n", cname, sname, s->type); uci_foreach_element(&s->options, e) { - uci_show_option(uci_to_option(e)); + uci_show_option(uci_to_option(e), true); } } @@ -251,8 +269,10 @@ static void uci_show_changes(struct uci_package *p) printf("%s%s.%s", prefix, p->e.name, h->section); if (e->name) printf(".%s", e->name); - if (h->cmd != UCI_CMD_REMOVE) - printf("%s%s", op, h->value); + if (h->cmd != UCI_CMD_REMOVE) { + printf("%s", op); + uci_print_value(stdout, h->value); + } printf("\n"); } } @@ -298,7 +318,7 @@ static int package_cmd(int cmd, char *tuple) uci_show_section(ptr.s); break; case UCI_TYPE_OPTION: - uci_show_option(ptr.o); + uci_show_option(ptr.o, true); break; default: /* should not happen */ @@ -440,7 +460,7 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv) printf("%s\n", ptr.s->type); break; case UCI_TYPE_OPTION: - uci_show_value(ptr.o); + uci_show_value(ptr.o, false); break; default: break;
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com> --- cli.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-)