X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=ucimap-example.c;h=3fd3765ab2c92ba0cb8d5f8b6a531aaddd1e6940;hp=4309a76d7680503af92a76f3184eed975eb305b5;hb=00d91c8ca4a5d35d5c3706d0042f0e57cefa3d12;hpb=d788264ddc370ffb5f9fe1f451ac6845da0dfda0 diff --git a/ucimap-example.c b/ucimap-example.c index 4309a76..3fd3765 100644 --- a/ucimap-example.c +++ b/ucimap-example.c @@ -17,8 +17,11 @@ #include #include +struct list_head ifs; + struct uci_network { struct list_head list; + struct list_head alias; const char *name; const char *proto; @@ -26,46 +29,96 @@ struct uci_network { const char *ipaddr; int test; bool enabled; + struct list_head aliases; +}; + +struct uci_alias { + struct list_head list; + + const char *name; + struct uci_network *interface; }; static int -network_init_section(struct uci_map *map, void *section, struct uci_section *s) +network_init_interface(struct uci_map *map, void *section, struct uci_section *s) { struct uci_network *net = section; INIT_LIST_HEAD(&net->list); + INIT_LIST_HEAD(&net->alias); net->name = s->e.name; net->test = -1; return 0; } static int -network_add_section(struct uci_map *map, void *section) +network_init_alias(struct uci_map *map, void *section, struct uci_section *s) +{ + struct uci_alias *alias = section; + + INIT_LIST_HEAD(&alias->list); + alias->name = s->e.name; + return 0; +} + +static int +network_add_interface(struct uci_map *map, void *section) { struct uci_network *net = section; - struct uci_network **nptr = map->priv; - *nptr = net; + list_add(&net->list, &ifs); + return 0; } -struct uci_optmap network_smap_options[] = { +static int +network_add_alias(struct uci_map *map, void *section) +{ + struct uci_alias *a = section; + + if (a->interface) + list_add(&a->list, &a->interface->alias); + + return 0; +} + +struct uci_sectmap network_interface; +struct uci_sectmap network_alias; + +struct uci_optmap network_interface_options[] = { OPTMAP_OPTION(UCIMAP_STRING, struct uci_network, proto, .data.s.maxlen = 32), OPTMAP_OPTION(UCIMAP_STRING, struct uci_network, ifname), OPTMAP_OPTION(UCIMAP_STRING, struct uci_network, ipaddr), OPTMAP_OPTION(UCIMAP_BOOL, struct uci_network, enabled), OPTMAP_OPTION(UCIMAP_INT, struct uci_network, test), + OPTMAP_OPTION(UCIMAP_LIST | UCIMAP_SECTION, struct uci_network, aliases, .data.sm = &network_alias), }; -struct uci_sectmap network_smap[] = { - { - .type = "interface", - .options = network_smap_options, - .alloc_len = sizeof(struct uci_network), - .init_section = network_init_section, - .add_section = network_add_section, - .n_options = ARRAY_SIZE(network_smap_options), - } +struct uci_sectmap network_interface = { + .type = "interface", + .options = network_interface_options, + .alloc_len = sizeof(struct uci_network), + .init_section = network_init_interface, + .add_section = network_add_interface, + .n_options = ARRAY_SIZE(network_interface_options), +}; + +struct uci_optmap network_alias_options[] = { + OPTMAP_OPTION(UCIMAP_SECTION, struct uci_alias, interface, .data.sm = &network_interface), +}; + +struct uci_sectmap network_alias = { + .type = "alias", + .options = network_alias_options, + .alloc_len = sizeof(struct uci_network), + .init_section = network_init_alias, + .add_section = network_add_alias, + .n_options = ARRAY_SIZE(network_alias_options), +}; + +struct uci_sectmap *network_smap[] = { + &network_interface, + &network_alias, }; struct uci_map network_map = { @@ -78,20 +131,21 @@ int main(int argc, char **argv) { struct uci_context *ctx; struct uci_package *pkg; - struct uci_network *net = NULL; + struct list_head *p, *p2; + struct uci_network *net; + struct uci_alias *alias; + INIT_LIST_HEAD(&ifs); ctx = uci_alloc_context(); ucimap_init(&network_map); uci_load(ctx, "network", &pkg); - network_map.priv = &net; ucimap_parse(&network_map, pkg); - if (!net) - goto done; - - printf("New network section '%s'\n" + list_for_each(p, &ifs) { + net = list_entry(p, struct uci_network, list); + printf("New network section '%s'\n" " type: %s\n" " ifname: %s\n" " ipaddr: %s\n" @@ -104,10 +158,19 @@ int main(int argc, char **argv) net->test, (net->enabled ? "on" : "off")); - net->ipaddr = "2.3.4.5"; - ucimap_set_changed(net, &net->ipaddr); - ucimap_store_section(&network_map, pkg, net); - uci_save(ctx, pkg); + list_for_each(p2, &net->aliases) { + struct uci_listmap *li = list_entry(p2, struct uci_listmap, list); + alias = li->data.section; + printf("New alias: %s\n", alias->name); + } +#if 0 + net->ipaddr = "2.3.4.5"; + ucimap_set_changed(net, &net->ipaddr); + ucimap_store_section(&network_map, pkg, net); + uci_save(ctx, pkg); +#endif + } + done: ucimap_cleanup(&network_map);