X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fconfig.c;h=44b049d409e313de90842b6b87bf8accab8a5864;hp=8f2c6bf71f7c9d321c0b30a071adad3e5281c83e;hb=44ca70ae6f0fb649cef47d9160ec1ee13e7844f1;hpb=1fcf0388078c7675187ff4f2f644aaf65138f261 diff --git a/src/config.c b/src/config.c index 8f2c6bf..44b049d 100644 --- a/src/config.c +++ b/src/config.c @@ -98,6 +98,7 @@ enum { LEASE_ATTR_MAC, LEASE_ATTR_DUID, LEASE_ATTR_HOSTID, + LEASE_ATTR_LEASETIME, LEASE_ATTR_NAME, LEASE_ATTR_MAX }; @@ -108,6 +109,7 @@ static const struct blobmsg_policy lease_attrs[LEASE_ATTR_MAX] = { [LEASE_ATTR_MAC] = { .name = "mac", .type = BLOBMSG_TYPE_STRING }, [LEASE_ATTR_DUID] = { .name = "duid", .type = BLOBMSG_TYPE_STRING }, [LEASE_ATTR_HOSTID] = { .name = "hostid", .type = BLOBMSG_TYPE_STRING }, + [LEASE_ATTR_LEASETIME] = { .name = "leasetime", .type = BLOBMSG_TYPE_STRING }, [LEASE_ATTR_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING }, }; @@ -215,6 +217,33 @@ static void set_config(struct uci_section *s) } } +static double parse_leasetime(struct blob_attr *c) { + char *val = blobmsg_get_string(c), *endptr = NULL; + double time = strcmp(val, "infinite") ? strtod(val, &endptr) : UINT32_MAX; + + if (time && endptr && endptr[0]) { + if (endptr[0] == 's') + time *= 1; + else if (endptr[0] == 'm') + time *= 60; + else if (endptr[0] == 'h') + time *= 3600; + else if (endptr[0] == 'd') + time *= 24 * 3600; + else if (endptr[0] == 'w') + time *= 7 * 24 * 3600; + else + goto err; + } + + if (time >= 60) + return time; + + return 0; + +err: + return -1; +} static int set_lease(struct uci_section *s) { @@ -265,6 +294,15 @@ static int set_lease(struct uci_section *s) goto err; } + if ((c = tb[LEASE_ATTR_LEASETIME])) { + double time = parse_leasetime(c); + if (time < 0) + goto err; + + if (time >= 60) + lease->dhcpv4_leasetime = time; + } + list_add(&lease->head, &leases); return 0; @@ -330,22 +368,9 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr iface->ignore = blobmsg_get_bool(c); if ((c = tb[IFACE_ATTR_LEASETIME])) { - char *val = blobmsg_get_string(c), *endptr; - double time = strtod(val, &endptr); - if (time && endptr[0]) { - if (endptr[0] == 's') - time *= 1; - else if (endptr[0] == 'm') - time *= 60; - else if (endptr[0] == 'h') - time *= 3600; - else if (endptr[0] == 'd') - time *= 24 * 3600; - else if (endptr[0] == 'w') - time *= 7 * 24 * 3600; - else - goto err; - } + double time = parse_leasetime(c); + if (time < 0) + goto err; if (time >= 60) iface->dhcpv4_leasetime = time;