| leasetrigger | string| | Lease trigger script |
| hostsdir | string| | DHCPv4/v6 hostfile directory (one file per interface will be created) |
| loglevel |integer| 6 | Syslog level priority (0-7) |
-| piofolder |string | | Folder to store IPv6 prefix information (to detect stale prefixes, see RFC9096, §3.5) |
+| piodir |string | | Directory to store IPv6 prefix information (to detect stale prefixes, see RFC9096, §3.5) |
| enable_tz |bool | 1 | Toggle whether RFC4833 timezone information is sent to clients, if set in system |
.dhcp_statedir_fd = -1,
.dhcp_hostsdir = NULL,
.dhcp_hostsdir_fd = -1,
- .ra_piofolder = NULL,
- .ra_piofolder_fd = -1,
+ .ra_piodir = NULL,
+ .ra_piodir_fd = -1,
.uci_cfgdir = NULL,
.log_level = LOG_WARNING,
.log_level_cmdline = false,
ODHCPD_ATTR_LEASETRIGGER,
ODHCPD_ATTR_LOGLEVEL,
ODHCPD_ATTR_HOSTSDIR,
- ODHCPD_ATTR_PIOFOLDER,
+ ODHCPD_ATTR_PIODIR,
ODHCPD_ATTR_ENABLE_TZ,
ODHCPD_ATTR_MAX
};
[ODHCPD_ATTR_LEASETRIGGER] = { .name = "leasetrigger", .type = BLOBMSG_TYPE_STRING },
[ODHCPD_ATTR_LOGLEVEL] = { .name = "loglevel", .type = BLOBMSG_TYPE_INT32 },
[ODHCPD_ATTR_HOSTSDIR] = { .name = "hostsdir", .type = BLOBMSG_TYPE_STRING },
- [ODHCPD_ATTR_PIOFOLDER] = { .name = "piofolder", .type = BLOBMSG_TYPE_STRING },
+ [ODHCPD_ATTR_PIODIR] = { .name = "piodir", .type = BLOBMSG_TYPE_STRING },
[ODHCPD_ATTR_ENABLE_TZ] = { .name = "enable_tz", .type = BLOBMSG_TYPE_BOOL },
};
config.dhcp_hostsdir = strdup(blobmsg_get_string(c));
}
- if ((c = tb[ODHCPD_ATTR_PIOFOLDER])) {
- free(config.ra_piofolder);
- config.ra_piofolder = strdup(blobmsg_get_string(c));
+ if ((c = tb[ODHCPD_ATTR_PIODIR])) {
+ free(config.ra_piodir);
+ config.ra_piodir = strdup(blobmsg_get_string(c));
}
if ((c = tb[ODHCPD_ATTR_LEASETRIGGER])) {
statefiles_setup_dirfd(NULL, &config.dhcp_statedir_fd);
}
statefiles_setup_dirfd(config.dhcp_hostsdir, &config.dhcp_hostsdir_fd);
- statefiles_setup_dirfd(config.ra_piofolder, &config.ra_piofolder_fd);
+ statefiles_setup_dirfd(config.ra_piodir, &config.ra_piodir_fd);
vlist_flush(&lease_cfgs);
static inline bool statefiles_ra_pio_enabled(struct interface *iface)
{
- return config.ra_piofolder_fd >= 0 && iface->ra == MODE_SERVER && !iface->master;
+ return config.ra_piodir_fd >= 0 && iface->ra == MODE_SERVER && !iface->master;
}
static bool statefiles_ra_pio_time(json_object *slaac_json, time_t *slaac_time)
int fd;
sprintf(filename, "%s.%s", ODHCPD_PIO_FILE_PREFIX, iface->ifname);
- fd = openat(config.ra_piofolder_fd, filename, O_RDONLY | O_CLOEXEC);
+ fd = openat(config.ra_piodir_fd, filename, O_RDONLY | O_CLOEXEC);
if (fd < 0)
return NULL;
}
}
-static void statefiles_save_ra_pio_json(struct interface *iface, struct json_object *json)
-{
- FILE *fp;
-
- fp = statefiles_open_tmp_file(config.ra_piofolder_fd);
- if (!fp)
- return;
-
- if (json_object_to_fd(fileno(fp), json, JSON_C_TO_STRING_PLAIN)) {
- error("rfc9096: %s: json write error %s",
- iface->ifname,
- json_util_get_last_err());
- statefiles_finish_tmp_file(config.ra_piofolder_fd, &fp, NULL, NULL);
- return;
- }
-
- statefiles_finish_tmp_file(config.ra_piofolder_fd, &fp, ODHCPD_PIO_FILE_PREFIX, iface->ifname);
- iface->pio_update = false;
- warn("rfc9096: %s: piofile updated", iface->ifname);
-}
-
void statefiles_write_prefix_information(struct interface *iface)
{
struct json_object *json, *slaac_json;
char ipv6_str[INET6_ADDRSTRLEN];
time_t now;
+ FILE *fp;
if (!statefiles_ra_pio_enabled(iface))
return;
if (!iface->pio_update)
return;
+ fp = statefiles_open_tmp_file(config.ra_piodir_fd);
+ if (!fp)
+ return;
+
now = odhcpd_time();
json = json_object_new_object();
if (!json)
- return;
+ goto out;
slaac_json = json_object_new_array_ext(iface->pio_cnt);
- if (!slaac_json) {
- json_object_put(slaac_json);
- return;
- }
+ if (!slaac_json)
+ goto out;
json_object_object_add(json, JSON_SLAAC, slaac_json);
json_object_array_add(slaac_json, cur_pio_json);
}
- statefiles_save_ra_pio_json(iface, json);
+ if (json_object_to_fd(fileno(fp), json, JSON_C_TO_STRING_PLAIN)) {
+ error("rfc9096: %s: json write error %s",
+ iface->ifname,
+ json_util_get_last_err());
+ goto out;
+ }
+
+ statefiles_finish_tmp_file(config.ra_piodir_fd, &fp, ODHCPD_PIO_FILE_PREFIX, iface->ifname);
+ iface->pio_update = false;
+ warn("rfc9096: %s: piofile updated", iface->ifname);
+out:
json_object_put(json);
+ statefiles_finish_tmp_file(config.ra_piodir_fd, &fp, NULL, NULL);
}
static void statefiles_write_host(const char *ipbuf, const char *hostname, struct write_ctxt *ctxt)