X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=ucimap-example.c;h=baea5500b9791b9de684382991939c97d9c6017c;hp=0e3f7a4a69eeca0046159593ffc1a17803421ac9;hb=7b75c2af80f2ea8a73f4718223011ad778904faf;hpb=95967daea5d1be988b4d25280fcea9ae2b6c52cd diff --git a/ucimap-example.c b/ucimap-example.c index 0e3f7a4..baea550 100644 --- a/ucimap-example.c +++ b/ucimap-example.c @@ -20,19 +20,21 @@ struct list_head ifs; struct uci_network { + struct ucimap_section_data map; struct list_head list; struct list_head alias; const char *name; const char *proto; const char *ifname; - const char *ipaddr; + unsigned char ipaddr[4]; int test; bool enabled; struct ucimap_list *aliases; }; struct uci_alias { + struct ucimap_section_data map; struct list_head list; const char *name; @@ -40,6 +42,35 @@ 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 = (unsigned char *) 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_format_ip(void *sction, struct uci_optmap *om, union ucimap_data *data, char **str) +{ + static char buf[16]; + unsigned char *ip = (unsigned char *) data->s; + + sprintf(buf, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); + *str = buf; + + return 0; +} + +static int network_init_interface(struct uci_map *map, void *section, struct uci_section *s) { struct uci_network *net = section; @@ -82,13 +113,21 @@ network_add_alias(struct uci_map *map, void *section) return 0; } +static struct ucimap_section_data * +network_allocate(struct uci_map *map, struct uci_sectionmap *sm, struct uci_section *s) +{ + struct uci_network *p = malloc(sizeof(struct uci_network)); + memset(p, 0, sizeof(struct uci_network)); + return &p->map; +} + struct my_optmap { struct uci_optmap map; int test; }; -static struct uci_sectmap network_interface; -static struct uci_sectmap network_alias; +static struct uci_sectionmap network_interface; +static struct uci_sectionmap network_alias; static struct my_optmap network_interface_options[] = { { @@ -109,8 +148,10 @@ static struct my_optmap network_interface_options[] = { { .map = { UCIMAP_OPTION(struct uci_network, ipaddr), - .type = UCIMAP_STRING, + .type = UCIMAP_CUSTOM, .name = "ipaddr", + .parse = network_parse_ip, + .format = network_format_ip, } }, { @@ -136,11 +177,12 @@ static struct my_optmap network_interface_options[] = { } }; -static struct uci_sectmap network_interface = { +static struct uci_sectionmap network_interface = { + UCIMAP_SECTION(struct uci_network, map), .type = "interface", - .alloc_len = sizeof(struct uci_network), - .init_section = network_init_interface, - .add_section = network_add_interface, + .alloc = network_allocate, + .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) @@ -154,16 +196,16 @@ static struct uci_optmap network_alias_options[] = { } }; -static struct uci_sectmap network_alias = { +static struct uci_sectionmap network_alias = { + UCIMAP_SECTION(struct uci_alias, map), .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), }; -static struct uci_sectmap *network_smap[] = { +static struct uci_sectionmap *network_smap[] = { &network_interface, &network_alias, }; @@ -196,13 +238,14 @@ 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")); @@ -211,9 +254,9 @@ int main(int argc, char **argv) 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); + memcpy(net->ipaddr, "\x01\x03\x04\x05", 4); + ucimap_set_changed(&net->map, &net->ipaddr); + ucimap_store_section(&network_map, pkg, &net->map); uci_save(ctx, pkg); #endif }