signconf_xml.c
Go to the documentation of this file.
/*
* Copyright (c) 2014 .SE (The Internet Infrastructure Foundation).
* Copyright (c) 2014 OpenDNSSEC AB (svb)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "log.h"
#include "str.h"
#include "clientpipe.h"
#include "duration.h"
#include "db/key_data.h"
#include "db/hsm_key.h"
#include "utils/kc_helper.h"
#include "signconf/signconf_xml.h"
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <limits.h>
#include <unistd.h>
static int signconf_xml_export(int sockfd, const policy_t* policy, zone_db_t* zone, int force);
int
signconf_export_zone(char const *zonename, db_connection_t* dbconn)
{
zone_db_t* zone;
int ret;
policy_t* policy;
zone = zone_db_new_get_by_name(dbconn, zonename);
if (!zone) {
ods_log_error("[signconf_export] Unable to fetch zone %s from"
" database", zonename);
return SIGNCONF_EXPORT_ERR_DATABASE;
}
policy = zone_db_get_policy(zone);
if (!policy) {
ods_log_error("[signconf_export] Unable to fetch policy for zone"
" %s from database", zonename);
zone_db_free(zone);
return SIGNCONF_EXPORT_ERR_DATABASE;
}
/* We always force. Since now it is scheduled per zone */
ret = signconf_xml_export(-1, policy, zone, 1);
policy_free(policy);
zone_db_free(zone);
return ret;
}
int signconf_export_all(int sockfd, const db_connection_t* connection, int force) {
zone_list_db_t* zone_list;
zone_db_t* zone;
int ret;
policy_t *policy = NULL;
int cmp;
int change = 0;
if (!connection) {
return SIGNCONF_EXPORT_ERR_ARGS;
}
if (!(zone_list = zone_list_db_new(connection))
|| zone_list_db_get(zone_list))
{
if (zone_list) {
zone_list_db_free(zone_list);
return SIGNCONF_EXPORT_ERR_DATABASE;
}
return SIGNCONF_EXPORT_ERR_MEMORY;
}
for (zone = zone_list_db_get_next(zone_list); zone; zone = zone_list_db_get_next(zone_list)) {
if (policy) {
/*
* If we already have a policy object; If policy_id compare fails
* or if they are not the same, free the policy object so we will
* later retrieve the correct policy
*/
if (db_value_cmp(policy_id(policy), zone_db_policy_id(zone), &cmp)
|| cmp)
{
policy_free(policy);
policy = NULL;
}
}
if (!policy) {
if (!(policy = zone_db_get_policy(zone))) {
zone_db_free(zone);
zone_list_db_free(zone_list);
return SIGNCONF_EXPORT_ERR_DATABASE;
}
}
ret = signconf_xml_export(sockfd, policy, zone, force);
if (ret == SIGNCONF_EXPORT_OK) {
change = 1;
}
else if (ret != SIGNCONF_EXPORT_NO_CHANGE) {
zone_db_free(zone);
zone_list_db_free(zone_list);
return ret;
}
zone_db_free(zone);
}
policy_free(policy);
zone_list_db_free(zone_list);
if (change) {
return SIGNCONF_EXPORT_OK;
}
return SIGNCONF_EXPORT_NO_CHANGE;
}
static int __free(char **p) {
if (!p || !*p) {
return 1;
}
free(*p);
*p = NULL;
return 0;
}
static int signconf_xml_export(int sockfd, const policy_t* policy, zone_db_t* zone, int force) {
char path[PATH_MAX];
xmlDocPtr doc;
xmlNodePtr root;
xmlNodePtr node;
xmlNodePtr node2;
xmlNodePtr node3;
xmlNodePtr node4;
xmlNodePtr node5;
xmlNodePtr keys;
duration_type* duration;
char* duration_text = NULL;
char text[1024];
key_data_list_t* key_data_list;
const key_data_t* key_data;
hsm_key_t* hsm_key;
int error;
if (!policy) {
return SIGNCONF_EXPORT_ERR_ARGS;
}
if (!zone) {
return SIGNCONF_EXPORT_ERR_ARGS;
}
if (!force && !zone_db_signconf_needs_writing(zone)) {
return SIGNCONF_EXPORT_NO_CHANGE;
}
if (snprintf(path, sizeof(path), "%s.new", zone_db_signconf_path(zone)) >= (int)sizeof(path)) {
ods_log_error("[signconf_export] Unable to write updated XML for zone %s, path to long!", zone_db_name(zone));
if (sockfd > -1) client_printf_err(sockfd, "Unable to write updated XML for zone %s, path to long!\n", zone_db_name(zone));
return SIGNCONF_EXPORT_ERR_MEMORY;
}
if (!(duration = duration_create())) {
ods_log_error("[signconf_export] Unable to process signconf for zone %s, memory allocation error!", zone_db_name(zone));
if (sockfd > -1) client_printf_err(sockfd, "Unable to process signconf for zone %s, memory allocation error!\n", zone_db_name(zone));
return SIGNCONF_EXPORT_ERR_MEMORY;
}
if (!(doc = xmlNewDoc((xmlChar*)"1.0"))
|| !(root = xmlNewNode(NULL, (xmlChar*)"SignerConfiguration"))
|| !(node = xmlNewChild(root, NULL, (xmlChar*)"Zone", NULL)))
{
ods_log_error("[signconf_export] Unable to create XML elements for zone %s, memory allocation error!", zone_db_name(zone));
if (sockfd > -1) client_printf_err(sockfd, "Unable to create XML elements for zone %s, memory allocation error!\n", zone_db_name(zone));
if (doc) {
xmlFreeDoc(doc);
}
duration_cleanup(duration);
return SIGNCONF_EXPORT_ERR_MEMORY;
}
xmlDocSetRootElement(doc, root);
error = 1;
if (!xmlNewProp(node, (xmlChar*)"name", (xmlChar*)zone_db_name(zone))
|| !(error = 26)
|| (policy_passthrough(policy) && !(node2 = xmlNewChild(node, NULL, (xmlChar*)"Passthrough", NULL)))
|| !(error = 2)
|| !(node2 = xmlNewChild(node, NULL, (xmlChar*)"Signatures", NULL))
|| !(error = 3)
|| duration_set_time(duration, policy_signatures_resign(policy))
|| !(duration_text = duration2string(duration))
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Resign", (xmlChar*)duration_text))
|| __free(&duration_text)
|| !(error = 4)
|| duration_set_time(duration, policy_signatures_refresh(policy))
|| !(duration_text = duration2string(duration))
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Refresh", (xmlChar*)duration_text))
|| __free(&duration_text)
|| !(error = 5)
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Validity", NULL))
|| !(error = 6)
|| duration_set_time(duration, policy_signatures_validity_default(policy))
|| !(duration_text = duration2string(duration))
|| !(node4 = xmlNewChild(node3, NULL, (xmlChar*)"Default", (xmlChar*)duration_text))
|| __free(&duration_text)
|| !(error = 7)
|| duration_set_time(duration, policy_signatures_validity_denial(policy))
|| !(duration_text = duration2string(duration))
|| !(node4 = xmlNewChild(node3, NULL, (xmlChar*)"Denial", (xmlChar*)duration_text))
|| __free(&duration_text)
|| !(error = 8)
|| (policy_signatures_validity_keyset(policy) > 0 ?
duration_set_time(duration, policy_signatures_validity_keyset(policy))
|| !(duration_text = duration2string(duration))
|| !(node4 = xmlNewChild(node3, NULL, (xmlChar*)"Keyset", (xmlChar*)duration_text))
|| __free(&duration_text)
|| !(error = 100) : 0)
|| duration_set_time(duration, policy_signatures_jitter(policy))
|| !(duration_text = duration2string(duration))
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Jitter", (xmlChar*)duration_text))
|| __free(&duration_text)
|| !(error = 9)
|| duration_set_time(duration, policy_signatures_inception_offset(policy))
|| !(duration_text = duration2string(duration))
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"InceptionOffset", (xmlChar*)duration_text))
|| __free(&duration_text)
|| !(error = 10)
|| (policy_signatures_max_zone_ttl(policy)
&& (duration_set_time(duration, policy_signatures_max_zone_ttl(policy))
|| !(duration_text = duration2string(duration))
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"MaxZoneTTL", (xmlChar*)duration_text))
|| __free(&duration_text)))
|| !(error = 11)
|| !(node2 = xmlNewChild(node, NULL, (xmlChar*)"Denial", NULL))
|| !(error = 12)
|| (policy_denial_type(policy) == POLICY_DENIAL_TYPE_NSEC
&& !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"NSEC", NULL)))
|| !(error = 13)
|| (policy_denial_type(policy) == POLICY_DENIAL_TYPE_NSEC3
&& (!(node3 = xmlNewChild(node2, NULL, (xmlChar*)"NSEC3", NULL))
|| !(error = 14)
|| (policy_denial_ttl(policy)
&& (duration_set_time(duration, policy_denial_ttl(policy))
|| !(duration_text = duration2string(duration))
|| !(node4 = xmlNewChild(node3, NULL, (xmlChar*)"TTL", (xmlChar*)duration_text))
|| __free(&duration_text)))
|| !(error = 15)
|| (policy_denial_optout(policy)
&& !(node4 = xmlNewChild(node3, NULL, (xmlChar*)"OptOut", NULL)))
|| !(error = 16)
|| !(node4 = xmlNewChild(node3, NULL, (xmlChar*)"Hash", NULL))
|| !(error = 17)
|| snprintf(text, sizeof(text), "%u", policy_denial_algorithm(policy)) >= (int)sizeof(text)
|| !(node5 = xmlNewChild(node4, NULL, (xmlChar*)"Algorithm", (xmlChar*)text))
|| !(error = 18)
|| snprintf(text, sizeof(text), "%u", policy_denial_iterations(policy)) >= (int)sizeof(text)
|| !(node5 = xmlNewChild(node4, NULL, (xmlChar*)"Iterations", (xmlChar*)text))
|| !(error = 19)
|| !(node5 = xmlNewChild(node4, NULL, (xmlChar*)"Salt", (xmlChar*)policy_denial_salt(policy)))))
|| !(error = 20)
|| !(keys = xmlNewChild(node, NULL, (xmlChar*)"Keys", NULL))
|| !(error = 21)
|| duration_set_time(duration, policy_keys_ttl(policy))
|| !(duration_text = duration2string(duration))
|| !(node3 = xmlNewChild(keys, NULL, (xmlChar*)"TTL", (xmlChar*)duration_text))
|| __free(&duration_text)
|| !(error = 22)
|| !(node2 = xmlNewChild(node, NULL, (xmlChar*)"SOA", NULL))
|| !(error = 23)
|| duration_set_time(duration, policy_zone_soa_ttl(policy))
|| !(duration_text = duration2string(duration))
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"TTL", (xmlChar*)duration_text))
|| __free(&duration_text)
|| !(error = 24)
|| duration_set_time(duration, policy_zone_soa_minimum(policy))
|| !(duration_text = duration2string(duration))
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Minimum", (xmlChar*)duration_text))
|| __free(&duration_text)
|| !(error = 25)
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Serial", (xmlChar*)policy_zone_soa_serial_text(policy)))
)
{
ods_log_error("[signconf_export] Unable to create XML elements for zone %s! [%d]", zone_db_name(zone), error);
if (sockfd > -1) client_printf_err(sockfd, "Unable to create XML elements for zone %s!\n", zone_db_name(zone));
__free(&duration_text);
duration_cleanup(duration);
xmlFreeDoc(doc);
return SIGNCONF_EXPORT_ERR_XML;
}
__free(&duration_text);
duration_cleanup(duration);
if (!(key_data_list = zone_db_get_keys(zone))) {
ods_log_error("[signconf_export] Unable to get keys for zone %s!", zone_db_name(zone));
if (sockfd > -1) client_printf_err(sockfd, "Unable to get keys for zone %s!\n", zone_db_name(zone));
xmlFreeDoc(doc);
return SIGNCONF_EXPORT_ERR_DATABASE;
}
for (key_data = key_data_list_next(key_data_list); key_data; key_data = key_data_list_next(key_data_list)) {
if (!(hsm_key = key_data_get_hsm_key(key_data))) {
ods_log_error("[signconf_export] Unable to get HSM key from database for zone %s!", zone_db_name(zone));
if (sockfd > -1) client_printf_err(sockfd, "Unable to get HSM key from database for zone %s!\n", zone_db_name(zone));
key_data_list_free(key_data_list);
xmlFreeDoc(doc);
return SIGNCONF_EXPORT_ERR_DATABASE;
}
error = 100;
if (!(node2 = xmlNewChild(keys, NULL, (xmlChar*)"Key", NULL))
|| !(error = 101)
|| (key_data_role(key_data) == KEY_DATA_ROLE_ZSK
&& !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Flags", (xmlChar*)"256")))
|| !(error = 102)
|| (key_data_role(key_data) != KEY_DATA_ROLE_ZSK
&& !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Flags", (xmlChar*)"257")))
|| !(error = 103)
|| snprintf(text, sizeof(text), "%u", key_data_algorithm(key_data)) >= (int)sizeof(text)
|| !(error = 104)
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Algorithm", (xmlChar*)text))
|| !(error = 105)
|| !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Locator",(xmlChar*)hsm_key_locator(hsm_key)))
|| !(error = 106)
|| (key_data_active_ksk(key_data)
&& (key_data_role(key_data) == KEY_DATA_ROLE_KSK
|| key_data_role(key_data) == KEY_DATA_ROLE_CSK)
&& !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"KSK", NULL)))
|| !(error = 107)
|| (key_data_active_zsk(key_data)
&& (key_data_role(key_data) == KEY_DATA_ROLE_ZSK
|| key_data_role(key_data) == KEY_DATA_ROLE_CSK)
&& !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"ZSK", NULL)))
|| !(error = 108)
|| (key_data_publish(key_data)
&& !(node3 = xmlNewChild(node2, NULL, (xmlChar*)"Publish", NULL)))
/* TODO:
* What about <Deactivate/> ?
*/
)
{
ods_log_error("[signconf_export] Unable to create key XML elements for zone %s! [%d]", zone_db_name(zone), error);
if (sockfd > -1) client_printf_err(sockfd, "Unable to create key XML elements for zone %s!\n", zone_db_name(zone));
hsm_key_free(hsm_key);
key_data_list_free(key_data_list);
xmlFreeDoc(doc);
return SIGNCONF_EXPORT_ERR_XML;
}
hsm_key_free(hsm_key);
}
key_data_list_free(key_data_list);
unlink(path);
if (xmlSaveFormatFileEnc(path, doc, "UTF-8", 1) == -1) {
ods_log_error("[signconf_export] Unable to write signconf for zone %s, LibXML error!", zone_db_name(zone));
if (sockfd > -1) client_printf_err(sockfd, "Unable to write signconf for zone %s, LibXML error!\n", zone_db_name(zone));
xmlFreeDoc(doc);
return SIGNCONF_EXPORT_ERR_FILE;
}
xmlFreeDoc(doc);
if (check_rng(path, OPENDNSSEC_SCHEMA_DIR "/signconf.rng", 0)) {
ods_log_error("[signconf_export] Unable to validate the exported signconf XML for zone %s!", zone_db_name(zone));
if (sockfd > -1) client_printf_err(sockfd, "Unable to validate the exported signconf XML for zone %s!\n", zone_db_name(zone));
return SIGNCONF_EXPORT_ERR_XML;
}
if (rename(path, zone_db_signconf_path(zone))) {
ods_log_error("[signconf_export] Unable to write signconf for zone %s, rename failed!", zone_db_name(zone));
if (sockfd > -1) client_printf_err(sockfd, "Unable to write signconf for zone %s, rename failed!\n", zone_db_name(zone));
unlink(path);
return SIGNCONF_EXPORT_ERR_FILE;
}
zone_db_set_signconf_needs_writing(zone, 0);
zone_db_update(zone);
return SIGNCONF_EXPORT_OK;
}
db_value_cmp
int db_value_cmp(const db_value_t *value_a, const db_value_t *value_b, int *result)
Definition db_value.c:102
hsm_key_free
void hsm_key_free(hsm_key_t *hsm_key)
Definition hsm_key.c:286
hsm_key_locator
const char * hsm_key_locator(const hsm_key_t *hsm_key)
Definition hsm_key.c:520
hsm_key.h
check_rng
int check_rng(const char *filename, const char *rngfilename, int verbose)
Definition kc_helper.c:92
kc_helper.h
key_data_active_ksk
unsigned int key_data_active_ksk(const key_data_t *key_data)
Definition key_data.c:751
key_data_get_hsm_key
hsm_key_t * key_data_get_hsm_key(const key_data_t *key_data)
Definition key_data.c:649
key_data_publish
unsigned int key_data_publish(const key_data_t *key_data)
Definition key_data.c:743
key_data_list_free
void key_data_list_free(key_data_list_t *key_data_list)
Definition key_data.c:1694
key_data_active_zsk
unsigned int key_data_active_zsk(const key_data_t *key_data)
Definition key_data.c:735
key_data_list_next
const key_data_t * key_data_list_next(key_data_list_t *key_data_list)
Definition key_data.c:2359
key_data_algorithm
unsigned int key_data_algorithm(const key_data_t *key_data)
Definition key_data.c:687
key_data.h
key_data_role
key_data_role
Definition key_data.h:40
KEY_DATA_ROLE_ZSK
@ KEY_DATA_ROLE_ZSK
Definition key_data.h:43
KEY_DATA_ROLE_KSK
@ KEY_DATA_ROLE_KSK
Definition key_data.h:42
KEY_DATA_ROLE_CSK
@ KEY_DATA_ROLE_CSK
Definition key_data.h:44
policy_denial_iterations
unsigned int policy_denial_iterations(const policy_t *policy)
Definition policy.c:933
policy_denial_optout
unsigned int policy_denial_optout(const policy_t *policy)
Definition policy.c:901
policy_signatures_validity_denial
unsigned int policy_signatures_validity_denial(const policy_t *policy)
Definition policy.c:869
policy_signatures_resign
unsigned int policy_signatures_resign(const policy_t *policy)
Definition policy.c:829
policy_keys_ttl
unsigned int policy_keys_ttl(const policy_t *policy)
Definition policy.c:965
policy_zone_soa_ttl
unsigned int policy_zone_soa_ttl(const policy_t *policy)
Definition policy.c:1013
policy_zone_soa_minimum
unsigned int policy_zone_soa_minimum(const policy_t *policy)
Definition policy.c:1021
policy_passthrough
unsigned int policy_passthrough(const policy_t *policy)
Definition policy.c:1085
policy_denial_salt
const char * policy_denial_salt(const policy_t *policy)
Definition policy.c:949
policy_signatures_refresh
unsigned int policy_signatures_refresh(const policy_t *policy)
Definition policy.c:837
policy_denial_ttl
unsigned int policy_denial_ttl(const policy_t *policy)
Definition policy.c:909
policy_signatures_max_zone_ttl
unsigned int policy_signatures_max_zone_ttl(const policy_t *policy)
Definition policy.c:885
policy_id
const db_value_t * policy_id(const policy_t *policy)
Definition policy.c:805
policy_signatures_jitter
unsigned int policy_signatures_jitter(const policy_t *policy)
Definition policy.c:845
policy_signatures_inception_offset
unsigned int policy_signatures_inception_offset(const policy_t *policy)
Definition policy.c:853
policy_zone_soa_serial_text
const char * policy_zone_soa_serial_text(const policy_t *policy)
Definition policy.c:1029
policy_denial_algorithm
unsigned int policy_denial_algorithm(const policy_t *policy)
Definition policy.c:925
policy_signatures_validity_default
unsigned int policy_signatures_validity_default(const policy_t *policy)
Definition policy.c:861
policy_free
void policy_free(policy_t *policy)
Definition policy.c:518
policy_signatures_validity_keyset
unsigned int policy_signatures_validity_keyset(const policy_t *policy)
Definition policy.c:877
policy_denial_type
policy_denial_type
Definition policy.h:40
POLICY_DENIAL_TYPE_NSEC
@ POLICY_DENIAL_TYPE_NSEC
Definition policy.h:42
POLICY_DENIAL_TYPE_NSEC3
@ POLICY_DENIAL_TYPE_NSEC3
Definition policy.h:43
signconf_export_zone
int signconf_export_zone(char const *zonename, db_connection_t *dbconn)
Definition signconf_xml.c:57
signconf_export_all
int signconf_export_all(int sockfd, const db_connection_t *connection, int force)
Definition signconf_xml.c:84
signconf_xml.h
SIGNCONF_EXPORT_ERR_DATABASE
#define SIGNCONF_EXPORT_ERR_DATABASE
Definition signconf_xml.h:52
SIGNCONF_EXPORT_ERR_MEMORY
#define SIGNCONF_EXPORT_ERR_MEMORY
Definition signconf_xml.h:56
SIGNCONF_EXPORT_NO_CHANGE
#define SIGNCONF_EXPORT_NO_CHANGE
Definition signconf_xml.h:64
SIGNCONF_EXPORT_ERR_ARGS
#define SIGNCONF_EXPORT_ERR_ARGS
Definition signconf_xml.h:44
SIGNCONF_EXPORT_ERR_FILE
#define SIGNCONF_EXPORT_ERR_FILE
Definition signconf_xml.h:60
SIGNCONF_EXPORT_OK
#define SIGNCONF_EXPORT_OK
Definition signconf_xml.h:40
SIGNCONF_EXPORT_ERR_XML
#define SIGNCONF_EXPORT_ERR_XML
Definition signconf_xml.h:48
db_connection
Definition db_connection.h:46
hsm_key
Definition hsm_key.h:79
key_data_list
Definition key_data.h:479
key_data
Definition key_data.h:68
policy
Definition policy.h:60
zone_db
Definition zone_db.h:46
zone_list_db
Definition zone_db.h:466
zone_db_free
void zone_db_free(zone_db_t *zone)
Definition zone_db.c:325
zone_db_set_signconf_needs_writing
int zone_db_set_signconf_needs_writing(zone_db_t *zone, unsigned int signconf_needs_writing)
Definition zone_db.c:959
zone_db_signconf_path
const char * zone_db_signconf_path(const zone_db_t *zone)
Definition zone_db.c:798
zone_db_policy_id
const db_value_t * zone_db_policy_id(const zone_db_t *zone)
Definition zone_db.c:736
zone_db_get_policy
policy_t * zone_db_get_policy(const zone_db_t *zone)
Definition zone_db.c:744
zone_db_name
const char * zone_db_name(const zone_db_t *zone)
Definition zone_db.c:782
zone_list_db_get_next
zone_db_t * zone_list_db_get_next(zone_list_db_t *zone_list)
Definition zone_db.c:2669
zone_list_db_new
zone_list_db_t * zone_list_db_new(const db_connection_t *connection)
Definition zone_db.c:1946
zone_db_update
int zone_db_update(zone_db_t *zone)
Definition zone_db.c:1589
zone_list_db_get
int zone_list_db_get(zone_list_db_t *zone_list)
Definition zone_db.c:2363
zone_db_signconf_needs_writing
unsigned int zone_db_signconf_needs_writing(const zone_db_t *zone)
Definition zone_db.c:790
zone_db_new_get_by_name
zone_db_t * zone_db_new_get_by_name(const db_connection_t *connection, const char *name)
Definition zone_db.c:1569
zone_list_db_free
void zone_list_db_free(zone_list_db_t *zone_list)
Definition zone_db.c:1989
zone_db_get_keys
key_data_list_t * zone_db_get_keys(const zone_db_t *zone)
Definition zone_db_ext.c:56