- struct uci_option *tb[__OPT_MAX];
- struct uci_element *e;
- struct in_addr ina = {};
- const char *error = NULL;
- int netmask = 32;
- int i;
- struct static_proto_settings ps;
-
- memset(&ps, 0, sizeof(ps));
- uci_parse_section(s, opts, __OPT_MAX, tb);
-
- if (tb[OPT_NETMASK]) {
- if (!inet_aton(tb[OPT_NETMASK]->v.string, &ina)) {
- error = "INVALID_NETMASK";
- goto error;
- }
-
- netmask = 32 - fls(~(ntohl(ina.s_addr)));
- }
-
- if (tb[OPT_IPADDR]) {
- if (tb[OPT_IPADDR]->type == UCI_TYPE_STRING) {
- ps.n_v4 = 1;
- ps.v4 = alloca(sizeof(struct v4_addr));
- if (!parse_v4(tb[OPT_IPADDR]->v.string, ps.v4, netmask))
- goto invalid_addr;
- } else {
- i = 0;
- ps.n_v4 = count_list_entries(tb[OPT_IPADDR]);
- ps.v4 = alloca(sizeof(struct v4_addr) * ps.n_v4);
- uci_foreach_element(&tb[OPT_IPADDR]->v.list, e) {
- if (!parse_v4(e->name, &ps.v4[i++], netmask))
- goto invalid_addr;
- }
- }
- }