X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fconfig.c;h=c0c12152b026e1a48ea75e3159cddf15720a81ba;hp=4fc8bc7e738ad54fb147f870ac0515c790c28449;hb=0572d1abbadf7b955f2788d04ca3d00f45963e6a;hpb=32b977a5336612a5c01f7426c4d165685fa8aca0 diff --git a/src/config.c b/src/config.c index 4fc8bc7..c0c1215 100644 --- a/src/config.c +++ b/src/config.c @@ -3,6 +3,9 @@ #include #include #include +#include +#include +#include #include #include @@ -98,6 +101,7 @@ enum { LEASE_ATTR_MAC, LEASE_ATTR_DUID, LEASE_ATTR_HOSTID, + LEASE_ATTR_LEASETIME, LEASE_ATTR_NAME, LEASE_ATTR_MAX }; @@ -108,6 +112,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 }, }; @@ -138,6 +143,30 @@ const struct uci_blob_param_list odhcpd_attr_list = { .params = odhcpd_attrs, }; +static int mkdir_p(char *dir, mode_t mask) +{ + char *l = strrchr(dir, '/'); + int ret; + + if (!l) + return 0; + + *l = '\0'; + + if (mkdir_p(dir, mask)) + return -1; + + *l = '/'; + + ret = mkdir(dir, mask); + if (ret && errno == EEXIST) + return 0; + + if (ret) + syslog(LOG_ERR, "mkdir(%s, %d) failed: %s\n", dir, mask, strerror(errno)); + + return ret; +} static struct interface* get_interface(const char *name) { @@ -215,6 +244,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 +321,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,16 +360,16 @@ 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; } const char *ifname = NULL; -#ifdef WITH_UBUS - if (overwrite || !iface->ifname[0]) - ifname = ubus_get_ifname(name); -#endif - if (overwrite) { if ((c = tb[IFACE_ATTR_IFNAME])) ifname = blobmsg_get_string(c); @@ -312,6 +377,11 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr ifname = blobmsg_get_string(c); } +#ifdef WITH_UBUS + if (overwrite || !iface->ifname[0]) + ifname = ubus_get_ifname(name); +#endif + if (!iface->ifname[0] && !ifname) goto err; @@ -330,22 +400,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 +427,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 +474,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 +497,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 +527,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 +565,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 +598,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); @@ -600,6 +653,12 @@ void odhcpd_reload(void) } } + if (config.dhcp_statefile) { + char *path = strdup(config.dhcp_statefile); + + mkdir_p(dirname(path), 0755); + free(path); + } #ifdef WITH_UBUS ubus_apply_network();