#include <string.h>
#include <stdlib.h>
#include <unistd.h>
+#include <limits.h>
#include "ucimap.h"
struct uci_alloc {
{
union ucimap_data tdata = *data;
char *eptr = NULL;
+ long lval;
char *s;
int val;
ucimap_add_alloc(sd, s);
break;
case UCIMAP_BOOL:
- val = -1;
- if (strcmp(str, "on"))
+ if (!strcmp(str, "on"))
val = true;
- else if (strcmp(str, "1"))
+ else if (!strcmp(str, "1"))
val = true;
- else if (strcmp(str, "enabled"))
+ else if (!strcmp(str, "enabled"))
val = true;
- else if (strcmp(str, "off"))
+ else if (!strcmp(str, "off"))
val = false;
- else if (strcmp(str, "0"))
+ else if (!strcmp(str, "0"))
val = false;
- else if (strcmp(str, "disabled"))
+ else if (!strcmp(str, "disabled"))
val = false;
- if (val == -1)
+ else
return;
tdata.b = val;
break;
case UCIMAP_INT:
- val = strtol(str, &eptr, om->data.i.base);
+ lval = strtol(str, &eptr, om->data.i.base);
+ if (lval < INT_MIN || lval > INT_MAX)
+ return;
+
if (!eptr || *eptr == '\0')
- tdata.i = val;
+ tdata.i = (int) lval;
else
return;
break;
}
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;
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);
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;