X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=ucimap.c;h=021c270e4786b15284e4fc9aedf4a36a1c2b60f5;hp=d4dc05fe3d8781cc5986b6f2df256422049643ac;hb=82a71ad8d80c1d5831916efff87cb03b77096032;hpb=6d75ac9588e1aa3a85dd85d121978e9d99531ac4 diff --git a/ucimap.c b/ucimap.c index d4dc05f..021c270 100644 --- a/ucimap.c +++ b/ucimap.c @@ -410,10 +410,8 @@ ucimap_set_changed(struct ucimap_section_data *sd, void *field) } int -ucimap_store_section(struct uci_map *map, struct uci_package *p, void *section) +ucimap_store_section(struct uci_map *map, struct uci_package *p, struct ucimap_section_data *sd) { - char *sptr = (char *)section - sizeof(struct ucimap_section_data); - struct ucimap_section_data *sd = (struct ucimap_section_data *) sptr; struct uci_sectionmap *sm = sd->sm; struct uci_section *s = NULL; struct uci_optmap *om; @@ -434,13 +432,14 @@ ucimap_store_section(struct uci_map *map, struct uci_package *p, void *section) ucimap_foreach_option(sm, om) { union ucimap_data *data; static char buf[32]; - const char *str = NULL; + char *str = NULL; + i++; if (ucimap_is_list(om->type)) continue; data = ucimap_get_data(sd, om); - if (!TEST_BIT(sd->cmap, i)) + if (!TEST_BIT(sd->cmap, i - 1)) continue; ucimap_fill_ptr(&ptr, s, om->name); @@ -456,17 +455,32 @@ ucimap_store_section(struct uci_map *map, struct uci_package *p, void *section) sprintf(buf, "%d", !!data->b); str = buf; break; + case UCIMAP_CUSTOM: + break; default: continue; } + if (om->format) { + union ucimap_data tdata, *data; + + data = ucimap_get_data(sd, om); + if (ucimap_is_custom(om->type)) { + tdata.s = (char *)data; + data = &tdata; + } + + if (om->format(ucimap_section_ptr(sd), om, data, &str) < 0) + continue; + } + if (!str) + continue; ptr.value = str; ret = uci_set(s->package->ctx, &ptr); if (ret) return ret; - CLR_BIT(sd->cmap, i); - i++; + CLR_BIT(sd->cmap, i - 1); } return 0;