sizeof(cfg_netprefix_t));
}
+static void
+free_duration(cfg_obj_t *obj) {
+ isc_mem_put(obj->mctx, obj->value.duration, sizeof(isccfg_duration_t));
+}
+
static void
copy_duration(cfg_obj_t *to, const cfg_obj_t *from) {
- to->value.duration = from->value.duration;
+ to->value.duration = isc_mem_get(to->mctx, sizeof(isccfg_duration_t));
+ memmove(to->value.duration, from->value.duration,
+ sizeof(isccfg_duration_t));
}
static void
cfg_rep_t cfg_rep_void = { "void", free_noop, copy_noop };
cfg_rep_t cfg_rep_fixedpoint = { "fixedpoint", free_noop, copy_uint32 };
cfg_rep_t cfg_rep_percentage = { "percentage", free_noop, copy_uint32 };
-cfg_rep_t cfg_rep_duration = { "duration", free_noop, copy_duration };
+cfg_rep_t cfg_rep_duration = { "duration", free_duration, copy_duration };
/*
* Configuration type definitions.
void
cfg_print_duration(cfg_printer_t *pctx, const cfg_obj_t *obj) {
char buf[CFG_DURATION_MAXLEN];
- char *str;
+ char *str = NULL;
const char *indicators = "YMWDHMS";
int count, i;
int durationlen[7] = { 0 };
- isccfg_duration_t duration;
+ isccfg_duration_t *duration = NULL;
/*
* D ? The duration has a date part.
* T ? The duration has a time part.
duration = obj->value.duration;
/* If this is not an ISO 8601 duration, just print it as a number. */
- if (!duration.iso8601) {
- cfg_print_rawuint(pctx, duration.parts[6]);
+ if (!duration->iso8601) {
+ cfg_print_rawuint(pctx, duration->parts[6]);
return;
}
str = &buf[1];
count = 2;
for (i = 0; i < 6; i++) {
- if (duration.parts[i] > 0) {
- durationlen[i] = 1 + numlen(duration.parts[i]);
+ if (duration->parts[i] > 0) {
+ durationlen[i] = 1 + numlen(duration->parts[i]);
if (i < 4) {
D = true;
} else {
* non-zero, or if all the other parts are also zero. In the latter
* case this function will print "PT0S".
*/
- if (duration.parts[6] > 0 ||
- (!D && !duration.parts[4] && !duration.parts[5]))
+ if (duration->parts[6] > 0 ||
+ (!D && !duration->parts[4] && !duration->parts[5]))
{
- durationlen[6] = 1 + numlen(duration.parts[6]);
+ durationlen[6] = 1 + numlen(duration->parts[6]);
T = true;
count += durationlen[6];
}
* We don't check here if weeks and other time indicator are
* used mutually exclusively.
*/
- if (duration.parts[i] > 0) {
+ if (duration->parts[i] > 0) {
snprintf(str, durationlen[i] + 2, "%u%c",
- (uint32_t)duration.parts[i], indicators[i]);
+ (uint32_t)duration->parts[i], indicators[i]);
str += durationlen[i];
}
if (i == 3 && T) {
}
}
/* Special case for seconds. */
- if (duration.parts[6] > 0 ||
- (!D && !duration.parts[4] && !duration.parts[5]))
+ if (duration->parts[6] > 0 ||
+ (!D && !duration->parts[4] && !duration->parts[5]))
{
snprintf(str, durationlen[6] + 2, "%u%c",
- (uint32_t)duration.parts[6], indicators[6]);
+ (uint32_t)duration->parts[6], indicators[6]);
}
cfg_print_chars(pctx, buf, strlen(buf));
}
void
cfg_print_duration_or_unlimited(cfg_printer_t *pctx, const cfg_obj_t *obj) {
- isccfg_duration_t duration;
+ isccfg_duration_t *duration = NULL;
REQUIRE(pctx != NULL);
REQUIRE(VALID_CFGOBJ(obj));
duration = obj->value.duration;
- if (duration.unlimited) {
+ if (duration->unlimited) {
cfg_print_cstr(pctx, "unlimited");
} else {
cfg_print_duration(pctx, obj);
cfg_obj_asduration(const cfg_obj_t *obj) {
REQUIRE(VALID_CFGOBJ(obj));
REQUIRE(obj->type->rep == &cfg_rep_duration);
- return isccfg_duration_toseconds(&(obj->value.duration));
+ return isccfg_duration_toseconds(obj->value.duration);
}
static isc_result_t
cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx), pctx->line,
&cfg_type_duration, &obj);
- obj->value.duration = duration;
+ obj->value.duration = isc_mem_get(obj->mctx, sizeof(isccfg_duration_t));
+ *obj->value.duration = duration;
*ret = obj;
return ISC_R_SUCCESS;
cfg_obj_create(pctx->mctx, cfg_parser_currentfile(pctx),
pctx->line, &cfg_type_duration, &obj);
- obj->value.duration = duration;
+ obj->value.duration = isc_mem_get(obj->mctx,
+ sizeof(isccfg_duration_t));
+ *obj->value.duration = duration;
*ret = obj;
return ISC_R_SUCCESS;
}