X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=ucimap-example.c;h=0ad31d6a6ba74fa3a50aa8f29839a0c377b6bee0;hp=3fd3765ab2c92ba0cb8d5f8b6a531aaddd1e6940;hb=8ae8a7fc893e18676d6a35193f8a74c87ceb7b7f;hpb=99ae0f9196c8f8f334624c05a23e7e930be6c5eb diff --git a/ucimap-example.c b/ucimap-example.c index 3fd3765..0ad31d6 100644 --- a/ucimap-example.c +++ b/ucimap-example.c @@ -26,10 +26,10 @@ struct uci_network { const char *name; const char *proto; const char *ifname; - const char *ipaddr; + unsigned char ipaddr[4]; int test; bool enabled; - struct list_head aliases; + struct ucimap_list *aliases; }; struct uci_alias { @@ -40,6 +40,23 @@ struct uci_alias { }; static int +network_parse_ip(void *section, struct uci_optmap *om, union ucimap_data *data, const char *str) +{ + struct uci_network *net = section; + unsigned char *target = data->s; + unsigned int tmp[4]; + int i; + + if (sscanf(str, "%d.%d.%d.%d", &tmp[0], &tmp[1], &tmp[2], &tmp[3]) != 4) + return -1; + + for (i = 0; i < 4; i++) + target[i] = (char) tmp[i]; + + return 0; +} + +static int network_init_interface(struct uci_map *map, void *section, struct uci_section *s) { struct uci_network *net = section; @@ -82,46 +99,94 @@ network_add_alias(struct uci_map *map, void *section) return 0; } -struct uci_sectmap network_interface; -struct uci_sectmap network_alias; +struct my_optmap { + struct uci_optmap map; + int test; +}; + +static struct uci_sectmap network_interface; +static 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), +static struct my_optmap network_interface_options[] = { + { + .map = { + UCIMAP_OPTION(struct uci_network, proto), + .type = UCIMAP_STRING, + .name = "proto", + .data.s.maxlen = 32, + } + }, + { + .map = { + UCIMAP_OPTION(struct uci_network, ifname), + .type = UCIMAP_STRING, + .name = "ifname" + } + }, + { + .map = { + UCIMAP_OPTION(struct uci_network, ipaddr), + .type = UCIMAP_CUSTOM, + .name = "ipaddr", + .parse = network_parse_ip, + } + }, + { + .map = { + UCIMAP_OPTION(struct uci_network, enabled), + .type = UCIMAP_BOOL, + .name = "enabled", + } + }, + { + .map = { + UCIMAP_OPTION(struct uci_network, test), + .type = UCIMAP_INT, + .name = "test" + } + }, + { + .map = { + UCIMAP_OPTION(struct uci_network, aliases), + .type = UCIMAP_LIST | UCIMAP_SECTION, + .data.sm = &network_alias + } + } }; -struct uci_sectmap network_interface = { +static 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, + .init = network_init_interface, + .add = network_add_interface, + .options = &network_interface_options[0].map, .n_options = ARRAY_SIZE(network_interface_options), + .options_size = sizeof(struct my_optmap) }; -struct uci_optmap network_alias_options[] = { - OPTMAP_OPTION(UCIMAP_SECTION, struct uci_alias, interface, .data.sm = &network_interface), +static struct uci_optmap network_alias_options[] = { + { + UCIMAP_OPTION(struct uci_alias, interface), + .type = UCIMAP_SECTION, + .data.sm = &network_interface + } }; -struct uci_sectmap network_alias = { +static 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, + .init = network_init_alias, + .add = network_add_alias, .n_options = ARRAY_SIZE(network_alias_options), }; -struct uci_sectmap *network_smap[] = { +static struct uci_sectmap *network_smap[] = { &network_interface, &network_alias, }; -struct uci_map network_map = { +static struct uci_map network_map = { .sections = network_smap, .n_sections = ARRAY_SIZE(network_smap), }; @@ -134,6 +199,7 @@ int main(int argc, char **argv) struct list_head *p, *p2; struct uci_network *net; struct uci_alias *alias; + int i; INIT_LIST_HEAD(&ifs); ctx = uci_alloc_context(); @@ -148,19 +214,19 @@ int main(int argc, char **argv) printf("New network section '%s'\n" " type: %s\n" " ifname: %s\n" - " ipaddr: %s\n" + " ipaddr: %d.%d.%d.%d\n" " test: %d\n" " enabled: %s\n", net->name, net->proto, net->ifname, - net->ipaddr, + net->ipaddr[0], net->ipaddr[1], + net->ipaddr[2], net->ipaddr[3], net->test, (net->enabled ? "on" : "off")); - list_for_each(p2, &net->aliases) { - struct uci_listmap *li = list_entry(p2, struct uci_listmap, list); - alias = li->data.section; + for (i = 0; i < net->aliases->n_items; i++) { + alias = net->aliases->item[i].section; printf("New alias: %s\n", alias->name); } #if 0