X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fconfig.c;h=372ea6782701630f0b9b02da12e1f22b06996273;hp=74ab3dd67e5a7ab834650c2ba69803aea0313f32;hb=3af23ad72888393a863d7be545d1bd5af99ca442;hpb=c5cb11650a1f7ff321b4ac190c8be7f533cf9636 diff --git a/src/config.c b/src/config.c index 74ab3dd..372ea67 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; @@ -295,6 +333,11 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr return -1; strncpy(iface->name, name, sizeof(iface->name) - 1); + + /* Default settings */ + iface->managed = 1; + iface->learn_routes = true; + list_add(&iface->head, &interfaces); overwrite = true; } @@ -330,22 +373,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; @@ -370,7 +400,7 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr unsigned rem; blobmsg_for_each_attr(cur, c, rem) { - if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING || !blobmsg_check_attr(cur, NULL)) + if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING || !blobmsg_check_attr(cur, false)) continue; iface->upstream = realloc(iface->upstream, @@ -417,7 +447,7 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr unsigned rem; blobmsg_for_each_attr(cur, c, rem) { - if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING || !blobmsg_check_attr(cur, NULL)) + if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING || !blobmsg_check_attr(cur, false)) continue; struct in_addr addr4; @@ -440,7 +470,7 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr iface->always_rewrite_dns = true; blobmsg_for_each_attr(cur, c, rem) { - if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING || !blobmsg_check_attr(cur, NULL)) + if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING || !blobmsg_check_attr(cur, false)) continue; struct in_addr addr4; @@ -470,7 +500,7 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr unsigned rem; blobmsg_for_each_attr(cur, c, rem) { - if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING || !blobmsg_check_attr(cur, NULL)) + if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING || !blobmsg_check_attr(cur, false)) continue; uint8_t buf[256]; @@ -508,8 +538,6 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr if ((c = tb[IFACE_ATTR_RA_MANAGEMENT])) iface->managed = blobmsg_get_u32(c); - else if (overwrite) - iface->managed = 1; if ((c = tb[IFACE_ATTR_RA_OFFLINK])) iface->ra_not_onlink = blobmsg_get_bool(c); @@ -543,8 +571,6 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr if ((c = tb[IFACE_ATTR_NDPROXY_ROUTING])) iface->learn_routes = blobmsg_get_bool(c); - else if (overwrite) - iface->learn_routes = true; if ((c = tb[IFACE_ATTR_NDPROXY_SLAVE])) iface->external = blobmsg_get_bool(c); @@ -671,10 +697,10 @@ void odhcpd_reload(void) i->ndp = (master && master->ndp == RELAYD_RELAY) ? RELAYD_RELAY : RELAYD_DISABLED; - setup_router_interface(i, true); - setup_dhcpv6_interface(i, true); - setup_ndp_interface(i, true); - setup_dhcpv4_interface(i, true); + setup_router_interface(i, !i->ignore); + setup_dhcpv6_interface(i, !i->ignore); + setup_ndp_interface(i, !i->ignore); + setup_dhcpv4_interface(i, !i->ignore); } else { close_interface(i); }