return str_zone(label, buff, buff_len);
}
-static char* get_filename(
+char *conf_get_filename_txn(
conf_t *conf,
knot_db_txn_t *txn,
const knot_dname_t *zone,
const char *name)
{
- assert(name);
+ if (name == NULL) {
+ return NULL;
+ }
const char *end = name + strlen(name);
char out[1024] = "";
file = "%s.zone";
}
- return get_filename(conf, txn, zone, file);
+ return conf_get_filename_txn(conf, txn, zone, file);
}
char* conf_db_txn(
conf_mod_id_t *mod_id
);
+/*!
+ * Get the absolute path in zonefile-like manner for given name/template.
+ *
+ * \param[in] conf Configuration.
+ * \param[in] txn Configuration DB transaction.
+ * \param[in] zone Zone name.
+ * \param[in] name File name or template (like %s.zonediff).
+ *
+ * \return Absolute zone file path string pointer.
+ */
+char *conf_get_filename_txn(
+ conf_t *conf,
+ knot_db_txn_t *txn,
+ const knot_dname_t *zone,
+ const char *name
+);
+static inline char* conf_get_filename(
+ conf_t *conf,
+ const knot_dname_t *zone,
+ const char *name)
+{
+ return conf_get_filename_txn(conf, &conf->read_txn, zone, name);
+}
+
/*!
* Gets the absolute zone file path.
*
static const yp_item_t desc_external[] = {
{ C_ID, YP_TSTR, YP_VNONE, CONF_IO_FREF },
{ C_TIMEOUT, YP_TINT, YP_VINT = { 0, UINT32_MAX, 300, YP_STIME } },
- { C_DUMP_NEW, YP_TSTR, YP_VSTR = { "" } },
- { C_DUMP_REM, YP_TSTR, YP_VSTR = { "" } },
- { C_DUMP_ADD, YP_TSTR, YP_VSTR = { "" } },
+ { C_DUMP_NEW, YP_TSTR, YP_VNONE },
+ { C_DUMP_REM, YP_TSTR, YP_VNONE },
+ { C_DUMP_ADD, YP_TSTR, YP_VNONE },
{ NULL }
};
{
/* First: dump zone/diff files as/if configured. */
conf_val_t val = conf_id_get(conf, C_EXTERNAL, C_DUMP_NEW, ev_id);
- const char *f_new = conf_str(&val);
+ char *f_new = conf_get_filename(conf, update->zone->name, conf_str(&val));
val = conf_id_get(conf, C_EXTERNAL, C_DUMP_REM, ev_id);
- const char *f_rem = conf_str(&val);
+ char *f_rem = conf_get_filename(conf, update->zone->name, conf_str(&val));
val = conf_id_get(conf, C_EXTERNAL, C_DUMP_ADD, ev_id);
- const char *f_add = conf_str(&val);
+ char *f_add = conf_get_filename(conf, update->zone->name, conf_str(&val));
int ret = KNOT_EOK;
- if (*f_new != '\0' && ret == KNOT_EOK) {
+ if (f_new != NULL && ret == KNOT_EOK) {
ret = zonefile_write(f_new, update->new_cont, NULL);
}
- if (*f_rem != '\0' && ret == KNOT_EOK) {
+ if (f_rem != NULL && ret == KNOT_EOK) {
ret = dump_changeset_part(update, false, f_rem, "w");
}
- if (*f_add != '\0' && ret == KNOT_EOK) {
+ if (f_add != NULL && ret == KNOT_EOK) {
const char *mode = (strcmp(f_rem, f_add) == 0) ? "a" : "w";
ret = dump_changeset_part(update, true, f_add, mode);
}
+ free(f_new);
+ free(f_rem);
+ free(f_add);
+ if (ret != KNOT_EOK) {
+ log_zone_error(update->zone->name,
+ "failed to dump new zone version or zone diff for external validation (%s)",
+ knot_strerror(ret));
+ }
/* Second: wait on semaphore on user's interaction. */
pthread_mutex_lock(&update->zone->cu_lock);
{
knot_dname_t *z = knot_dname_from_str_alloc(zone);
- char *file = get_filename(conf(), NULL, z, name);
+ char *file = conf_get_filename_txn(conf(), NULL, z, name);
ok(file != NULL, "Get zonefile path for %s", zone);
if (file != NULL) {
ok(strcmp(file, ref) == 0, "Zonefile path compare %s", name);
{
knot_dname_t *z = knot_dname_from_str_alloc(zone);
- char *filename = get_filename(conf(), NULL, z, name);
+ char *filename = conf_get_filename_txn(conf(), NULL, z, name);
ok(filename == NULL, "Invalid name %s", name);
free(filename);